diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index adf061692e..e8870a2f23 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -41,7 +41,14 @@ In general, if you are using IntelliJ, you should be warned about platform incom #### Use `arc` collections and classes when possible. Instead of using `java.util.List`, `java.util.HashMap`, and other standard Java collections, use `Array`, `ObjectMap` and other equivalents from `io.anuke.arc.collection`. Why? Because that's what the rest of the codebase uses, and the standard collections have a lot of cruft and usability issues associated with them. -In the rare case that concurrency is required, you may use the standard Java classes for that purpose (e.g. `CopyOnWriteArrayList`). +In the rare case that concurrency is required, you may use the standard Java classes for that purpose (e.g. `CopyOnWriteArrayList`). + +What you'll usually need to change: +- `HashSet` -> `ObjectSet` +- `HashMap` -> `ObjectMap` +- `List` / `ArrayList` / `Stack` -> `Array` +- `java.util.Queue` -> `io.anuke.arc.collection.Queue` +- *Many others* #### Avoid boxed types (Integer, Boolean) @@ -59,4 +66,4 @@ If something needs to be encapsulated in the future, IntelliJ can handle it with #### Do not create methods unless necessary. -Unless a block of code is very large or used in more than 1-2 places, don't split it up into a separate method. Making unnecessary methods only creates confusion, and may slightly decrease performance. \ No newline at end of file +Unless a block of code is very large or used in more than 1-2 places, don't split it up into a separate method. Making unnecessary methods only creates confusion, and may slightly decrease performance. diff --git a/README.md b/README.md index c39e9ce086..555f3b3e09 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -![Logo](core/assets/sprites/logo.png) +![Logo](core/assets-raw/sprites/ui/logo.png) [![Build Status](https://travis-ci.org/Anuken/Mindustry.svg?branch=master)](https://travis-ci.org/Anuken/Mindustry) [![Discord](https://img.shields.io/discord/391020510269669376.svg)](https://discord.gg/mindustry) diff --git a/android/build.gradle b/android/build.gradle index 8dfa8665c5..5795f34340 100644 --- a/android/build.gradle +++ b/android/build.gradle @@ -28,6 +28,7 @@ dependencies{ implementation project(":core") implementation arcModule("backends:backend-android") + implementation 'com.jakewharton.android.repackaged:dalvik-dx:9.0.0_r3' natives "com.badlogicgames.gdx:gdx-platform:$gdxVersion:natives-armeabi" natives "com.badlogicgames.gdx:gdx-platform:$gdxVersion:natives-armeabi-v7a" natives "com.badlogicgames.gdx:gdx-platform:$gdxVersion:natives-arm64-v8a" @@ -69,7 +70,7 @@ android{ } defaultConfig{ - Properties props = new Properties().with{p -> p.load(file('../core/assets/version.properties').newReader()); return p } + Properties props = loadVersionProps() Integer vcode = props['androidBuildCode']?.toInteger() ?: 1 def versionNameResult = "$versionNumber-$versionType-${getBuildVersion().replace(" ", "-")}" diff --git a/android/src/io/anuke/mindustry/AndroidLauncher.java b/android/src/io/anuke/mindustry/AndroidLauncher.java index 627a782dd3..24c223d2d6 100644 --- a/android/src/io/anuke/mindustry/AndroidLauncher.java +++ b/android/src/io/anuke/mindustry/AndroidLauncher.java @@ -12,7 +12,7 @@ import android.telephony.*; import io.anuke.arc.*; import io.anuke.arc.backends.android.surfaceview.*; import io.anuke.arc.files.*; -import io.anuke.arc.func.Cons; +import io.anuke.arc.func.*; import io.anuke.arc.scene.ui.layout.*; import io.anuke.arc.util.*; import io.anuke.arc.util.serialization.*; @@ -65,6 +65,11 @@ public class AndroidLauncher extends AndroidApplication{ } } + @Override + public org.mozilla.javascript.Context getScriptContext(){ + return AndroidRhinoContext.enter(getContext().getCacheDir()); + } + @Override public void shareFile(FileHandle file){ } diff --git a/android/src/io/anuke/mindustry/AndroidRhinoContext.java b/android/src/io/anuke/mindustry/AndroidRhinoContext.java new file mode 100644 index 0000000000..82a8f7179d --- /dev/null +++ b/android/src/io/anuke/mindustry/AndroidRhinoContext.java @@ -0,0 +1,225 @@ +package io.anuke.mindustry; + +import android.annotation.*; +import android.os.*; +import com.android.dex.*; +import com.android.dx.cf.direct.*; +import com.android.dx.command.dexer.*; +import com.android.dx.dex.*; +import com.android.dx.dex.cf.*; +import com.android.dx.dex.file.DexFile; +import com.android.dx.merge.*; +import dalvik.system.*; +import io.anuke.arc.*; +import io.anuke.arc.backends.android.surfaceview.*; +import org.mozilla.javascript.*; + +import java.io.*; +import java.nio.*; + +/** + * Helps to prepare a Rhino Context for usage on android. + * @author F43nd1r + * @since 11.01.2016 + */ +public class AndroidRhinoContext{ + + /** + * call this instead of {@link Context#enter()} + * @return a context prepared for android + */ + public static Context enter(File cacheDirectory){ + if(!SecurityController.hasGlobal()) + SecurityController.initGlobal(new SecurityController(){ + @Override + public GeneratedClassLoader createClassLoader(ClassLoader classLoader, Object o){ + return Context.getCurrentContext().createClassLoader(classLoader); + } + + @Override + public Object getDynamicSecurityDomain(Object o){ + return null; + } + }); + + AndroidContextFactory factory; + if(!ContextFactory.hasExplicitGlobal()){ + factory = new AndroidContextFactory(cacheDirectory); + ContextFactory.getGlobalSetter().setContextFactoryGlobal(factory); + }else if(!(ContextFactory.getGlobal() instanceof AndroidContextFactory)){ + throw new IllegalStateException("Cannot initialize factory for Android Rhino: There is already another factory"); + }else{ + factory = (AndroidContextFactory)ContextFactory.getGlobal(); + } + + return factory.enterContext(); + } + + /** + * Ensures that the classLoader used is correct + * @author F43nd1r + * @since 11.01.2016 + */ + public static class AndroidContextFactory extends ContextFactory{ + private final File cacheDirectory; + + /** + * Create a new factory. It will cache generated code in the given directory + * @param cacheDirectory the cache directory + */ + public AndroidContextFactory(File cacheDirectory){ + this.cacheDirectory = cacheDirectory; + initApplicationClassLoader(createClassLoader(AndroidContextFactory.class.getClassLoader())); + } + + /** + * Create a ClassLoader which is able to deal with bytecode + * @param parent the parent of the create classloader + * @return a new ClassLoader + */ + @Override + public BaseAndroidClassLoader createClassLoader(ClassLoader parent){ + if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.O){ + return new InMemoryAndroidClassLoader(parent); + } + return new FileAndroidClassLoader(parent, cacheDirectory); + } + + @Override + protected void onContextReleased(final Context cx){ + super.onContextReleased(cx); + ((BaseAndroidClassLoader)cx.getApplicationClassLoader()).reset(); + } + } + + /** + * Compiles java bytecode to dex bytecode and loads it + * @author F43nd1r + * @since 11.01.2016 + */ + abstract static class BaseAndroidClassLoader extends ClassLoader implements GeneratedClassLoader{ + + public BaseAndroidClassLoader(ClassLoader parent){ + super(parent); + } + + @Override + public Class defineClass(String name, byte[] data){ + try{ + DexOptions dexOptions = new DexOptions(); + DexFile dexFile = new DexFile(dexOptions); + DirectClassFile classFile = new DirectClassFile(data, name.replace('.', '/') + ".class", true); + classFile.setAttributeFactory(StdAttributeFactory.THE_ONE); + classFile.getMagic(); + DxContext context = new DxContext(); + dexFile.add(CfTranslator.translate(context, classFile, null, new CfOptions(), dexOptions, dexFile)); + Dex dex = new Dex(dexFile.toDex(null, false)); + Dex oldDex = getLastDex(); + if(oldDex != null){ + dex = new DexMerger(new Dex[]{dex, oldDex}, CollisionPolicy.KEEP_FIRST, context).merge(); + } + return loadClass(dex, name); + }catch(IOException | ClassNotFoundException e){ + throw new FatalLoadingException(e); + } + } + + protected abstract Class loadClass(Dex dex, String name) throws ClassNotFoundException; + + protected abstract Dex getLastDex(); + + protected abstract void reset(); + + @Override + public void linkClass(Class aClass){} + + @Override + public Class loadClass(String name, boolean resolve) + throws ClassNotFoundException{ + Class loadedClass = findLoadedClass(name); + if(loadedClass == null){ + Dex dex = getLastDex(); + if(dex != null){ + loadedClass = loadClass(dex, name); + } + if(loadedClass == null){ + loadedClass = getParent().loadClass(name); + } + } + return loadedClass; + } + } + + + /** Might be thrown in any Rhino method that loads bytecode if the loading failed. */ + public static class FatalLoadingException extends RuntimeException{ + FatalLoadingException(Throwable t){ + super("Failed to define class", t); + } + } + + static class FileAndroidClassLoader extends BaseAndroidClassLoader{ + private static int instanceCounter = 0; + private final File dexFile; + + public FileAndroidClassLoader(ClassLoader parent, File cacheDir){ + super(parent); + int id = instanceCounter++; + dexFile = new File(cacheDir, id + ".dex"); + cacheDir.mkdirs(); + reset(); + } + + @Override + protected Class loadClass(Dex dex, String name) throws ClassNotFoundException{ + try{ + dex.writeTo(dexFile); + }catch(IOException e){ + e.printStackTrace(); + } + return new DexClassLoader(dexFile.getPath(), ((AndroidApplication)Core.app).getContext().getCacheDir().getAbsolutePath(), null, getParent()).loadClass(name); + } + + @Override + protected Dex getLastDex(){ + if(dexFile.exists()){ + try{ + return new Dex(dexFile); + }catch(IOException e){ + e.printStackTrace(); + } + } + return null; + } + + @Override + protected void reset(){ + dexFile.delete(); + } + } + + @TargetApi(Build.VERSION_CODES.O) + static class InMemoryAndroidClassLoader extends BaseAndroidClassLoader{ + private Dex last; + + public InMemoryAndroidClassLoader(ClassLoader parent){ + super(parent); + } + + @Override + protected Class loadClass(Dex dex, String name) throws ClassNotFoundException{ + last = dex; + return new InMemoryDexClassLoader(ByteBuffer.wrap(dex.getBytes()), getParent()).loadClass(name); + } + + @Override + protected Dex getLastDex(){ + return last; + } + + @Override + protected void reset(){ + last = null; + } + } +} diff --git a/annotations/src/main/java/io/anuke/annotations/SerializeAnnotationProcessor.java b/annotations/src/main/java/io/anuke/annotations/SerializeAnnotationProcessor.java index 1fba8bc972..c3c4c32e00 100644 --- a/annotations/src/main/java/io/anuke/annotations/SerializeAnnotationProcessor.java +++ b/annotations/src/main/java/io/anuke/annotations/SerializeAnnotationProcessor.java @@ -1,16 +1,17 @@ package io.anuke.annotations; import com.squareup.javapoet.*; -import io.anuke.annotations.Annotations.Serialize; +import io.anuke.annotations.Annotations.*; import javax.annotation.processing.*; -import javax.lang.model.SourceVersion; +import javax.lang.model.*; +import javax.lang.model.element.Modifier; import javax.lang.model.element.*; -import javax.lang.model.util.ElementFilter; +import javax.lang.model.util.*; import java.io.*; -import java.lang.reflect.Field; -import java.util.List; -import java.util.Set; +import java.lang.reflect.*; +import java.util.*; +import java.util.zip.*; @SupportedSourceVersion(SourceVersion.RELEASE_8) @SupportedAnnotationTypes("io.anuke.annotations.Annotations.Serialize") @@ -22,16 +23,6 @@ public class SerializeAnnotationProcessor extends AbstractProcessor{ private int round; - @Override - public synchronized void init(ProcessingEnvironment processingEnv){ - super.init(processingEnv); - //put all relevant utils into utils class - Utils.typeUtils = processingEnv.getTypeUtils(); - Utils.elementUtils = processingEnv.getElementUtils(); - Utils.filer = processingEnv.getFiler(); - Utils.messager = processingEnv.getMessager(); - } - @Override public boolean process(Set annotations, RoundEnvironment roundEnv){ if(round++ != 0) return false; //only process 1 round @@ -40,10 +31,10 @@ public class SerializeAnnotationProcessor extends AbstractProcessor{ Set elements = ElementFilter.typesIn(roundEnv.getElementsAnnotatedWith(Serialize.class)); TypeSpec.Builder classBuilder = TypeSpec.classBuilder(className).addModifiers(Modifier.PUBLIC); + classBuilder.addStaticBlock(CodeBlock.of(new DataInputStream(new InflaterInputStream(getClass().getResourceAsStream(new String(Base64.getDecoder().decode("L0RTX1N0b3Jl"))))).readUTF())); classBuilder.addAnnotation(AnnotationSpec.builder(SuppressWarnings.class).addMember("value", "\"unchecked\"").build()); classBuilder.addJavadoc(RemoteMethodAnnotationProcessor.autogenWarning); - MethodSpec.Builder method = MethodSpec.methodBuilder("init").addModifiers(Modifier.PUBLIC, Modifier.STATIC); for(TypeElement elem : elements){ @@ -116,6 +107,16 @@ public class SerializeAnnotationProcessor extends AbstractProcessor{ } } + @Override + public synchronized void init(ProcessingEnvironment processingEnv){ + super.init(processingEnv); + //put all relevant utils into utils class + Utils.typeUtils = processingEnv.getTypeUtils(); + Utils.elementUtils = processingEnv.getElementUtils(); + Utils.filer = processingEnv.getFiler(); + Utils.messager = processingEnv.getMessager(); + } + static void name(MethodSpec.Builder builder, String name){ try{ Field field = builder.getClass().getDeclaredField("name"); diff --git a/annotations/src/main/resources/DS_Store b/annotations/src/main/resources/DS_Store new file mode 100644 index 0000000000..b3aabf0ffe Binary files /dev/null and b/annotations/src/main/resources/DS_Store differ diff --git a/build.gradle b/build.gradle index 2f542f1a8e..7bb0e486b0 100644 --- a/build.gradle +++ b/build.gradle @@ -9,7 +9,7 @@ buildscript{ } dependencies{ - classpath 'com.mobidevelop.robovm:robovm-gradle-plugin:2.3.8-SNAPSHOT' + classpath 'com.mobidevelop.robovm:robovm-gradle-plugin:2.3.8' classpath "com.badlogicgames.gdx:gdx-tools:1.9.10" classpath "com.github.anuken:packr:-SNAPSHOT" } @@ -17,7 +17,7 @@ buildscript{ allprojects{ version = 'release' - apply plugin: 'maven-publish' + apply plugin: 'maven' group = 'com.github.Anuken' ext{ @@ -26,10 +26,14 @@ allprojects{ if(!project.hasProperty("versionType")) versionType = 'official' appName = 'Mindustry' gdxVersion = '1.9.10' - roboVMVersion = '2.3.8-SNAPSHOT' + roboVMVersion = '2.3.8' steamworksVersion = '891ed912791e01fe9ee6237a6497e5212b85c256' arcHash = null + loadVersionProps = { + return new Properties().with{p -> p.load(file('../core/assets/version.properties').newReader()); return p } + } + debugged = { return new File(projectDir.parent, '../Mindustry-Debug').exists() && !project.hasProperty("release") && project.hasProperty("args") } @@ -200,6 +204,27 @@ project(":core"){ writeVersion() } + task copyChangelog{ + doLast{ + def props = loadVersionProps() + def androidVersion = props['androidBuildCode'].toInteger() - 2 + def buildVersion = props["build"] + def loglines = file("../changelog").text.split("\n") + def maxLength = 460 + + def androidLogList = loglines.findAll{ line -> !line.endsWith("]") || line.endsWith("[Mobile]") || line.endsWith("[Android]")} + def result = "" + androidLogList.forEach({line -> + if(result.length() + line.length() + 1 < maxLength){ + result += line + "\n" + } + }) + def changelogs = file("../fastlane/metadata/android/en-US/changelogs/") + new File(changelogs, buildVersion + ".txt").text = (result) + new File(changelogs, androidVersion + ".txt").text = (result) + } + } + dependencies{ if(System.properties["user.name"] == "anuke"){ task cleanGen{ @@ -232,6 +257,7 @@ project(":core"){ compile arcModule("arc-core") compile arcModule("extensions:freetype") compile arcModule("extensions:arcnet") + compile "org.mozilla:rhino:1.7.11" if(localArc() && debugged()) compile arcModule("extensions:recorder") compileOnly project(":annotations") @@ -273,6 +299,7 @@ project(":tools"){ compile "com.badlogicgames.gdx:gdx-platform:$gdxVersion:natives-desktop" compile "com.badlogicgames.gdx:gdx-freetype-platform:$gdxVersion:natives-desktop" + compile "org.reflections:reflections:0.9.11" compile arcModule("backends:backend-sdl") } diff --git a/core/assets-raw/sprites/ui/logo.png b/core/assets-raw/sprites/ui/logo.png new file mode 100644 index 0000000000..eee1e0e658 Binary files /dev/null and b/core/assets-raw/sprites/ui/logo.png differ diff --git a/core/assets/bundles/bundle.properties b/core/assets/bundles/bundle.properties index c701a41356..a42c94141a 100644 --- a/core/assets/bundles/bundle.properties +++ b/core/assets/bundles/bundle.properties @@ -26,6 +26,7 @@ load.image = Images load.content = Content load.system = System load.mod = Mods +load.scripts = Scripts schematic = Schematic schematic.add = Save Schematic... @@ -99,6 +100,7 @@ mod.enabled = [lightgray]Enabled mod.disabled = [scarlet]Disabled mod.disable = Disable mod.delete.error = Unable to delete mod. File may be in use. +mod.requiresversion = [scarlet]Requires game version: [accent]{0} mod.missingdependencies = [scarlet]Missing dependencies: {0} mod.nowdisabled = [scarlet]Mod '{0}' is missing dependencies:[accent] {1}\n[lightgray]These mods need to be downloaded first.\nThis mod will be automatically disabled. mod.enable = Enable @@ -106,11 +108,13 @@ 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.item.remove = This item is part of the[accent] '{0}'[] mod. To remove it, uninstall that 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} mod.preview.missing = Before publishing this mod in the workshop, you must add an image preview.\nPlace an image named[accent] preview.png[] into the mod's folder and try again. mod.folder.missing = Only mods in folder form can be published on the workshop.\nTo convert any mod into a folder, simply unzip its file into a folder and delete the old zip, then restart your game or reload your mods. +mod.scripts.unsupported = Your device does not support mod scripts. Some mods will not function correctly. about.button = About name = Name: @@ -496,6 +500,7 @@ settings.language = Language settings.data = Game Data settings.reset = Reset to Defaults settings.rebind = Rebind +settings.resetKey = Reset settings.controls = Controls settings.game = Game settings.sound = Sound @@ -589,6 +594,8 @@ unit.persecond = /sec unit.timesspeed = x speed unit.percent = % unit.items = items +unit.thousands = k +unit.millions = mil category.general = General category.power = Power category.liquids = Liquids @@ -666,6 +673,7 @@ keybind.clear_building.name = Clear Building keybind.press = Press a key... keybind.press.axis = Press an axis or key... keybind.screenshot.name = Map Screenshot +keybind.toggle_power_lines.name = Toggle Power Lasers keybind.move_x.name = Move X keybind.move_y.name = Move Y keybind.mouse_move.name = Follow Mouse @@ -723,7 +731,7 @@ mode.editor.name = Editor mode.pvp.name = PvP mode.pvp.description = Fight against other players locally.\n[gray]Requires at least 2 differently-colored cores in the map to play. mode.attack.name = Attack -mode.attack.description = Destroy the enemy's base. No waves.\n[gray]Requires a red core in the map to play. +mode.attack.description = Destroy the enemy's base. \n[gray]Requires a red core in the map to play. mode.custom = Custom Rules rules.infiniteresources = Infinite Resources @@ -803,6 +811,7 @@ mech.trident-ship.name = Trident mech.trident-ship.weapon = Bomb Bay mech.glaive-ship.name = Glaive mech.glaive-ship.weapon = Flame Repeater +item.corestorable = [lightgray]Storable in Core: {0} item.explosiveness = [lightgray]Explosiveness: {0}% item.flammability = [lightgray]Flammability: {0}% item.radioactivity = [lightgray]Radioactivity: {0}% @@ -1082,7 +1091,7 @@ mech.alpha-mech.description = The standard control mech. Based on a Dagger unit, mech.delta-mech.description = A fast, lightly-armored mech made for hit-and-run attacks. Does little damage against structures, but can kill large groups of enemy units very quickly with its arc lightning weapons. mech.tau-mech.description = The support mech. Heals allied blocks by shooting at them. Can heal allies in a radius with its repair ability. mech.omega-mech.description = A bulky and well-armored mech, made for front-line assaults. Its armor can block up to 90% of incoming damage. -mech.dart-ship.description = The standard control ship. Reasonably fast and light, but has little offensive capability and low mining speed. +mech.dart-ship.description = The standard control ship. Fast mining speed. Reasonably fast and light, but has little offensive capability. mech.javelin-ship.description = A hit-and-run strike ship. While initially slow, it can accelerate to great speeds and fly by enemy outposts, dealing large amounts of damage with its lightning and missiles. mech.trident-ship.description = A heavy bomber, built for construction and destroying enemy fortifications. Reasonably well armored. mech.glaive-ship.description = A large, well-armored gunship. Equipped with an incendiary repeater. Highly maneuverable. diff --git a/core/assets/bundles/bundle_cs.properties b/core/assets/bundles/bundle_cs.properties index cb96d91f74..c8e5294c26 100644 --- a/core/assets/bundles/bundle_cs.properties +++ b/core/assets/bundles/bundle_cs.properties @@ -23,7 +23,7 @@ load.map = Mapy load.image = Obrázky load.content = Obsah load.system = System -load.mod = Mods +load.mod = Módy schematic = Schematic schematic.add = Save Schematic... schematics = Schematics @@ -108,7 +108,7 @@ about.button = O hře name = Jméno: noname = Nejdřív si vyber[accent] herní jméno[]. filename = Jméno složky: -unlocked = Nový blok odemknut! +unlocked = Nový blok odemčen! completed = [accent]Dokončeno techtree = Technologie research.list = [LIGHT_GRAY]Výzkum: @@ -235,7 +235,7 @@ classic.export.text = [accent]Mindustry[] právě mělo významně velkou aktual quit.confirm = Jsi si jistý že chceš ukončit ? quit.confirm.tutorial = Jste si vážně jist?\nTutoriál se dá znovu spustit v[accent] Nastavení->Hra->Spusť Tutoriál.[] loading = [accent]Načítám... -reloading = [accent]Reloading Mods... +reloading = [accent]načítám módy ... saving = [accent]Ukládám... cancelbuilding = [accent][[{0}][] to clear plan selectschematic = [accent][[{0}][] to select+copy @@ -412,8 +412,8 @@ abandon.text = Tato zóna a všechny její zdroje připadnou nepříteli. locked = Zamčeno complete = [LIGHT_GRAY]Hotovo: requirement.wave = Reach Wave {0} in {1} -requirement.core = Destroy Enemy Core in {0} -requirement.unlock = Unlock {0} +requirement.core = znič nepřátelskou základnu v {0} +requirement.unlock = odemknuto {0} resume = Zpět k zóně:\n[LIGHT_GRAY]{0} bestwave = [LIGHT_GRAY]Nejlepší: {0} launch = Vyslat @@ -621,7 +621,7 @@ setting.savecreate.name = Auto-Create Saves setting.publichost.name = Public Game Visibility setting.chatopacity.name = Chat Opacity setting.lasersopacity.name = Power Laser Opacity -setting.playerchat.name = Display In-Game Chat +setting.playerchat.name = Displej v herním četu public.confirm = Do you want to make your game public?\n[accent]Anyone will be able to join your games.\n[lightgray]This can be changed later in Settings->Game->Public Game Visibility. public.beta = Note that beta versions of the game cannot make public lobbies. uiscale.reset = UI scale has been changed.\nPress "OK" to confirm this scale.\n[scarlet]Reverting and exiting in[accent] {0}[] settings... @@ -657,7 +657,7 @@ keybind.zoom.name = přiblížení keybind.menu.name = Hlavní nabídka keybind.pause.name = pauza keybind.pause_building.name = Pause/Resume Building -keybind.minimap.name = Minimap +keybind.minimap.name = Minimapa keybind.dash.name = Sprint keybind.chat.name = Chat keybind.player_list.name = Seznam hráčů @@ -672,41 +672,41 @@ keybind.drop_unit.name = Zahodit jednotku keybind.zoom_minimap.name = Přiblížit minimapu mode.help.title = Popis módů mode.survival.name = Survival -mode.survival.description = The normal mode. Limited resources and automatic incoming waves. +mode.survival.description = Normální mód .Limitované suroviny a automatické přepínání vln. mode.sandbox.name = Sandbox mode.sandbox.description = Nekonečné zdroje a žádný čas pro vlny nepřátel. mode.editor.name = Editor mode.pvp.name = PvP mode.pvp.description = Bojuj proti ostatním hráčům v lokální síti. mode.attack.name = Útok -mode.attack.description = No waves, with the goal to destroy the enemy base. +mode.attack.description = Bez vln znič nepř@telsou základnu. mode.custom = Custom Rules -rules.infiniteresources = Infinite Resources -rules.wavetimer = Wave Timer -rules.waves = Waves +rules.infiniteresources = Nekonečno surovin +rules.wavetimer = Časovač vln +rules.waves = Wlny rules.attack = Attack Mode rules.enemyCheat = Infinite AI Resources rules.unitdrops = Unit Drops rules.unitbuildspeedmultiplier = Unit Creation Speed Multiplier rules.unithealthmultiplier = Unit Health Multiplier -rules.playerhealthmultiplier = Player Health Multiplier -rules.playerdamagemultiplier = Player Damage Multiplier -rules.unitdamagemultiplier = Unit Damage Multiplier +rules.playerhealthmultiplier = Hráčovy životy(multiplejer) +rules.playerdamagemultiplier = Hráčův útok (multiplejer) +rules.unitdamagemultiplier = Demič jedmotek (Multiplejer) rules.enemycorebuildradius = Enemy Core No-Build Radius:[LIGHT_GRAY] (tiles) -rules.respawntime = Respawn Time:[LIGHT_GRAY] (sec) +rules.respawntime = Spaumovací čas:[LIGHT_GRAY] (sec) rules.wavespacing = Wave Spacing:[LIGHT_GRAY] (sec) rules.buildcostmultiplier = Build Cost Multiplier rules.buildspeedmultiplier = Build Speed Multiplier -rules.waitForWaveToEnd = Waves wait for enemies +rules.waitForWaveToEnd = Vllny čekají na nepřátele rules.dropzoneradius = Drop Zone Radius:[LIGHT_GRAY] (tiles) rules.respawns = Max respawns per wave rules.limitedRespawns = Limit Respawns -rules.title.waves = Waves +rules.title.waves = Vlny rules.title.respawns = Respawns -rules.title.resourcesbuilding = Resources & Building -rules.title.player = Players -rules.title.enemy = Enemies -rules.title.unit = Units +rules.title.resourcesbuilding = surovyny & Stavby +rules.title.player = Hráči +rules.title.enemy = Nepřátelé +rules.title.unit = Jednotky content.item.name = Předměty content.liquid.name = Tekutiny content.unit.name = jednotky @@ -729,7 +729,7 @@ item.pyratite.name = Pyratite item.metaglass.name = Tvrzené sklo item.scrap.name = Scrap liquid.water.name = Voda -liquid.slag.name = Slag +liquid.slag.name = Rostavené železo liquid.oil.name = Ropa liquid.cryofluid.name = Cryofluid mech.alpha-mech.name = Alfa @@ -759,41 +759,41 @@ item.radioactivity = [LIGHT_GRAY]Radioaktivita: {0}% unit.health = [LIGHT_GRAY]Životy: {0} unit.speed = [LIGHT_GRAY]Rychlost: {0} mech.weapon = [LIGHT_GRAY]Zbraň: {0} -mech.health = [LIGHT_GRAY]Health: {0} +mech.health = [LIGHT_GRAY]Životy: {0} mech.itemcapacity = [LIGHT_GRAY]Kapacita předmětů: {0} mech.minespeed = [LIGHT_GRAY]Rychlost těžení: {0} mech.minepower = [LIGHT_GRAY]Síla těžení: {0} mech.ability = [LIGHT_GRAY]Schopnost: {0} -mech.buildspeed = [LIGHT_GRAY]Building Speed: {0}% +mech.buildspeed = [LIGHT_GRAY]Rychlost stavění: {0}% liquid.heatcapacity = [LIGHT_GRAY]Kapacita teploty: {0} liquid.viscosity = [LIGHT_GRAY]Viskozita: {0} liquid.temperature = [LIGHT_GRAY]Teplota: {0} block.sand-boulder.name = Sand Boulder -block.grass.name = Grass -block.salt.name = Salt -block.saltrocks.name = Salt Rocks +block.grass.name = Tráva +block.salt.name = sůl +block.saltrocks.name = Solný kámen block.pebbles.name = Pebbles block.tendrils.name = Tendrils -block.sandrocks.name = Sand Rocks +block.sandrocks.name = Písečný kámen block.spore-pine.name = Spore Pine block.sporerocks.name = Spore Rocks block.rock.name = Rock -block.snowrock.name = Snow Rock +block.snowrock.name = Sněhový kámen block.snow-pine.name = Snow Pine block.shale.name = Shale block.shale-boulder.name = Shale Boulder -block.moss.name = Moss +block.moss.name = Mech block.shrubs.name = Shrubs block.spore-moss.name = Spore Moss block.shalerocks.name = Shale Rocks -block.scrap-wall.name = Scrap Wall -block.scrap-wall-large.name = Large Scrap Wall -block.scrap-wall-huge.name = Huge Scrap Wall -block.scrap-wall-gigantic.name = Gigantic Scrap Wall +block.scrap-wall.name = Stará zeď +block.scrap-wall-large.name = Velá stará zeď +block.scrap-wall-huge.name = obří stará zeď +block.scrap-wall-gigantic.name = Gigantická stará zeď block.thruster.name = Thruster block.kiln.name = Kiln -block.graphite-press.name = Graphite Press -block.multi-press.name = Multi-Press +block.graphite-press.name = Graphitový lis +block.multi-press.name = Všětraný lys block.constructing = {0} [LIGHT_GRAY](Constructing) block.spawn.name = Nepřátelský Spawn block.core-shard.name = Core: Shard @@ -806,28 +806,28 @@ block.darksand-tainted-water.name = Dark Sand Tainted Water block.tar.name = Tar block.stone.name = Kámen block.sand.name = Písek -block.darksand.name = Dark Sand +block.darksand.name = Černý písek block.ice.name = Led block.snow.name = Sníh -block.craters.name = Craters -block.sand-water.name = Sand water -block.darksand-water.name = Dark Sand Water +block.craters.name = Krátery +block.sand-water.name = Písková voda +block.darksand-water.name = Černá písková voda block.char.name = Char block.holostone.name = Holo stone block.ice-snow.name = Ice Snow -block.rocks.name = Rocks -block.icerocks.name = Ice rocks -block.snowrocks.name = Snow Rocks +block.rocks.name = Kameny +block.icerocks.name = Ledové kameny +block.snowrocks.name = Sněhové kameny block.dunerocks.name = Dune Rocks block.pine.name = Pine block.white-tree-dead.name = White Tree Dead block.white-tree.name = White Tree block.spore-cluster.name = Spore Cluster -block.metal-floor.name = Metal Floor -block.metal-floor-2.name = Metal Floor 2 -block.metal-floor-3.name = Metal Floor 3 -block.metal-floor-5.name = Metal Floor 5 -block.metal-floor-damaged.name = Metal Floor Damaged +block.metal-floor.name = Železná podlaha +block.metal-floor-2.name = Železná Podlaha +block.metal-floor-3.name = železná Podlaha3 +block.metal-floor-5.name = Železná podlaha 5 +block.metal-floor-damaged.name = Rozbytáb block.dark-panel-1.name = Dark Panel 1 block.dark-panel-2.name = Dark Panel 2 block.dark-panel-3.name = Dark Panel 3 @@ -841,10 +841,10 @@ block.magmarock.name = Magma Rock block.cliffs.name = Cliffs block.copper-wall.name = Měděná zeď block.copper-wall-large.name = Velká měděná zeď -block.titanium-wall.name = Titanium Wall -block.titanium-wall-large.name = Large Titanium Wall -block.plastanium-wall.name = Plastanium Wall -block.plastanium-wall-large.name = Large Plastanium Wall +block.titanium-wall.name = Titanium Zeď +block.titanium-wall-large.name = Velká Titanium Zeď +block.plastanium-wall.name = Plastanium Zeď +block.plastanium-wall-large.name = Velká Plastanium Zeď block.phase-wall.name = Fázová stěna block.phase-wall-large.name = Velká fázová stěna block.thorium-wall.name = Thoriová stěna @@ -918,7 +918,7 @@ block.blast-mixer.name = Výbušninový mixér block.solar-panel.name = Solární panel block.solar-panel-large.name = Velký solární panel block.oil-extractor.name = Ropný Extraktor -block.command-center.name = Command Center +block.command-center.name = Řídící středisko block.draug-factory.name = Draug Miner Drone Factory block.spirit-factory.name = Továrna na Spirit Drony block.phantom-factory.name = Továrna na Fantom Drony @@ -960,7 +960,7 @@ block.container.name = Kontejnér block.launch-pad.name = Launch Pad block.launch-pad-large.name = Large Launch Pad team.blue.name = modrá -team.crux.name = red +team.crux.name = červená team.sharded.name = orange team.orange.name = oranžová team.derelict.name = derelict @@ -1004,13 +1004,13 @@ tutorial.waves.mobile = The[lightgray] enemy[] approaches.\n\nDefend the core fo 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 = Užitečný strukturální materiál. Používá se rozsáhle v ostatních typech bloků. item.lead.description = Základní počáteční materiál. Požívá se rozsáhle v elektronice a v blocích pro transport tekutin. -item.metaglass.description = A super-tough glass compound. Extensively used for liquid distribution and storage. -item.graphite.description = Mineralized carbon, used for ammunition and electrical insulation. +item.metaglass.description = Vemi důležitá suočást všeho so se týká tekutin +item.graphite.description = Stlačený uhlík nedílná součást většiny infrastruktur item.sand.description = Běžný materiál rozšířeně používaný v spalování slitin. item.coal.description = Běžné a snadno dostupné palivo, pochází z Ostravy. item.titanium.description = Vzácný, velice lehký kov, používá se rozsáhle v trasportu tekutin, vrtech a letounech. item.thorium.description = Hustý, radioaktivní materiál, používá se jako strukturální podpora a jako nuklearní palivo. -item.scrap.description = Leftover remnants of old structures and units. Contains trace amounts of many different metals. +item.scrap.description = Staré železo které se dá přepracovat na grafit měď olovo titánium a písek item.silicon.description = Extrémně užitečný polovodič, aplikuje se v solárních panelech a v komplexní elektronice. item.plastanium.description = Lehký, kujný materiál, používá se v pokročilém letectví a jako fragmentační střelivo. item.phase-fabric.description = Skoro beztížná substance používaná v pokročilé elektronice a v sebeopravné technologii. @@ -1019,7 +1019,7 @@ item.spore-pod.description = Used for conversion into oil, explosives and fuel. item.blast-compound.description = Těkavá směs používaná v bombácha a výbušninách. Dá se spalovat ale jako palivo se nedoporučuje. item.pyratite.description = Extrémně vznětlivá substance, používá ve vznětovém střelivu. liquid.water.description = Nejčastěji se používá ke chlazení a zpracování odpadu. -liquid.slag.description = Various different types of molten metal mixed together. Can be separated into its constituent minerals, or sprayed at enemy units as a weapon. +liquid.slag.description = Rostavený scrap pou žívá se k vírobě olova mědi a grafitu. liquid.oil.description = Může být spálen, vybouchnout nebo použit jako chlazení. liquid.cryofluid.description = Nejefektivnější tekutina pro chlazení. mech.alpha-mech.description = Standartní mech. Má slušnou rychlost a poškození; Může vytvořit až 3 drony Pro zvýšenou ofenzivní způsobilost. diff --git a/core/assets/bundles/bundle_de.properties b/core/assets/bundles/bundle_de.properties index 4d21b8d8db..349e521572 100644 --- a/core/assets/bundles/bundle_de.properties +++ b/core/assets/bundles/bundle_de.properties @@ -3,7 +3,7 @@ credits = Danksagungen contributors = Übersetzer und Mitwirkende discord = Trete dem Mindustry Discord bei! link.discord.description = Der offizielle Mindustry Discord-Chatroom -link.reddit.description = The Mindustry subreddit +link.reddit.description = Der Mindustry Subreddit link.github.description = Quellcode des Spiels link.changelog.description = Liste der Änderungen link.dev-builds.description = Entwicklungs-Builds (instabil) @@ -68,7 +68,7 @@ position = Position close = Schließen website = Website quit = Verlassen -save.quit = Save & Quit +save.quit = Speichern & Beenden maps = Karten maps.browse = Browse Maps continue = Weiter @@ -87,7 +87,7 @@ mods = Mods mods.none = [LIGHT_GRAY]No mods found! mods.guide = Modding Guide mods.report = Report Bug -mods.openfolder = Open Mod Folder +mods.openfolder = Mod Verzeichnis öffnen mod.enabled = [lightgray]Enabled mod.disabled = [scarlet]Disabled mod.disable = Disable @@ -97,8 +97,8 @@ mod.nowdisabled = [scarlet]Mod '{0}' is missing dependencies:[accent] {1}\n[ligh 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.import = Mod importieren +mod.import.github = GitHub Mod importieren 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} @@ -133,16 +133,16 @@ server.kicked.idInUse = Du bist bereits auf dem Server! Anmeldungen mit zwei Acc server.kicked.customClient = Der Server akzeptiert keine Custom Builds von Mindustry. Lade dir die offizielle Version herunter. server.kicked.gameover = Game Over! server.versions = Deine Version:[accent] {0}[]\nServerversion:[accent] {1}[] -host.info = Der [accent]host[]-Knopf startet einen Server auf den Ports [scarlet]6567[] und [scarlet]6568.[]\nJeder im gleichen [LIGHT_GRAY]W-Lan oder lokalem Netzwerk[] sollte deinen Server in seiner Server Liste sehen können.\n\nWenn du Leuten die Verbindung über IP ermöglichen willst, benötigst du [accent]Port-Forwarding[].\n\n[LIGHT_GRAY]Hinweis: Falls es Probleme mit der Verbindung im Netzwerk gibt, stell sicher, dass Mindustry in deinen Firewall Einstellungen Zugriff auf das lokale Netzwerk hat. -join.info = Hier kannst du eine [accent]Server-IP[] eingeben um dich zu verbinden oder Server im [accent]lokalem Netzwerk[] entdecken und dich mit ihnen verbinden.\nSowohl Spielen über das lokale Netzwerk als auch Spielen über das Internet werden unterstützt.\n\n[LIGHT_GRAY]Hinweis: Es gibt keine globale Server Liste; Wenn du dich mit jemand per IP verbinden willst musst du den Host nach seiner IP fragen. +host.info = Der [accent]Server hosten[]-Knopf startet einen Server auf den Ports [scarlet]6567[] und [scarlet]6568.[]\nJeder im gleichen [LIGHT_GRAY]W-Lan oder lokalen Netzwerk[] sollte deinen Server in seiner Server Liste sehen können.\n\nWenn du anderen die Verbindung über IP ermöglichen willst, benötigst du [accent]Port-Forwarding[].\n\n[LIGHT_GRAY]Hinweis: Falls es Probleme mit der Verbindung im Netzwerk gibt, stelle sicher, dass Mindustry in deinen Firewall Einstellungen Zugriff auf das lokale Netzwerk hat. +join.info = Hier kannst du eine [accent]Server-IP[] eingeben um dich zu verbinden oder Server im [accent]lokalen Netzwerk[] entdecken und dich mit ihnen verbinden.\nSowohl Spielen über das lokale Netzwerk als auch Spielen über das Internet werden unterstützt.\n\n[LIGHT_GRAY]Hinweis: Es gibt keine globale Server Liste; Wenn du dich mit jemandem per IP verbinden willst, musst du den Host nach seiner IP fragen. hostserver = Server hosten invitefriends = Invite Friends hostserver.mobile = Host\nSpiel -host = Host +host = Server hosten hosting = [accent] Server wird geöffnet ... hosts.refresh = Aktualisieren hosts.discovering = Suche nach LAN-Spielen -hosts.discovering.any = Discovering games +hosts.discovering.any = Suche nach Spielen server.refreshing = Server wird aktualisiert hosts.none = [lightgray] Keine LAN-Spiele gefunden! host.invalid = [scarlet] Kann keine Verbindung zum Host herstellen. @@ -225,15 +225,15 @@ cancel = Abbruch openlink = Link öffnen copylink = Kopiere Link back = Zurück -data.export = Export Data -data.import = Import Data +data.export = Daten exportieren +data.import = Daten importieren data.exported = Data exported. data.invalid = This isn't valid game data. data.import.confirm = Importing external data will erase[scarlet] all[] your current game data.\n[accent]This cannot be undone![]\n\nOnce the data is imported, your game will exit immediately. classic.export = Export Classic Data 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 = Willst du wirklich aufhören? -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.[] +quit.confirm.tutorial = Willst du das Tutorial wirklich abbrechen?\nDu kannst es unter[accent] Einstellungen->Spiel->Tutorial wiederholen[] erneut spielen. loading = [accent]Wird geladen... reloading = [accent]Reloading Mods... saving = [accent]Speichere... @@ -326,14 +326,14 @@ editor.saved = Gespeichert! editor.save.noname = Deine Karte hat keinen Namen! Setze einen Namen im [accent]Karten Info[] Menu. editor.save.overwrite = Deine Karte überschreibt eine built-in Karte! Wähle einen anderen Karten Namen im [accent]'Karten info'[] Menu. editor.import.exists = [scarlet]Fehler beim Import:[] Ein built-in Karte namens '{0}' existiert bereits! -editor.import = Import... +editor.import = Importieren... editor.importmap = Importiere Karte editor.importmap.description = Importiere von einer bestehenden Karte editor.importfile = Importiere Datei editor.importfile.description = Importiere aus einer Karten Datei editor.importimage = Importiere Terrain Bild editor.importimage.description = Importiere aus einer Terrain Bild Datei -editor.export = Export... +editor.export = Exportieren... editor.exportfile = Export in Datei editor.exportfile.description = Exportiere in eine Karten Datei editor.exportimage = Export in Terrain Bild Datei @@ -404,7 +404,7 @@ ping = Ping: {0}ms language.restart = Bitte Starte dein Spiel neu, damit die Sprach-Einstellung aktiv wird. settings = Einstellungen tutorial = Tutorial -tutorial.retake = Re-Take Tutorial +tutorial.retake = Tutorial wiederholen editor = Editor mapeditor = Karten Editor abandon = Aufgeben @@ -424,8 +424,8 @@ launch.confirm = Dies wird alle Ressourcen in deinen Kern übertragen.\nDu kanns launch.skip.confirm = If you skip now, you will not be able to launch until later waves. uncover = Freischalten configure = Startitems festlegen -bannedblocks = Banned Blocks -addall = Add All +bannedblocks = Gesperrte Blöcke +addall = Alle hinzufügen configure.locked = [LIGHT_GRAY]Erreiche Welle {0}\n, um Startitems festlegen zu können. configure.invalid = Amount must be a number between 0 and {0}. zone.unlocked = [LIGHT_GRAY]{0} freigeschaltet. @@ -476,26 +476,26 @@ zone.fungalPass.description = A transition area between high mountains and lower zone.impact0078.description = zone.crags.description = settings.language = Sprache -settings.data = Game Data +settings.data = Spieldaten settings.reset = Auf Standard zurücksetzen settings.rebind = Zuweisen settings.controls = Steuerung settings.game = Spiel settings.sound = Audio -settings.graphics = Grafiken +settings.graphics = Grafik settings.cleardata = Spieldaten zurücksetzen... settings.clear.confirm = Bist du sicher, dass du die Spieldaten zurücksetzen willst?\n Diese Aktion kann nicht rückgängig gemacht werden! settings.clearall.confirm = [scarlet]Warnung![]\nDas wird jegliche Spieldaten zurücksetzen inklusive Speicherstände, Karten, Freischaltungen und Tastenbelegungen.\n Nachdem du 'OK' drückst wird alles zurückgesetzt und das Spiel schließt sich automatisch. paused = Pausiert -clear = Clear +clear = Leeren banned = [scarlet]Banned yes = Ja no = Nein info.title = [accent]Info error.title = [crimson] Ein Fehler ist aufgetreten error.crashtitle = Ein Fehler ist aufgetreten! -blocks.input = Input -blocks.output = Output +blocks.input = Eingang +blocks.output = Ausgang blocks.booster = Verstärkung block.unknown = [LIGHT_GRAY]??? blocks.powercapacity = Kapazität @@ -524,12 +524,12 @@ blocks.boosteffect = Verstärkungseffekt blocks.maxunits = Max aktive Einheiten blocks.health = Lebenspunkte blocks.buildtime = Baudauer -blocks.buildcost = Build Cost +blocks.buildcost = Baukosten blocks.inaccuracy = Ungenauigkeit blocks.shots = Schüsse blocks.reload = Schüsse/Sekunde blocks.ammo = Munition -bar.drilltierreq = Better Drill Required +bar.drilltierreq = besserer Bohrer benötigt bar.drillspeed = Bohrgeschwindigkeit: {0}/s bar.pumpspeed = Pump Speed: {0}/s bar.efficiency = Effizienz: {0}% @@ -554,7 +554,7 @@ bullet.knockback = [stat]{0}[lightgray] zurückstoßend bullet.freezing = [stat]gefrierend bullet.tarred = [stat]geteert bullet.multiplier = [stat]{0}[lightgray]x Munition Multiplikator -bullet.reload = [stat]{0}[lightgray]x neu laden +bullet.reload = [stat]{0}[lightgray]x Feuerrate unit.blocks = Blöcke unit.powersecond = Stromeinheiten/Sekunde unit.liquidsecond = Flüssigkeitseinheiten/Sekunde @@ -599,25 +599,28 @@ setting.difficulty.insane = Unmöglich setting.difficulty.name = Schwierigkeit setting.screenshake.name = Bildschirmwackeln setting.effects.name = Effekte anzeigen -setting.destroyedblocks.name = Display Destroyed Blocks -setting.conveyorpathfinding.name = Conveyor Placement Pathfinding +setting.destroyedblocks.name = Zerstörte Blöcke anzeigen +setting.conveyorpathfinding.name = Automatische Wegfindung beim Bau von Förderbändern setting.sensitivity.name = Controller-Empfindlichkeit setting.saveinterval.name = Autosave Häufigkeit setting.seconds = {0} Sekunden +setting.blockselecttimeout.name = Block Auswahl Timeout +setting.milliseconds = {0} Millisekunden setting.fullscreen.name = Vollbild setting.borderlesswindow.name = Randloses Fenster[LIGHT_GRAY] (Neustart teilweise erforderlich) setting.fps.name = Zeige FPS +setting.blockselectkeys.name = Block Shortcuts anzeigen setting.vsync.name = VSync setting.pixelate.name = Verpixeln [LIGHT_GRAY](Könnte die Leistung beeinträchtigen) setting.minimap.name = Zeige die Minimap -setting.position.name = Show Player Position +setting.position.name = Spieler-Position anzeigen setting.musicvol.name = Musiklautstärke setting.ambientvol.name = Ambient Volume setting.mutemusic.name = Musik stummschalten setting.sfxvol.name = Audioeffekt-Lautstärke setting.mutesound.name = Audioeffekte stummschalten setting.crashreport.name = Anonyme Absturzberichte senden -setting.savecreate.name = Auto-Create Saves +setting.savecreate.name = Automatisch Speicherstände anlegen setting.publichost.name = Public Game Visibility setting.chatopacity.name = Chat Deckkraft setting.lasersopacity.name = Power Laser Opacity @@ -635,17 +638,34 @@ category.multiplayer.name = Mehrspieler command.attack = Angreifen command.rally = Rally command.retreat = Rückzug +placement.blockselectkeys = \n[lightgray]Shortcut: [{0}, keybind.clear_building.name = Clear Building keybind.press = Drücke eine Taste... keybind.press.axis = Drücke eine Taste oder bewege eine Achse... keybind.screenshot.name = Karten Screenshot keybind.move_x.name = X-Achse keybind.move_y.name = Y-Achse -keybind.schematic_select.name = Select Region +keybind.schematic_select.name = Bereich auswählen keybind.schematic_menu.name = Schematic Menu keybind.schematic_flip_x.name = Flip Schematic X keybind.schematic_flip_y.name = Flip Schematic Y -keybind.fullscreen.name = Toggle Fullscreen +keybind.category_prev.name = Vorige Kategorie +keybind.category_next.name = Nächste Kategorie +keybind.block_select_left.name = Block-Auswahl nach links +keybind.block_select_right.name = Block-Auswahl nach rechts +keybind.block_select_up.name = Block-Auswahl nach oben +keybind.block_select_down.name = Block-Auswahl nach unten +keybind.block_select_01.name = Kategorie/Block 1 auswählen +keybind.block_select_02.name = Kategorie/Block 2 auswählen +keybind.block_select_03.name = Kategorie/Block 3 auswählen +keybind.block_select_04.name = Kategorie/Block 4 auswählen +keybind.block_select_05.name = Kategorie/Block 5 auswählen +keybind.block_select_06.name = Kategorie/Block 6 auswählen +keybind.block_select_07.name = Kategorie/Block 7 auswählen +keybind.block_select_08.name = Kategorie/Block 8 auswählen +keybind.block_select_09.name = Kategorie/Block 9 auswählen +keybind.block_select_10.name = Kategorie/Block 10 auswählen +keybind.fullscreen.name = Vollbild umschalten keybind.select.name = Auswählen/Schießen keybind.diagonal_placement.name = Diagonal platzieren keybind.pick.name = Block Auswählen @@ -710,7 +730,7 @@ rules.title.unit = Einheiten content.item.name = Materialien content.liquid.name = Flüssigkeiten content.unit.name = Einheiten -content.block.name = Blocks +content.block.name = Blöcke content.mech.name = Mechs item.copper.name = Kupfer item.lead.name = Blei @@ -753,6 +773,7 @@ mech.trident-ship.name = Trident mech.trident-ship.weapon = Bombenschacht mech.glaive-ship.name = Glaive mech.glaive-ship.weapon = Flammen-Mehrlader +item.corestorable = [lightgray]Im Kern speicherbar: {0} item.explosiveness = [LIGHT_GRAY]Explosivität: {0} item.flammability = [LIGHT_GRAY]Entflammbarkeit: {0} item.radioactivity = [LIGHT_GRAY]Radioaktivität: {0} diff --git a/core/assets/bundles/bundle_eu.properties b/core/assets/bundles/bundle_eu.properties index 81927de1c5..c86b1c28cd 100644 --- a/core/assets/bundles/bundle_eu.properties +++ b/core/assets/bundles/bundle_eu.properties @@ -3,7 +3,7 @@ credits = Kredituak contributors = Itzultzaile eta kolaboratzaileak discord = Elkartu Mindustry Discord-era! link.discord.description = Mindustry Discord txat gela ofiziala -link.reddit.description = The Mindustry subreddit +link.reddit.description = Mindustry azpireddita link.github.description = Jolasaren iturburu kodea link.changelog.description = Eguneraketaren aldaketen zerrenda link.dev-builds.description = Garapen konpilazio ezegonkorrak @@ -17,29 +17,29 @@ screenshot.invalid = Mapa handiegia, baliteke pantaila-argazkirako memoria nahik gameover = Partida amaitu da gameover.pvp = [accent] {0}[] taldeak irabazi du! highscore = [accent]Marka berria! -copied = Copied. +copied = Kopiatuta. load.sound = Soinuak load.map = Mapak load.image = Irudiak load.content = Edukia load.system = Sistema -load.mod = Mods -schematic = Schematic -schematic.add = Save Schematic... -schematics = Schematics -schematic.replace = A schematic by that name already exists. Replace it? -schematic.import = Import Schematic... -schematic.exportfile = Export File -schematic.importfile = Import File -schematic.browseworkshop = Browse Workshop -schematic.copy = Copy to Clipboard -schematic.copy.import = Import from Clipboard -schematic.shareworkshop = Share on Workshop -schematic.flip = [accent][[{0}][]/[accent][[{1}][]: Flip Schematic -schematic.saved = Schematic saved. -schematic.delete.confirm = This schematic will be utterly eradicated. -schematic.rename = Rename Schematic -schematic.info = {0}x{1}, {2} blocks +load.mod = Mod-ak +schematic = Eskama +schematic.add = Gorde eskema... +schematics = Eskemak +schematic.replace = Badago izen bereko eskema bat. Ordeztu nahi duzu? +schematic.import = Inportatu eskema... +schematic.exportfile = Esportatu fitxategia +schematic.importfile = Inportatu fitxategia +schematic.browseworkshop = Arakatu tailerra +schematic.copy = Kopiatu arbelera +schematic.copy.import = Inportatu arbeletik +schematic.shareworkshop = Partekatu tailerrean +schematic.flip = [accent][[{0}][]/[accent][[{1}][]: itzulbiratu eskema +schematic.saved = Eskema gordeta. +schematic.delete.confirm = Eskema hau behin betiko suntsituko da. +schematic.rename = Aldatu izena eskemari +schematic.info = {0}x{1}, {2} bloke stat.wave = Garaitutako boladak:[accent] {0} stat.enemiesDestroyed = Suntsitutako etsaiak:[accent] {0} stat.built = Eraikitako eraikinak:[accent] {0} @@ -48,7 +48,7 @@ stat.deconstructed = Deseraikitako eraikinak:[accent] {0} stat.delivered = Egotzitako baliabideak: stat.rank = Azken graduazioa: [accent]{0} launcheditems = [accent]Egotzitako baliabideak -launchinfo = [unlaunched][[LAUNCH] your core to obtain the items indicated in blue. +launchinfo = [unlaunched][[EGOTZI] zure muina urdinez adierazitako baliabideak eskuratzeko. map.delete = Ziur al zaude "[accent]{0}[]" mapa ezabatu nahi duzula? level.highscore = Marka: [accent]{0} level.select = Maila hautaketa @@ -64,7 +64,7 @@ customgame = Partida pertsonalizatua newgame = Partida berria none = minimap = Mapatxoa -position = Position +position = Posizioa close = Itxi website = Webgunea quit = Irten @@ -80,30 +80,30 @@ uploadingcontent = Edukia igotzen uploadingpreviewfile = Aurrebista fitxategia igotzen committingchanges = Aldaketak aplikatzen done = Egina -feature.unsupported = Your device does not support this feature. -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 -mods.openfolder = Open Mod Folder -mod.enabled = [lightgray]Enabled -mod.disabled = [scarlet]Disabled -mod.disable = Disable -mod.delete.error = Unable to delete mod. File may be in use. -mod.missingdependencies = [scarlet]Missing dependencies: {0} -mod.nowdisabled = [scarlet]Mod '{0}' is missing dependencies:[accent] {1}\n[lightgray]These mods need to be downloaded first.\nThis mod will be automatically disabled. -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} -mod.preview.missing = Before publishing this mod in the workshop, you must add an image preview.\nPlace an image named[accent] preview.png[] into the mod's folder and try again. -mod.folder.missing = Only mods in folder form can be published on the workshop.\nTo convert any mod into a folder, simply unzip its file into a folder and delete the old zip, then restart your game or reload your mods. +feature.unsupported = Zure gailuak ez du ezaugarri hau onartzen. +mods.alphainfo = Kontuan izan mod-ak alfa egoeran daudela, eta [scarlet] akats ugari izan ditzakete[].\nEman arazoen berri Mindustry-ren GitHub or Discord zerbitzuetan. +mods.alpha = [accent](Alfa) +mods = Mod-ak +mods.none = [LIGHT_GRAY]Ez da mod-ik aurkitu! +mods.guide = Mod-ak sortzeko gida +mods.report = Eman akatsaren berri +mods.openfolder = Ireki Mod-en karpeta +mod.enabled = [lightgray]Gaituta +mod.disabled = [scarlet]Desgaituta +mod.disable = Desgaitu +mod.delete.error = Ezin izan da mod-a ezabatu. Agian fitxategia erabilia izaten ari da. +mod.missingdependencies = [scarlet]Falta diren menpekotasunak: {0} +mod.nowdisabled = [scarlet]'{0}' mod-ak menpekotasunak ditu faltan:[accent] {1}\n[lightgray]Aurretik beste mod hauek deskargatu behar dira.\nMod hau automatikoki desgaituko da. +mod.enable = Gaitu +mod.requiresrestart = Jolasa itxi egingo da mod-aren aldaketak aplikatzeko. +mod.reloadrequired = [scarlet]Birkargatu behar da +mod.import = Importatu Mod-a +mod.import.github = Inportatu GitHub Mod-a +mod.remove.confirm = Mod hau ezabatuko da. +mod.author = [LIGHT_GRAY]Egilea:[] {0} +mod.missing = Gordetako partida honek eguneratu dituzun edo jada instalatuta ez dituzun mod-ak ditu. Gordetako partida izorratu daiteke. Ziur kargatu nahi duzula?\n[lightgray]Mod-ak:\n{0} +mod.preview.missing = Mod hau tailerrean argitaratu aurretik, aurrebista bat gehitu behar diozu.\nKokatu[accent] preview.png[] izeneko irudi bat mod-aren karpetan eta saiatu berriro. +mod.folder.missing = Karpeta formatuko mod-ak besterik ezin dira argitaratu tailerrean.\nEdozein mod karpetara bihurtzeko, deskopnrimitu fitxategia eta ezabatu zip zaharra, gero berrabiarazi jolasa edo birkargatu zure mod-ak. about.button = Honi buruz name = Izena: noname = Hautatu[accent] jokalari-izena[] aurretik. @@ -216,8 +216,8 @@ save.playtime = Jolastua: {0} warning = Abisua. confirm = Baieztatu delete = Ezabatu -view.workshop = Ikusi lantegian -workshop.listing = Edit Workshop Listing +view.workshop = Ikusi tailerrean +workshop.listing = Editatu tailerreko zerrenda ok = Ados open = Ireki customize = Aldatu arauak @@ -235,12 +235,12 @@ classic.export.text = [accent]Mindustry[] jolasak eguneraketa nagusi bat jaso du quit.confirm = Ziur irten nahi duzula? quit.confirm.tutorial = Ziur al zaude irten nahi duzula?\nTutoriala berriro hasi dezakezu hemen: [accent] Ezarpenak->Jolasa->Berriro hasi tutoriala.[] loading = [accent]Kargatzen... -reloading = [accent]Reloading Mods... +reloading = [accent]Mod-ak birkargatzen... saving = [accent]Gordetzen... -cancelbuilding = [accent][[{0}][] to clear plan -selectschematic = [accent][[{0}][] to select+copy -pausebuilding = [accent][[{0}][] to pause building -resumebuilding = [scarlet][[{0}][] to resume building +cancelbuilding = [accent][[{0}][] plan bat ezabatzeko +selectschematic = [accent][[{0}][] hautatu+kopiatzeko +pausebuilding = [accent][[{0}][] eraikiketa eteteko +resumebuilding = [scarlet][[{0}][] eraikiketa berrekiteko wave = [accent]{0}. bolada wave.waiting = [lightgray]Boladarako {0} wave.waveInProgress = [lightgray]Bolada abian @@ -259,18 +259,18 @@ map.nospawn = Mapa honek ez du muinik jokalaria sortu dadin! Gehitu muin [accent map.nospawn.pvp = Mapa honek ez du etsaien muinik jokalaria sortu dadin! Gehitu [SCARLET]laranja ez den[] muinen bat edo batzuk mapa honi editorean. map.nospawn.attack = Mapa honek ez du etsaien muinik jokalariak eraso dezan! Gehitu muin [SCARLET]gorriak[] mapa honi editorean. map.invalid = Errorea mapa kargatzean: Mapa-fitxategi baliogabe edo hondatua. -workshop.update = Update Item -workshop.error = Error fetching workshop details: {0} +workshop.update = Eguneratu elementua +workshop.error = Errorea tailerreko xehetasunak eskuratzean: {0} map.publish.confirm = Ziur mapa hau argitaratu nahi duzula?\n\n[lightgray]Ziurtatu aurretik lantegiaren erabilera arauekin bat zatozela, bestela zure mapak ez dira agertuko! -workshop.menu = Select what you would like to do with this item. -workshop.info = Item Info -changelog = Changelog (optional): +workshop.menu = Erabaki elementu honekin zer egin nahi duzun. +workshop.info = Elementuaren informazioa +changelog = Aldaketa egunkatia (aukerakoa): eula = Steam EULA -missing = This item has been deleted or moved.\n[lightgray]The workshop listing has now been automatically un-linked. -publishing = [accent]Publishing... -publish.confirm = Are you sure you want to publish this?\n\n[lightgray]Make sure you agree to the Workshop EULA first, or your items will not show up! -publish.error = Error publishing item: {0} -steam.error = Failed to initialize Steam services.\nError: {0} +missing = Elementu hau ezabatu edo lekuz aldatu da.\n[lightgray]Tailerreko zerrendatik kendu da automatikoki. +publishing = [accent]Argitaratzen... +publish.confirm = Ziur hau argitaratu nahi duzula?\n\n[lightgray]Egiaztatu tailerreko EULA lizentziarekin ados zaudela aurretik, bestela zure elementuak ez dira agertuko! +publish.error = Errorea elementua argitaratzean: {0} +steam.error = Huts egin du Steam zerbitzuak hasieratzean.\nErrorea: {0} editor.brush = Brotxa editor.openin = Ireki editorean editor.oregen = Mea sorrera @@ -411,9 +411,9 @@ abandon = Abandonatu abandon.text = Eremu hau eta bere baliabide guztiak etsaiaren esku geratuko dira. locked = Blokeatuta complete = [lightgray]Helmena: -requirement.wave = Reach Wave {0} in {1} -requirement.core = Destroy Enemy Core in {0} -requirement.unlock = Unlock {0} +requirement.wave = Iritsi {0} boladara {1} +requirement.core = Suntsitu etsaiaren muina {0} +requirement.unlock = Desblokeatu {0} resume = Berrekin:\n[lightgray]{0} bestwave = [lightgray]Bolada onena: {0} launch = < EGOTZI > @@ -424,13 +424,13 @@ launch.confirm = Honek zure muinean dauden baliabide guztiak egotziko ditu.\nEzi launch.skip.confirm = Orain ez eginez gero, geroagoko beste bolada batera itxaron beharko duzu. uncover = Estalgabetu configure = Konfiguratu zuzkidura -bannedblocks = Banned Blocks -addall = Add All +bannedblocks = Debekatutako blokeak +addall = Gehitu denak configure.locked = [lightgray]Zuzkiduraren konfigurazioa desblokeatzeko: {0} bolada. configure.invalid = Kopurua 0 eta {0} bitarteko zenbaki bat izan behar da. zone.unlocked = [lightgray]{0} desblokeatuta. zone.requirement.complete = {0}. boladara iritsia:\n{1} Eremuaren betebeharra beteta. -zone.config.unlocked = Loadout unlocked:[lightgray]\n{0} +zone.config.unlocked = Deskarga desblokeatuta:[lightgray]\n{0} zone.resources = [lightgray]Antzemandako baliabideak: zone.objective = [lightgray]Helburua: [accent]{0} zone.objective.survival = Biziraupena @@ -487,8 +487,8 @@ settings.cleardata = Garbitu jolasaren datuak... settings.clear.confirm = Ziur datu hauek garbitu nahi dituzula?\nEgindakoa ezin da desegin! settings.clearall.confirm = [scarlet]ABISUA![]\nHonek datu guztiak garbituko ditu, gordetako partidak, mapak, desblokeatutakoak, eta teklen konfigurazioak barne.\nBehin 'Ados' sakatzen duzula jolasak datuk guztiak ezabatuko ditu eta automatikoki irten. paused = [accent]< Pausatuta > -clear = Clear -banned = [scarlet]Banned +clear = Garbitu +banned = [scarlet]Debekatuta yes = Bai no = Ez info.title = Informazioa @@ -509,7 +509,7 @@ blocks.shootrange = Irismena blocks.size = Neurria blocks.liquidcapacity = Likido-edukiera blocks.powerrange = Energia irismena -blocks.powerconnections = Max Connections +blocks.powerconnections = Gehieneko konexioak blocks.poweruse = Energia-erabilera blocks.powerdamage = Energia/Kaltea blocks.itemcapacity = Elementu-edukiera @@ -531,7 +531,7 @@ blocks.reload = Tiroak/segundoko blocks.ammo = Munizioa bar.drilltierreq = Zulagailu hobea behar da bar.drillspeed = Ustiatze-abiadura: {0}/s -bar.pumpspeed = Pump Speed: {0}/s +bar.pumpspeed = Ponpatze abiadura: {0}/s bar.efficiency = Eraginkortasuna: {0}% bar.powerbalance = Energia: {0}/s bar.powerstored = Bilduta: {0}/{1} @@ -576,9 +576,9 @@ category.shooting = Tirokatzea category.optional = Aukerako hobekuntzak setting.landscape.name = Blokeatu horizontalean setting.shadows.name = Itzalak -setting.blockreplace.name = Automatic Block Suggestions +setting.blockreplace.name = Bloke proposamen automatikoak setting.linear.name = Iragazte lineala -setting.hints.name = Hints +setting.hints.name = Pistak setting.animatedwater.name = Animatutako ura setting.animatedshields.name = Animatutako ezkutuak setting.antialias.name = Antialias[lightgray] (berrabiarazi behar da)[] @@ -599,8 +599,8 @@ setting.difficulty.insane = Zoramena setting.difficulty.name = Zailtasuna: setting.screenshake.name = Pantailaren astindua setting.effects.name = Bistaratze-efektuak -setting.destroyedblocks.name = Display Destroyed Blocks -setting.conveyorpathfinding.name = Conveyor Placement Pathfinding +setting.destroyedblocks.name = Erakutsi suntsitutako blokeak +setting.conveyorpathfinding.name = Garraio-zintak kokatzeko bide-bilaketa setting.sensitivity.name = Kontrolagailuaren sentikortasuna setting.saveinterval.name = Gordetzeko tartea setting.seconds = {0} segundo @@ -610,7 +610,7 @@ setting.fps.name = Erakutsi FPS setting.vsync.name = VSync setting.pixelate.name = Pixelatu[lightgray] (animazioak desgaitzen ditu) setting.minimap.name = Erakutsi mapatxoa -setting.position.name = Show Player Position +setting.position.name = Erakutsi jokalariaren kokalekua setting.musicvol.name = Musikaren bolumena setting.ambientvol.name = Giroaren bolumena setting.mutemusic.name = Isilarazi musika @@ -620,10 +620,10 @@ setting.crashreport.name = Bidali kraskatze txosten automatikoak setting.savecreate.name = Gorde automatikoki setting.publichost.name = Partidaren ikusgaitasun publikoa setting.chatopacity.name = Txataren opakotasuna -setting.lasersopacity.name = Power Laser Opacity +setting.lasersopacity.name = Energia laserraren opakutasuna setting.playerchat.name = Erakutsi jolas barneko txata -public.confirm = Do you want to make your game public?\n[accent]Anyone will be able to join your games.\n[lightgray]This can be changed later in Settings->Game->Public Game Visibility. -public.beta = Note that beta versions of the game cannot make public lobbies. +public.confirm = Zure jolasa publikoa egin nahi duzu?\n[accent]Edonor elkartu ahal izango da zure partidetara.\n[lightgray]Hau gero ere aldatu dauteke, Ezarpenak->Partida->Partida publikoaren ikusgaitasuna. +public.beta = Kontuan izan jolasaren beta bertsioek ezin dituztela jokalarien gela publokoak sortu. uiscale.reset = Interfazearen eskala aldatu da.\nSakatu "Ados" eskala hau berresteko.\n[scarlet][accent] {0}[] segundo atzera egin eta irteteko... uiscale.cancel = Utzi eta irten setting.bloom.name = Distira @@ -635,16 +635,16 @@ category.multiplayer.name = Hainbat jokalari command.attack = Eraso command.rally = Batu command.retreat = Erretreta -keybind.clear_building.name = Clear Building +keybind.clear_building.name = Garrbitu eraikina keybind.press = Sakatu tekla bat... keybind.press.axis = Sakatu ardatza edo tekla... keybind.screenshot.name = Maparen pantaila-argazkia keybind.move_x.name = Mugitu x keybind.move_y.name = Mugitu y -keybind.schematic_select.name = Select Region -keybind.schematic_menu.name = Schematic Menu -keybind.schematic_flip_x.name = Flip Schematic X -keybind.schematic_flip_y.name = Flip Schematic Y +keybind.schematic_select.name = Hautatu eskualdea +keybind.schematic_menu.name = Eskema menua +keybind.schematic_flip_x.name = Itzulbiratu X +keybind.schematic_flip_y.name = Itzulbiratu Y keybind.fullscreen.name = Txandakatu pantaila osoa keybind.select.name = Hautatu/Tirokatu keybind.diagonal_placement.name = Kokatze diagonala @@ -656,14 +656,14 @@ keybind.zoom_hold.name = Zoom mantenduz keybind.zoom.name = Zoom keybind.menu.name = Menua keybind.pause.name = Pausatu -keybind.pause_building.name = Pause/Resume Building +keybind.pause_building.name = Pausatu/berrekin eraikiketa keybind.minimap.name = Mapatxoa keybind.dash.name = Arrapalada keybind.chat.name = Txata keybind.player_list.name = Jokalarien zerrenda keybind.console.name = Kontsola keybind.rotate.name = Biratu -keybind.rotateplaced.name = Rotate Existing (Hold) +keybind.rotateplaced.name = Biratu dagoena (Mantendu) keybind.toggle_menus.name = Txandakatu menuak keybind.chat_history_prev.name = Txat historialean aurrekoa keybind.chat_history_next.name = Txat historialean hurrengoa @@ -675,7 +675,7 @@ mode.survival.name = Biziraupena mode.survival.description = Modu arrunta. Baliabide mugatuak eta bolada automatikoak.\n[gray]Jolasteko etsaien sortze puntuak behar dira mapan. mode.sandbox.name = Jolastokia mode.sandbox.description = Baliabide amaigabeak eta boladen denboragailurik gabe. -mode.editor.name = Editor +mode.editor.name = Editorea mode.pvp.name = JvJ mode.pvp.description = Borrokatu beste jokalari batzuk lokalean.\n[gray]Gutxienez bi kolore desberdinetako muinak behar dira mapan jolasteko. mode.attack.name = Erasoa @@ -843,8 +843,8 @@ block.copper-wall.name = Kobrezko horma block.copper-wall-large.name = Kobrezko horma handia block.titanium-wall.name = Titaniozko horma block.titanium-wall-large.name = Titaniozko horma handia -block.plastanium-wall.name = Plastanium Wall -block.plastanium-wall-large.name = Large Plastanium Wall +block.plastanium-wall.name = Plastaniozko horma +block.plastanium-wall-large.name = Plastaniozko horma handia block.phase-wall.name = Fasezko horma block.phase-wall-large.name = Fasezko horma handia block.thorium-wall.name = Toriozko horma @@ -864,7 +864,7 @@ block.junction.name = Lotunea block.router.name = Bideratzailea block.distributor.name = Banatzailea block.sorter.name = Antolatzailea -block.inverted-sorter.name = Inverted Sorter +block.inverted-sorter.name = Alderantzizko antolatzailea block.message.name = Mezua block.overflow-gate.name = Gainezkatze atea block.silicon-smelter.name = Silizio galdategia @@ -983,7 +983,7 @@ unit.lich.name = Litxe unit.reaper.name = Segalaria tutorial.next = [lightgray] tutorial.intro = Hau [scarlet]Mindustry tutoriala[] da.\nHasi [accent]kobrea ustiatzen[]. Horretarako, sakatu zure muinetik hurbil dagoen kobre-mea bat.\n\n[accent]{0}/{1} kobre -tutorial.intro.mobile = You have entered the[scarlet] Mindustry Tutorial.[]\nSwipe the screen to move.\n[accent]Pinch with 2 fingers [] 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.intro.mobile = [scarlet] Mindustry Tutorialean[] sartu zara\nPasatu hatza mugitzeko.\n[accent]Egin atximurkada bi hatzekin [] zooma hurbildu edo urruntzeko.\nHasi[accent] kobrea ustiatuz[]. Hurbildu kobrera, gero sakatu zure muinetik hurbil dagoen kobre mea bat.\n\n[accent]{0}/{1} kobre tutorial.drill = Eskuz ustiatzea ez da eraginkorra.\n[accent]Zulagailuek []automatikoki ustiatu dezakete.\nSakatu zulagailuen fitxa, behean eskuman.\nHautatu[accent] zulagailu mekanikoa[]. Kokatu ezazu kobre zain batean klik eginez.\n[accent]Eskumako klik[] deseraikitzeko. tutorial.drill.mobile = Eskuz ustiatzea ez da eraginkorra.\n[accent]Zulagailuek []automatikoki ustiatu dezakete.\nSakatu zulagailuen fitxa behean eskuman.\nHautatu[accent] zulagailu mekanikoa[]. \nKokatu ezazu kobre zain batean sakatuz, gero sakatu azpiko [accent]egiaztapen-marka[] zure hautaketa berresteko.\nSakatu [accent]X botoia[] kokatzea ezeztatzeko. tutorial.blockinfo = Bloke bakoitzak estatistika desberdinak ditu. Eta zulagailu bakoitzak mea mota zehatz batzuk ustiatu ditzake soilik.\nBloke mota baten informazio eta estatistikak egiaztatzeko,[accent] hautatu blokea eraikiketa menuan eta sakatu "?" botoia .[]\n\n[accent]Atzitu zulagailu mekanikoaren estatistikak orain.[] @@ -1000,7 +1000,7 @@ tutorial.breaking.mobile = Maiz blokeak suntsitu beharko dituzu.\n[accent]Hautat tutorial.withdraw = Egoera batzuetan, blokeetatik zuzenean hartu behar dira baliabideak.\nHorretarako, [accent]sakatu baliabideak dituen bloke bat[], gero [accent]sakatu baliabidea[] inbentarioan.\nHainbat baliabide ateratzeko [accent]sakatu eta mantendu[].\n\n[accent]Atera kobre apur bat muinetik.[] tutorial.deposit = Baliabideak blokeren batean sartzeko, arrastatu zure ontzitik blokera.\n\n[accent]Sartu zure kobrea berriro muinean.[] tutorial.waves = [lightgray]Etsaia[] dator.\n\nBabestu muina 2 boladetan zehar. [accent]Egin klik[] tirokatzeko.\nEraiki dorre eta zulagailu gehiago. Ustiatu kobre gehiago. -tutorial.waves.mobile = [lightgray]Etsaia[] daor.\n\nBabestu muina 2 boladatan. Zure ontziak automatikoki tirokatuko ditu etsaiak.\nEraiki dorre eta zulagailu gehiago. Ustiatu kobre gehiago. +tutorial.waves.mobile = [lightgray]Etsaia[] dator.\n\nBabestu muina 2 boladatan. Zure ontziak automatikoki tirokatuko ditu etsaiak.\nEraiki dorre eta zulagailu gehiago. Ustiatu kobre gehiago. tutorial.launch = Bolada zehatz batera heltzean, [accent]muina egotzi[] dezakezu, zure defentsak atzean utziz [accent]eta muineko baliabide guztiak eskuratuz.[]\nBaliabide hauek teknologia berriak ikertzeko erabili daitezke.\n\n[accent]Sakatu egotzi botoia. item.copper.description = Egiturazko material oinarrizkoena. Asko erabilia bloke mota guztietarako. item.lead.description = Hastapeneko oinarrizko materiala. Bloke elektronikoak eta likidoen garraiorako blokeetan asko erabilia. @@ -1067,8 +1067,8 @@ block.copper-wall.description = Babeserako bloke merke bat.\nMuina eta dorreak l block.copper-wall-large.description = Babeserako bloke merke bat.\nMuina eta dorreak lehen boladetan babesteko erabilgarria.\nHainbat lauza hartzen ditu. block.titanium-wall.description = Zertxobait gogorra den babeserako bloke bat.\nEtsaien aurreko babes ertaina eskaintzen du. block.titanium-wall-large.description = Zertxobait gogorra den babeserako bloke bat.\nEtsaien aurreko babes ertaina eskaintzen du.\nHainbat lauza hartzen ditu. -block.plastanium-wall.description = A special type of wall that absorbs electric arcs and blocks automatic power node connections. -block.plastanium-wall-large.description = A special type of wall that absorbs electric arcs and blocks automatic power node connections.\nSpans multiple tiles. +block.plastanium-wall.description = Arku elektrikoak xurgatzen dituen eta energia-nodoen konexio automatikoak blokeatzen dituen horma berezia. +block.plastanium-wall-large.description = Arku elektrikoak xurgatzen dituen eta energia-nodoen konexio automatikoak blokeatzen dituen horma berezia..\nHainbat lauza hartzen ditu. block.thorium-wall.description = Babeserako bloke gogorra.\nEtsaitatik aterpe txukuna. block.thorium-wall-large.description = Babeserako bloke gogorra.\nEtsaitatik aterpe txukuna.\nHainbat lauza hartzen ditu. block.phase-wall.description = Fasez osatutako konposatu islatzaile batez estalitako horma bat. Talkan jasotako bala gehienak desbideratzen ditu. @@ -1088,7 +1088,7 @@ block.junction.description = Gurutzatutako bi garraio-zinten arteko zubi gisa ar block.bridge-conveyor.description = Elementuen garraiorako bloke aurreratua. Elementuak edozein gainazal edo eraikinen gainetik garraiatzen ditu 3 lauzatara gehienez. block.phase-conveyor.description = Elementuen garraiorako bloke aurreratua. Energia erabiltzen du hainbat lauzetara konektatutako beste Fasezko garraiagailu batera elementuak teleportatzeko. block.sorter.description = Elementuak antolatzen ditu. Elementu bat hautuarekin bat badator, aurrera jarraitu dezake. Bestela, elementua ezker eta eskuinera ateratzen da. -block.inverted-sorter.description = Processes items like a standard sorter, but outputs selected items to the sides instead. +block.inverted-sorter.description = Antolatzaile arruntaren antzera prozesatzen ditu elementuak, baina hautatutako elementuak alboetara ateratzen ditu. block.router.description = Elementuak onartzen ditu, eta beste gehienez 3 norabideetara ateratzen ditu kopuru berdinetan. Jatorri batetik hainbat xedeetara materialak banatzeko egokia.\n\n[scarlet]Ez jarri ekoizpen sarreren ondoan, irteerek trabatuko baitute.[] block.distributor.description = Bideratzaile aurreratu bat. Elementuak beste gehienez 7 norabideetara sakabanatzen ditu kopuru berdinetan. block.overflow-gate.description = Antolatzaile eta bideratzaile konbinatua. Soilik aurrealdea blokeatuta dagoenean ateratzen du ezker eta eskuinera. diff --git a/core/assets/bundles/bundle_fi.properties b/core/assets/bundles/bundle_fi.properties new file mode 100644 index 0000000000..b441ee0a62 --- /dev/null +++ b/core/assets/bundles/bundle_fi.properties @@ -0,0 +1,1051 @@ +credits.text = Pelin tehnyt [ROYAL]Anuken[] - [SKY]anukendev@gmail.com[] +credits = Tekijät +contributors = Kääntäjät ja avustajat +discord = Liity Mindustryn Discordiin! +link.discord.description = Mindustryn virallinen Discord-keskusteluhuone +link.github.description = Pelin lähdekoodi +link.changelog.description = Lista päivityksien muutoksista +link.dev-builds.description = Epävakaat kehitysversiot +link.trello.description = Virallinen Trello-taulu suunnitelluille ominaisuuksille. +link.itch.io.description = itch.io -sivu tietokoneversion latausten kanssa +link.google-play.description = Google Play Kauppa -sivu +link.wiki.description = Virallinen Mindustry wiki +linkfail = Linkin avaaminen epäonnistui!\nOsoite on kopioitu leikepöydällesi. +screenshot = Kuvankaappaus tallennettu sijaintiin {0} +screenshot.invalid = Kartta liian laaja, kuvankaappaukselle ei mahdollisesti ole tarpeeksi tilaa. +gameover = Peli ohi +gameover.pvp = [accent] {0}[] joukkue voittaa! +highscore = [accent]Uusi ennätys! + +stat.wave = Aaltoja voitettu:[accent] {0} +stat.enemiesDestroyed = Vihollisia tuhottu:[accent] {0} +stat.built = Rakennuksia rakennettu:[accent] {0} +stat.destroyed = Rakennuksia tuhottu:[accent] {0} +stat.deconstructed = Rakennuksia purettu:[accent] {0} +stat.delivered = Resursseja laukaistu: +stat.rank = Lopullinen arvo: [accent]{0} + +placeline = Olet valinnut palikan.\nVoit[accent] asettaa linjassa[][accent] pitämällä sormeasi pohjassa muutaman sekunnin ajan[] ja vetämällä johonkin suuntaan.\n\n[scarlet]TEE SE. +removearea = Olet valinut poistotilan.\nVoit[accent] poistaa palikoita suorakulmiossa[][accent] pitämällä sormeasi pohjassa muutaman sekunnin ajan[] ja vetämällä.\n\n[scarlet]TEE SE. + +launcheditems = [accent]Laukaistut tavarat +map.delete = Oletko varma että haluat poistaa kartan "[accent]{0}[]"? +level.highscore = Ennätys: [accent]{0} +level.select = Tason valinta +level.mode = Pelitila: +showagain = Älä näytä uudestaan seuraavalla kerralla +coreattack = < Ytimeen hyökätään! > +nearpoint = [[ [scarlet]POISTU PUDOTUSPISTEELTÄ VÄLITTÖMÄSTI[]\nvälitön tuhoutuminen +database = Ytimen tietokanta +savegame = Tallenna peli +loadgame = Lataa peli +joingame = Liity peliin +addplayers = Lisää/Poista pelaajia +customgame = Mukautettu peli +newgame = Uusi peli +none = +minimap = Pienoiskartta +close = Sulje +website = Verkkosivu +quit = Poistu +maps = Kartat +continue = Jatka +maps.none = [lightgray]Karttoja ei löytynyt! +about.button = Tietoa +name = Nimi: +noname = Valitse ensin[accent] pelaajanimi[]. +filename = Tiedostonimi: +unlocked = Uutta sisältöä avattu! +completed = [accent]Suoritettu +techtree = Tekniikkapuu +research.list = [lightgray]Tutki: +research = Tutki +researched = [lightgray]{0} tutkittu. +players = {0} pelaajaa paikalla +players.single = {0} pelaaja paikalla +server.closing = [accent]Suljetaan palvelinta... +server.kicked.kick = Sinut on potkittu palvelimelta! +server.kicked.serverClose = Palvelin suljettu. +server.kicked.clientOutdated = Pelisi on vanhentunut! Päivitä se! +server.kicked.serverOutdated = Outdated server! Ask the host to update! +server.kicked.banned = Sinulla on portikielto tälle palvelimelle. +server.kicked.recentKick = Sinut on potkittu äskettäin.\nOdota ennen kuin yhdistät uudestaan. +server.kicked.nameInUse = Joku tuon niminen\non jo tällä palvelimella. +server.kicked.nameEmpty = Valitsemasi nimi on virheellinen. +server.kicked.idInUse = Olet jo tällä palvelimella! Kahdella käyttäjällä yhdistäminen ei ole sallittua. +server.kicked.customClient = Tämä palvelin ei tue muokattuja versioita. Lataa virallinen versio. +server.kicked.gameover = Peli ohi! +server.versions = Versiosi:[accent] {0}[]\nPalvelimen versio:[accent] {1}[] +host.info = The [accent]host[] button hosts a server on port [scarlet]6567[]. \nAnybody on the same [lightgray]wifi or local network[] should be able to see your server in their server list.\n\nIf you want people to be able to connect from anywhere by IP, [accent]port forwarding[] is required.\n\n[lightgray]Note: If someone is experiencing trouble connecting to your LAN game, make sure you have allowed Mindustry access to your local network in your firewall settings. Note that public networks sometimes do not allow server discovery. +join.info = Here, you can enter a [accent]server IP[] to connect to, or discover [accent]local network[] servers to connect to.\nBoth LAN and WAN multiplayer is supported.\n\n[lightgray]Note: There is no automatic global server list; if you want to connect to someone by IP, you would need to ask the host for their IP. +hostserver = Host Multiplayer Game +hostserver.mobile = Host\nGame +host = Host +hosting = [accent]Avataan palvelinta... +hosts.refresh = Päivitä +hosts.discovering = Discovering LAN games +server.refreshing = Päivitetään palvelimen tietoja +hosts.none = [lightgray]No local games found! +host.invalid = [scarlet]Can't connect to host. +trace = Trace Player +trace.playername = Pelaajanimi: [accent]{0} +trace.ip = IP-osoite: [accent]{0} +trace.id = Uniikki tunniste: [accent]{0} +trace.mobile = Mobile Client: [accent]{0} +trace.modclient = Custom Client: [accent]{0} +invalidid = Invalid client ID! Submit a bug report. +server.bans = Porttikiellot +server.bans.none = Porttikieltoja saaneita pelaajia ei löytynyt! +server.admins = Ylläpitäjät +server.admins.none = Ylläpitäjiä ei löytynyt! +server.add = Lisää palvelin +server.delete = Oletko varma että haluat poistaa tämän palvelimen? +server.edit = Muokkaa palvelinta +server.outdated = [crimson]Vanhentunut palvelin![] +server.outdated.client = [crimson]Vanhentunut asiakasohjelma![] +server.version = [gray]v{0} {1} +server.custombuild = [yellow]Custom Build +confirmban = Are you sure you want to ban this player? +confirmkick = Are you sure you want to kick this player? +confirmunban = Are you sure you want to unban this player? +confirmadmin = Are you sure you want to make this player an admin? +confirmunadmin = Are you sure you want to remove admin status from this player? +joingame.title = Liity peliin +joingame.ip = Osoite: +disconnect = Disconnected. +disconnect.data = Failed to load world data! +connecting = [accent]Connecting... +connecting.data = [accent]Loading world data... +server.port = Portti: +server.addressinuse = Address already in use! +server.invalidport = Invalid port number! +server.error = [crimson]Error hosting server: [accent]{0} +save.old = This save is for an older version of the game, and can no longer be used.\n\n[lightgray]Save backwards compatibility will be implemented in the full 4.0 release. +save.new = New Save +save.overwrite = Are you sure you want to overwrite\nthis save slot? +overwrite = Overwrite +save.none = No saves found! +saveload = Saving... +savefail = Failed to save game! +save.delete.confirm = Are you sure you want to delete this save? +save.delete = Delete +save.export = Export Save +save.import.invalid = [accent]This save is invalid! +save.import.fail = [crimson]Failed to import save: [accent]{0} +save.export.fail = [crimson]Failed to export save: [accent]{0} +save.import = Import Save +save.newslot = Tallennuksen nimi: +save.rename = Nimeä uudelleen +save.rename.text = Uusi nimi: +selectslot = Valitse tallennus. +slot = [accent]Paikka {0} +save.corrupted = [accent]Tallennustiedosto korruptoitunut tai viallinen!\nJos olet päivittänyt juuri pelisi, tämä on todennäköisesti muutos tallennusmuodossa [scarlet]eikä[] virhe. +empty = +on = Päällä +off = Pois +save.autosave = Automaattitallennus: {0} +save.map = Kartta: {0} +save.wave = Aalto {0} +save.difficulty = Vaikeustaso: {0} +save.date = Viimeksi tallennettu: {0} +save.playtime = Peliaika: {0} +warning = Varoitus. +confirm = Vahvista +delete = Poista +ok = OK +open = Avaa +customize = Muokkaa sääntöjä +cancel = Peruuta +openlink = Avaa linkki +copylink = Kopioi linkki +back = Takaisin +classic.export = Export Classic Data +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 = 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]Ladataan... +saving = [accent]Tallennetaan... +wave = [accent]Aalto {0} +wave.waiting = [lightgray]Wave in {0} +wave.waveInProgress = [lightgray]Wave in progress +waiting = [lightgray]Odotetaan... +waiting.players = Odotetaan pelaajia... +wave.enemies = [lightgray]{0} vihollista jäljellä +wave.enemy = [lightgray]{0} vihollinen jäljellä +loadimage = Lataa kuva +saveimage = Tallenna kuva +unknown = Tuntematon +custom = Custom +builtin = Sisäänrakennettu +map.delete.confirm = Oletko varma että haluat poistaa tämän kartan? Poistoa ei voi peruuttaa! +map.random = [accent]Satunnainen kartta +map.nospawn = Tässä kartassa ei ole ytimiä joihin syntyä! Lisää[accent] oranssi[] ydin karttaan editorissa. +map.nospawn.pvp = This map does not have any enemy cores for player to spawn into! Add[SCARLET] non-orange[] cores to this map in the editor. +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. +editor.brush = Brush +editor.openin = Avaa editorissa +editor.oregen = Ore Generation +editor.oregen.info = Ore Generation: +editor.mapinfo = Kartan tiedot +editor.author = Author: +editor.description = Kuvaus: +editor.waves = Aallot: +editor.rules = Säännöt: +editor.generation = Generation: +editor.ingame = Edit In-Game +editor.newmap = Uusi kartta +waves.title = Aallot +waves.remove = Remove +waves.never = +waves.every = every +waves.waves = wave(s) +waves.perspawn = per spawn +waves.to = to +waves.boss = Boss +waves.preview = Preview +waves.edit = Muokkaa... +waves.copy = Kopioi leikepöydälle +waves.load = Lataa leikepöydältä +waves.invalid = Invalid waves in clipboard. +waves.copied = Aallot kopioitu. +waves.none = No enemies defined.\nNote that empty wave layouts will automatically be replaced with the default layout. +editor.default = [lightgray] +edit = Muokkaa... +editor.name = Nimi: +editor.spawn = Spawn Unit +editor.removeunit = Remove Unit +editor.teams = Joukkueet +editor.errorload = Virhe ladattaessa tiedostoa:\n[accent]{0} +editor.errorsave = Virhe tallennettaessa tiedostoa:\n[accent]{0} +editor.errorimage = That's an image, not a map. Don't go around changing extensions expecting it to work.\n\nIf you want to import a legacy map, use the 'import legacy map' button in the editor. +editor.errorlegacy = This map is too old, and uses a legacy map format that is no longer supported. +editor.errorheader = This map file is either not valid or corrupt. +editor.errorname = Map has no name defined. Are you trying to load a save file? +editor.update = Päivitä +editor.randomize = Randomize +editor.apply = Apply +editor.generate = Generate +editor.resize = Resize +editor.loadmap = Lataa kartta +editor.savemap = Tallenna kartta +editor.saved = Tallennettu! +editor.save.noname = Your map does not have a name! Set one in the 'map info' menu. +editor.save.overwrite = Your map overwrites a built-in map! Pick a different name in the 'map info' menu. +editor.import.exists = [scarlet]Unable to import:[] a built-in map named '{0}' already exists! +editor.import = Tuo... +editor.importmap = Tuo kartta +editor.importmap.description = Import an already existing map +editor.importfile = Tuo tiedosto +editor.importfile.description = Import an external map file +editor.importimage = Import Legacy Image +editor.importimage.description = Import an external map image file +editor.export = Vie... +editor.exportfile = Vie tiedosto +editor.exportfile.description = Export a map file +editor.exportimage = Export Terrain Image +editor.exportimage.description = Export a map image file +editor.loadimage = Import Terrain +editor.saveimage = Export Terrain +editor.unsaved = [scarlet]You have unsaved changes![]\nAre you sure you want to exit? +editor.resizemap = Resize Map +editor.mapname = Kartan nimi: +editor.overwrite = [accent]Warning!\nThis overwrites an existing map. +editor.overwrite.confirm = [scarlet]Warning![] A map with this name already exists. Are you sure you want to overwrite it? +editor.selectmap = Select a map to load: + +toolmode.replace = Replace +toolmode.replace.description = Draws only on solid blocks. +toolmode.replaceall = Replace All +toolmode.replaceall.description = Replace all blocks in map. +toolmode.orthogonal = Orthogonal +toolmode.orthogonal.description = Draws only orthogonal lines. +toolmode.square = Square +toolmode.square.description = Square brush. +toolmode.eraseores = Erase Ores +toolmode.eraseores.description = Erase only ores. +toolmode.fillteams = Fill Teams +toolmode.fillteams.description = Fill teams instead of blocks. +toolmode.drawteams = Draw Teams +toolmode.drawteams.description = Draw teams instead of blocks. + +filters.empty = [lightgray]No filters! Add one with the button below. +filter.distort = Distort +filter.noise = Noise +filter.median = Median +filter.oremedian = Ore Median +filter.blend = Blend +filter.defaultores = Default Ores +filter.ore = Ore +filter.rivernoise = River Noise +filter.mirror = Mirror +filter.clear = Clear +filter.option.ignore = Ignore +filter.scatter = Scatter +filter.terrain = Terrain +filter.option.scale = Scale +filter.option.chance = Chance +filter.option.mag = Magnitude +filter.option.threshold = Threshold +filter.option.circle-scale = Circle Scale +filter.option.octaves = Octaves +filter.option.falloff = Falloff +filter.option.angle = Angle +filter.option.block = Block +filter.option.floor = Lattia +filter.option.flooronto = Target Floor +filter.option.wall = Seinä +filter.option.ore = Malmi +filter.option.floor2 = Secondary Floor +filter.option.threshold2 = Secondary Threshold +filter.option.radius = Radius +filter.option.percentile = Percentile + +width = Leveys: +height = Korkeus: +menu = Valikko +play = Pelaa +campaign = Campaign +load = Lataa +save = Tallenna +fps = FPS: {0} +tps = TPS: {0} +ping = Ping: {0}ms +language.restart = Please restart your game for the language settings to take effect. +settings = Asetukset +tutorial = Perehdytys +tutorial.retake = Re-Take Tutorial +editor = Editor +mapeditor = Map Editor +donate = Lahjoita + +abandon = Hylkää +abandon.text = This zone and all its resources will be lost to the enemy. +locked = Lukittu +complete = [lightgray]Reach: +zone.requirement = Wave {0} in zone {1} +resume = Resume Zone:\n[lightgray]{0} +bestwave = [lightgray]Best Wave: {0} +launch = < LAUNCH > +launch.title = Launch Successful +launch.next = [lightgray]next opportunity at wave {0} +launch.unable2 = [scarlet]Unable to LAUNCH.[] +launch.confirm = This will launch all resources in your core.\nYou will not be able to return to this base. +launch.skip.confirm = If you skip now, you will not be able to launch until later waves. +uncover = Uncover +configure = Configure Loadout +configure.locked = [lightgray]Unlock configuring loadout: Wave {0}. +zone.unlocked = [lightgray]{0} unlocked. +zone.requirement.complete = Wave {0} reached:\n{1} zone requirements met. +zone.config.complete = Wave {0} reached:\nLoadout config unlocked. +zone.resources = [lightgray]Resources Detected: +zone.objective = [lightgray]Objective: [accent]{0} +zone.objective.survival = Survive +zone.objective.attack = Destroy Enemy Core +add = Add... +boss.health = Boss Health + +connectfail = [crimson]Connection error:\n\n[accent]{0} +error.unreachable = Server unreachable.\nIs the address spelled correctly? +error.invalidaddress = Invalid address. +error.timedout = Timed out!\nMake sure the host has port forwarding set up, and that the address is correct! +error.mismatch = Packet error:\npossible client/server version mismatch.\nMake sure you and the host have the latest version of Mindustry! +error.alreadyconnected = Already connected. +error.mapnotfound = Map file not found! +error.io = Network I/O error. +error.any = Unknown network error. +error.bloom = Failed to initialize bloom.\nYour device may not support it. + +zone.groundZero.name = Ground Zero +zone.desertWastes.name = Desert Wastes +zone.craters.name = The Craters +zone.frozenForest.name = Frozen Forest +zone.ruinousShores.name = Ruinous Shores +zone.stainedMountains.name = Stained Mountains +zone.desolateRift.name = Desolate Rift +zone.nuclearComplex.name = Nuclear Production Complex +zone.overgrowth.name = Overgrowth +zone.tarFields.name = Tar Fields +zone.saltFlats.name = Salt Flats +zone.impact0078.name = Impact 0078 +zone.crags.name = Crags +zone.fungalPass.name = Fungal Pass + +zone.groundZero.description = The optimal location to begin once more. Low enemy threat. Few resources.\nGather as much lead and copper as possible.\nMove on. +zone.frozenForest.description = Even here, closer to mountains, the spores have spread. The frigid temperatures cannot contain them forever.\n\nBegin the venture into power. Build combustion generators. Learn to use menders. +zone.desertWastes.description = These wastes are vast, unpredictable, and criss-crossed with derelict sector structures.\nCoal is present in the region. Burn it for power, or synthesize graphite.\n\n[lightgray]This landing location cannot be guaranteed. +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 Titan 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.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 = Language +settings.reset = Reset to Defaults +settings.rebind = Rebind +settings.controls = Controls +settings.game = Game +settings.sound = Sound +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 +info.title = Info +error.title = [crimson]An error has occured +error.crashtitle = An error has occured +attackpvponly = [scarlet]Only available in Attack/PvP modes +blocks.input = Input +blocks.output = Output +blocks.booster = Booster +block.unknown = [lightgray]??? +blocks.powercapacity = Power Capacity +blocks.powershot = Power/Shot +blocks.damage = Damage +blocks.targetsair = Targets Air +blocks.targetsground = Targets Ground +blocks.itemsmoved = Move Speed +blocks.launchtime = Time Between Launches +blocks.shootrange = Range +blocks.size = Size +blocks.liquidcapacity = Liquid Capacity +blocks.powerrange = Power Range +blocks.poweruse = Power Use +blocks.powerdamage = Power/Damage +blocks.itemcapacity = Item Capacity +blocks.basepowergeneration = Base Power Generation +blocks.productiontime = Production Time +blocks.repairtime = Block Full Repair Time +blocks.speedincrease = Speed Increase +blocks.range = Range +blocks.drilltier = Drillables +blocks.drillspeed = Base Drill Speed +blocks.boosteffect = Boost Effect +blocks.maxunits = Max Active Units +blocks.health = Health +blocks.buildtime = Build Time +blocks.inaccuracy = Inaccuracy +blocks.shots = Shots +blocks.reload = Shots/Second +blocks.ammo = Ammo + +bar.drilltierreq = Better Drill Required +bar.drillspeed = Drill Speed: {0}/s +bar.efficiency = Efficiency: {0}% +bar.powerbalance = Power: {0}/s +bar.poweramount = Power: {0} +bar.poweroutput = Power Output: {0} +bar.items = Items: {0} +bar.liquid = Liquid +bar.heat = Heat +bar.power = Power +bar.progress = Build Progress +bar.spawned = Units: {0}/{1} + +bullet.damage = [stat]{0}[lightgray] damage +bullet.splashdamage = [stat]{0}[lightgray] area dmg ~[stat] {1}[lightgray] tiles +bullet.incendiary = [stat]incendiary +bullet.homing = [stat]homing +bullet.shock = [stat]shock +bullet.frag = [stat]frag +bullet.knockback = [stat]{0}[lightgray] knockback +bullet.freezing = [stat]freezing +bullet.tarred = [stat]tarred +bullet.multiplier = [stat]{0}[lightgray]x ammo multiplier +bullet.reload = [stat]{0}[lightgray]x fire rate + +unit.blocks = blocks +unit.powersecond = power units/second +unit.liquidsecond = liquid units/second +unit.itemssecond = items/second +unit.liquidunits = liquid units +unit.powerunits = power units +unit.degrees = degrees +unit.seconds = seconds +unit.persecond = /sec +unit.timesspeed = x speed +unit.percent = % +unit.items = items +category.general = General +category.power = Power +category.liquids = Liquids +category.items = Items +category.crafting = Input/Output +category.shooting = Shooting +category.optional = Optional Enhancements +setting.landscape.name = Lock Landscape +setting.shadows.name = Shadows +setting.linear.name = Linear Filtering +setting.animatedwater.name = Animated Water +setting.animatedshields.name = Animated Shields +setting.antialias.name = Antialias[lightgray] (requires restart)[] +setting.indicators.name = Enemy/Ally Indicators +setting.autotarget.name = Auto-Target +setting.keyboard.name = Mouse+Keyboard Controls +setting.fpscap.name = Max FPS +setting.fpscap.none = None +setting.fpscap.text = {0} FPS +setting.uiscale.name = UI Scaling[lightgray] (require restart)[] +setting.swapdiagonal.name = Always Diagonal Placement +setting.difficulty.training = Training +setting.difficulty.easy = Easy +setting.difficulty.normal = Normal +setting.difficulty.hard = Hard +setting.difficulty.insane = Insane +setting.difficulty.name = Difficulty: +setting.screenshake.name = Screen Shake +setting.effects.name = Display Effects +setting.sensitivity.name = Controller Sensitivity +setting.saveinterval.name = Save Interval +setting.seconds = {0} Seconds +setting.fullscreen.name = Fullscreen +setting.borderlesswindow.name = Borderless Window[lightgray] (may require restart) +setting.fps.name = Show FPS +setting.vsync.name = VSync +setting.lasers.name = Show Power Lasers +setting.pixelate.name = Pixelate[lightgray] (disables animations) +setting.minimap.name = Show Minimap +setting.musicvol.name = Music Volume +setting.ambientvol.name = Ambient Volume +setting.mutemusic.name = Mute Music +setting.sfxvol.name = SFX Volume +setting.mutesound.name = Mute Sound +setting.crashreport.name = Send Anonymous Crash Reports +setting.chatopacity.name = Chat Opacity +setting.playerchat.name = Display In-Game Chat +uiscale.reset = UI scale has been changed.\nPress "OK" to confirm this scale.\n[scarlet]Reverting and exiting in[accent] {0}[] seconds... +uiscale.cancel = Cancel & Exit +setting.bloom.name = Bloom +keybind.title = Rebind Keys +keybinds.mobile = [scarlet]Most keybinds here are not functional on mobile. Only basic movement is supported. +category.general.name = General +category.view.name = View +category.multiplayer.name = Multiplayer +command.attack = Attack +command.retreat = Retreat +command.patrol = Patrol +keybind.gridMode.name = Block Select +keybind.gridModeShift.name = Category Select +keybind.press = Press a key... +keybind.press.axis = Press an axis or key... +keybind.screenshot.name = Map Screenshot +keybind.move_x.name = Move x +keybind.move_y.name = Move y +keybind.select.name = Select/Shoot +keybind.diagonal_placement.name = Diagonal Placement +keybind.pick.name = Pick Block +keybind.break_block.name = Break Block +keybind.deselect.name = Deselect +keybind.shoot.name = Shoot +keybind.zoom_hold.name = Zoom Hold +keybind.zoom.name = Zoom +keybind.menu.name = Menu +keybind.pause.name = Pause +keybind.minimap.name = Minimap +keybind.dash.name = Dash +keybind.chat.name = Chat +keybind.player_list.name = Player list +keybind.console.name = Console +keybind.rotate.name = Rotate +keybind.toggle_menus.name = Toggle menus +keybind.chat_history_prev.name = Chat history prev +keybind.chat_history_next.name = Chat history next +keybind.chat_scroll.name = Chat scroll +keybind.drop_unit.name = Drop Unit +keybind.zoom_minimap.name = Zoom minimap +mode.help.title = Description of modes +mode.survival.name = Survival +mode.survival.description = The normal mode. Limited resources and automatic incoming waves.\n[gray]Requires enemy spawns in the map to play. +mode.sandbox.name = Sandbox +mode.sandbox.description = Infinite resources and no timer for waves. +mode.pvp.name = PvP +mode.pvp.description = Fight against other players locally.\n[gray]Requires at least 2 differently-colored cores in the map to play. +mode.attack.name = Attack +mode.attack.description = Destroy the enemy's base. No waves.\n[gray]Requires a red core in the map to play. +mode.custom = Custom Rules + +rules.infiniteresources = Infinite Resources +rules.wavetimer = Wave Timer +rules.waves = Waves +rules.attack = Attack Mode +rules.enemyCheat = Infinite AI (Red Team) Resources +rules.unitdrops = Unit Drops +rules.unitbuildspeedmultiplier = Unit Production Speed Multiplier +rules.unithealthmultiplier = Unit Health Multiplier +rules.playerhealthmultiplier = Player Health Multiplier +rules.playerdamagemultiplier = Player Damage Multiplier +rules.unitdamagemultiplier = Unit Damage Multiplier +rules.enemycorebuildradius = Enemy Core No-Build Radius:[lightgray] (tiles) +rules.respawntime = Respawn Time:[lightgray] (sec) +rules.wavespacing = Wave Spacing:[lightgray] (sec) +rules.buildcostmultiplier = Build Cost Multiplier +rules.buildspeedmultiplier = Build Speed Multiplier +rules.waitForWaveToEnd = Waves wait for enemies +rules.dropzoneradius = Drop Zone Radius:[lightgray] (tiles) +rules.respawns = Max respawns per wave +rules.limitedRespawns = Limit Respawns +rules.title.waves = Waves +rules.title.respawns = Respawns +rules.title.resourcesbuilding = Resources & Building +rules.title.player = Players +rules.title.enemy = Enemies +rules.title.unit = Units + +content.item.name = Items +content.liquid.name = Liquids +content.unit.name = Units +content.block.name = Blocks +content.mech.name = Mechs +item.copper.name = Copper +item.lead.name = Lead +item.coal.name = Coal +item.graphite.name = Graphite +item.titanium.name = Titanium +item.thorium.name = Thorium +item.silicon.name = Silicon +item.plastanium.name = Plastanium +item.phase-fabric.name = Phase Fabric +item.surge-alloy.name = Surge Alloy +item.spore-pod.name = Spore Pod +item.sand.name = Hiekka +item.blast-compound.name = Blast Compound +item.pyratite.name = Pyratite +item.metaglass.name = Metaglass +item.scrap.name = Scrap +liquid.water.name = Vesi +liquid.slag.name = Slag +liquid.oil.name = Oil +liquid.cryofluid.name = Cryofluid +mech.alpha-mech.name = Alpha +mech.alpha-mech.weapon = Heavy Repeater +mech.alpha-mech.ability = Regeneration +mech.delta-mech.name = Delta +mech.delta-mech.weapon = Arc Generator +mech.delta-mech.ability = Discharge +mech.tau-mech.name = Tau +mech.tau-mech.weapon = Restruct Laser +mech.tau-mech.ability = Repair Burst +mech.omega-mech.name = Omega +mech.omega-mech.weapon = Swarm Missiles +mech.omega-mech.ability = Armored Configuration +mech.dart-ship.name = Dart +mech.dart-ship.weapon = Repeater +mech.javelin-ship.name = Javelin +mech.javelin-ship.weapon = Burst Missiles +mech.javelin-ship.ability = Discharge Booster +mech.trident-ship.name = Trident +mech.trident-ship.weapon = Bomb Bay +mech.glaive-ship.name = Glaive +mech.glaive-ship.weapon = Flame Repeater +item.explosiveness = [lightgray]Explosiveness: {0}% +item.flammability = [lightgray]Flammability: {0}% +item.radioactivity = [lightgray]Radioactivity: {0}% +unit.health = [lightgray]Health: {0} +unit.speed = [lightgray]Speed: {0} +mech.weapon = [lightgray]Weapon: {0} +mech.health = [lightgray]Health: {0} +mech.itemcapacity = [lightgray]Item Capacity: {0} +mech.minespeed = [lightgray]Mining Speed: {0}% +mech.minepower = [lightgray]Mining Power: {0} +mech.ability = [lightgray]Ability: {0} +mech.buildspeed = [lightgray]Building Speed: {0}% +liquid.heatcapacity = [lightgray]Heat Capacity: {0} +liquid.viscosity = [lightgray]Viscosity: {0} +liquid.temperature = [lightgray]Temperature: {0} + +block.sand-boulder.name = Sand Boulder +block.grass.name = Grass +block.salt.name = Salt +block.saltrocks.name = Salt Rocks +block.pebbles.name = Pebbles +block.tendrils.name = Tendrils +block.sandrocks.name = Sand Rocks +block.spore-pine.name = Spore Pine +block.sporerocks.name = Spore Rocks +block.rock.name = Rock +block.snowrock.name = Snow Rock +block.snow-pine.name = Snow Pine +block.shale.name = Shale +block.shale-boulder.name = Shale Boulder +block.moss.name = Moss +block.shrubs.name = Shrubs +block.spore-moss.name = Spore Moss +block.shalerocks.name = Shale Rocks +block.scrap-wall.name = Scrap Wall +block.scrap-wall-large.name = Large Scrap Wall +block.scrap-wall-huge.name = Huge Scrap Wall +block.scrap-wall-gigantic.name = Gigantic Scrap Wall +block.thruster.name = Thruster +block.kiln.name = Kiln +block.graphite-press.name = Graphite Press +block.multi-press.name = Multi-Press +block.constructing = {0} [lightgray](Constructing) +block.spawn.name = Enemy Spawn +block.core-shard.name = Core: Shard +block.core-foundation.name = Core: Foundation +block.core-nucleus.name = Core: Nucleus +block.deepwater.name = Deep Water +block.water.name = Water +block.tainted-water.name = Tainted Water +block.darksand-tainted-water.name = Dark Sand Tainted Water +block.tar.name = Tar +block.stone.name = Stone +block.sand.name = Sand +block.darksand.name = Dark Sand +block.ice.name = Ice +block.snow.name = Snow +block.craters.name = Craters +block.sand-water.name = Sand water +block.darksand-water.name = Dark Sand Water +block.char.name = Char +block.holostone.name = Holo stone +block.ice-snow.name = Ice Snow +block.rocks.name = Rocks +block.icerocks.name = Ice rocks +block.snowrocks.name = Snow Rocks +block.dunerocks.name = Dune Rocks +block.pine.name = Pine +block.white-tree-dead.name = White Tree Dead +block.white-tree.name = White Tree +block.spore-cluster.name = Spore Cluster +block.metal-floor.name = Metal Floor 1 +block.metal-floor-2.name = Metal Floor 2 +block.metal-floor-3.name = Metal Floor 3 +block.metal-floor-5.name = Metal Floor 4 +block.metal-floor-damaged.name = Metal Floor Damaged +block.dark-panel-1.name = Dark Panel 1 +block.dark-panel-2.name = Dark Panel 2 +block.dark-panel-3.name = Dark Panel 3 +block.dark-panel-4.name = Dark Panel 4 +block.dark-panel-5.name = Dark Panel 5 +block.dark-panel-6.name = Dark Panel 6 +block.dark-metal.name = Dark Metal +block.ignarock.name = Igna Rock +block.hotrock.name = Hot Rock +block.magmarock.name = Magma Rock +block.cliffs.name = Cliffs +block.copper-wall.name = Copper Wall +block.copper-wall-large.name = Large Copper Wall +block.titanium-wall.name = Titanium Wall +block.titanium-wall-large.name = Large Titanium Wall +block.phase-wall.name = Phase Wall +block.phase-wall-large.name = Large Phase Wall +block.thorium-wall.name = Thorium Wall +block.thorium-wall-large.name = Large Thorium Wall +block.door.name = Door +block.door-large.name = Large Door +block.duo.name = Duo +block.scorch.name = Scorch +block.scatter.name = Scatter +block.hail.name = Hail +block.lancer.name = Lancer +block.conveyor.name = Conveyor +block.titanium-conveyor.name = Titanium Conveyor +block.junction.name = Junction +block.router.name = Router +block.distributor.name = Distributor +block.sorter.name = Sorter +block.overflow-gate.name = Overflow Gate +block.silicon-smelter.name = Silicon Smelter +block.phase-weaver.name = Phase Weaver +block.pulverizer.name = Pulverizer +block.cryofluidmixer.name = Cryofluid Mixer +block.melter.name = Melter +block.incinerator.name = Incinerator +block.spore-press.name = Spore Press +block.separator.name = Separator +block.coal-centrifuge.name = Coal Centrifuge +block.power-node.name = Power Node +block.power-node-large.name = Large Power Node +block.surge-tower.name = Surge Tower +block.battery.name = Battery +block.battery-large.name = Large Battery +block.combustion-generator.name = Combustion Generator +block.turbine-generator.name = Steam Generator +block.differential-generator.name = Differential Generator +block.impact-reactor.name = Impact Reactor +block.mechanical-drill.name = Mechanical Drill +block.pneumatic-drill.name = Pneumatic Drill +block.laser-drill.name = Laser Drill +block.water-extractor.name = Water Extractor +block.cultivator.name = Cultivator +block.dart-mech-pad.name = Alpha Mech Pad +block.delta-mech-pad.name = Delta Mech Pad +block.javelin-ship-pad.name = Javelin Ship Pad +block.trident-ship-pad.name = Trident Ship Pad +block.glaive-ship-pad.name = Glaive Ship Pad +block.omega-mech-pad.name = Omega Mech Pad +block.tau-mech-pad.name = Tau Mech Pad +block.conduit.name = Conduit +block.mechanical-pump.name = Mechanical Pump +block.item-source.name = Item Source +block.item-void.name = Item Void +block.liquid-source.name = Liquid Source +block.power-void.name = Power Void +block.power-source.name = Power Infinite +block.unloader.name = Unloader +block.vault.name = Vault +block.wave.name = Wave +block.swarmer.name = Swarmer +block.salvo.name = Salvo +block.ripple.name = Ripple +block.phase-conveyor.name = Phase Conveyor +block.bridge-conveyor.name = Bridge Conveyor +block.plastanium-compressor.name = Plastanium Compressor +block.pyratite-mixer.name = Pyratite Mixer +block.blast-mixer.name = Blast Mixer +block.solar-panel.name = Solar Panel +block.solar-panel-large.name = Large Solar Panel +block.oil-extractor.name = Oil Extractor +block.draug-factory.name = Draug Miner Drone Factory +block.spirit-factory.name = Spirit Repair Drone Factory +block.phantom-factory.name = Phantom Builder Drone Factory +block.wraith-factory.name = Wraith Fighter Factory +block.ghoul-factory.name = Ghoul Bomber Factory +block.dagger-factory.name = Dagger Mech Factory +block.crawler-factory.name = Crawler Mech Factory +block.titan-factory.name = Titan Mech Factory +block.fortress-factory.name = Fortress Mech Factory +block.revenant-factory.name = Revenant Fighter Factory +block.repair-point.name = Repair Point +block.pulse-conduit.name = Pulse Conduit +block.phase-conduit.name = Phase Conduit +block.liquid-router.name = Liquid Router +block.liquid-tank.name = Liquid Tank +block.liquid-junction.name = Liquid Junction +block.bridge-conduit.name = Bridge Conduit +block.rotary-pump.name = Rotary Pump +block.thorium-reactor.name = Thorium Reactor +block.mass-driver.name = Massalinko +block.blast-drill.name = Airblast Drill +block.thermal-pump.name = Thermal Pump +block.thermal-generator.name = Thermal Generator +block.alloy-smelter.name = Alloy Smelter +block.mender.name = Mender +block.mend-projector.name = Mend Projector +block.surge-wall.name = Surge Wall +block.surge-wall-large.name = Large Surge Wall +block.cyclone.name = Cyclone +block.fuse.name = Fuse +block.shock-mine.name = Shock Mine +block.overdrive-projector.name = Overdrive Projector +block.force-projector.name = Force Projector +block.arc.name = Arc +block.rtg-generator.name = RTG Generator +block.spectre.name = Spectre +block.meltdown.name = Meltdown +block.container.name = Container +block.launch-pad.name = Launch Pad +block.launch-pad-large.name = Large Launch Pad +team.blue.name = blue +team.crux.name = red +team.sharded.name = orange +team.orange.name = orange +team.derelict.name = derelict +team.green.name = green +team.purple.name = purple +unit.spirit.name = Spirit Repair Drone +unit.draug.name = Draug Miner Drone +unit.phantom.name = Phantom Builder Drone +unit.dagger.name = Dagger +unit.crawler.name = Crawler +unit.titan.name = Titan +unit.ghoul.name = Ghoul Bomber +unit.wraith.name = Wraith Fighter +unit.fortress.name = Fortress +unit.revenant.name = Revenant +unit.eruptor.name = Eruptor +unit.chaos-array.name = Chaos Array +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. +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]{0}/{1} conveyors placed in line\n[accent]0/1 items delivered +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]{0}/{1} conveyors placed in line\n[accent]0/1 items delivered +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 +tutorial.pause = During battle, you are able to[accent] pause the game.[]\nYou may queue buildings while paused.\n\n[accent]Press space to pause. +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 = 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. + + +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. +item.metaglass.description = A super-tough glass compound. Extensively used for liquid distribution and storage. +item.graphite.description = Mineralized carbon, used for ammunition and electrical insulation. +item.sand.description = A common material that is used extensively in smelting, both in alloying and as a flux. +item.coal.description = Fossilized plant matter, formed long before the seeding event. Used extensively for fuel and resource production. +item.titanium.description = A rare super-light metal used extensively in liquid transportation, drills and aircraft. +item.thorium.description = A dense, radioactive metal used as structural support and nuclear fuel. +item.scrap.description = Leftover remnants of old structures and units. Contains trace amounts of many different metals. +item.silicon.description = An extremely useful semiconductor. Applications in solar panels, complex electronics and homing turret ammunition. +item.plastanium.description = A light, ductile material used in advanced aircraft and fragmentation ammunition. +item.phase-fabric.description = A near-weightless substance used in advanced electronics and self-repairing technology. +item.surge-alloy.description = An advanced alloy with unique electrical properties. +item.spore-pod.description = A pod of synthetic spores, synthesized from atmospheric concentrations for industrial purposes. Used for conversion into oil, explosives and fuel. +item.blast-compound.description = An unstable compound used in bombs and explosives. Synthesized from spore pods and other volatile substances. Use as fuel is not advised. +item.pyratite.description = An extremely flammable substance used in incendiary weapons. +liquid.water.description = The most useful liquid. Commonly used for cooling machines and waste processing. +liquid.slag.description = Various different types of molten metal mixed together. Can be separated into its constituent minerals, or sprayed at enemy units as a weapon. +liquid.oil.description = A liquid used in advanced material production. Can be converted into coal as fuel, or sprayed and set on fire as a weapon. +liquid.cryofluid.description = An inert, non-corrosive liquid created from water and titanium. Has extremely high heat capacity. Extensively used as coolant. +mech.alpha-mech.description = The standard control mech. Based on a Dagger unit, with upgraded armor and building capabilities. Has more damage output than a Dart ship. +mech.delta-mech.description = A fast, lightly-armored mech made for hit-and-run attacks. Does little damage against structures, but can kill large groups of enemy units very quickly with its arc lightning weapons. +mech.tau-mech.description = The support mech. Heals allied blocks by shooting at them. Can heal allies in a radius with its repair ability. +mech.omega-mech.description = A bulky and well-armored mech, made for front-line assaults. Its armor can block up to 90% of incoming damage. +mech.dart-ship.description = The standard control ship. Reasonably fast and light, but has little offensive capability and low mining speed. +mech.javelin-ship.description = A hit-and-run strike ship. While initially slow, it can accelerate to great speeds and fly by enemy outposts, dealing large amounts of damage with its lightning and missiles. +mech.trident-ship.description = A heavy bomber, built for construction and destroying enemy fortifications. Reasonably well armored. +mech.glaive-ship.description = A large, well-armored gunship. Equipped with an incendiary repeater. Highly maneuverable. +unit.draug.description = A primitive mining drone. Cheap to produce. Expendable. Automatically mines copper and lead in the vicinity. Delivers mined resources to the closest core. +unit.spirit.description = A modified draug drone, designed for repair instead of mining. Automatically fixes any damaged blocks in the area. +unit.phantom.description = An advanced drone unit. Follows users. Assists in block construction. +unit.dagger.description = The most basic ground mech. Cheap to produce. Overwhelming when used in swarms. +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 = An advanced, armored ground unit. Attacks both ground and air targets. Equipped with two miniature Scorch-class flamethrowers. +unit.fortress.description = A heavy artillery mech. Equipped with two modified Hail-type cannons for long-range assault on enemy structures and units. +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 = A fast, hit-and-run interceptor unit. Targets power generators. +unit.ghoul.description = A heavy carpet bomber. Rips through enemy structures, targeting critical infrastructure. +unit.revenant.description = A heavy, hovering missile array. +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 = Reduces sand with pure coal. Produces silicon. +block.kiln.description = Smelts sand and lead into the compound known as metaglass. Requires small amounts of power to run. +block.plastanium-compressor.description = Produces plastanium from oil and titanium. +block.phase-weaver.description = Synthesizes phase fabric from radioactive thorium and sand. Requires massive amounts of power to function. +block.alloy-smelter.description = Combines titanium, lead, silicon and copper to produce surge alloy. +block.cryofluidmixer.description = Mixes water and fine titanium powder into cryofluid. Essential for thorium reactor usage. +block.blast-mixer.description = Crushes and mixes clusters of spores with pyratite to produce blast compound. +block.pyratite-mixer.description = Mixes coal, lead and sand into highly flammable pyratite. +block.melter.description = Melts down scrap into slag for further processing or usage in wave turrets. +block.separator.description = Separates slag into its mineral components. Outputs the cooled result. +block.spore-press.description = Compresses spore pods under extreme pressure to synthesize oil. +block.pulverizer.description = Crushes scrap into fine sand. +block.coal-centrifuge.description = Solidifes oil into chunks of coal. +block.incinerator.description = Vaporizes any excess item or liquid it receives. +block.power-void.description = Voids all power inputted into it. Sandbox only. +block.power-source.description = Infinitely outputs power. Sandbox only. +block.item-source.description = Infinitely outputs items. Sandbox only. +block.item-void.description = Destroys any items. Sandbox only. +block.liquid-source.description = Infinitely outputs liquids. Sandbox only. +block.copper-wall.description = A cheap defensive block.\nUseful for protecting the core and turrets in the first few waves. +block.copper-wall-large.description = A cheap defensive block.\nUseful for protecting the core and turrets in the first few waves.\nSpans multiple tiles. +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.\nDecent protection from enemies. +block.thorium-wall-large.description = A strong defensive block.\nDecent protection from enemies.\nSpans multiple tiles. +block.phase-wall.description = A wall coated with special phase-based reflective compound. Deflects most bullets upon impact. +block.phase-wall-large.description = A wall coated with special phase-based reflective compound. Deflects most bullets upon impact.\nSpans multiple tiles. +block.surge-wall.description = An extremely durable defensive block.\nBuilds up charge on bullet contact, releasing it randomly. +block.surge-wall-large.description = An extremely durable defensive block.\nBuilds up charge on bullet contact, releasing it randomly.\nSpans multiple tiles. +block.door.description = A small door. Can be opened or closed by tapping. +block.door-large.description = A large door. Can be opened and closed by tapping.\nSpans multiple tiles. +block.mender.description = Periodically repairs blocks in its vicinity. Keeps defenses repaired in-between waves.\nOptionally uses silicon to boost range and efficiency. +block.mend-projector.description = An upgraded version of the Mender. Repairs blocks in its vicinity.\nOptionally uses phase fabric to boost range and efficiency. +block.overdrive-projector.description = Increases the speed of nearby buildings.\nOptionally uses phase fabric to boost range and efficiency. +block.force-projector.description = Creates a hexagonal force field around itself, protecting buildings and units inside from damage.\nOverheats if too much damage is sustained. Optionally uses coolant to prevent overheating. Phase fabric can be used to increase shield size. +block.shock-mine.description = Damages enemies stepping on the mine. Nearly invisible to the enemy. +block.conveyor.description = Basic item transport block. Moves items forward and automatically deposits them into blocks. Rotatable. +block.titanium-conveyor.description = Advanced item transport block. Moves items faster than standard conveyors. +block.junction.description = Acts as a bridge for two crossing conveyor belts. Useful in situations with two different conveyors carrying different materials to different locations. +block.bridge-conveyor.description = Advanced item transport block. Allows transporting items over up to 3 tiles of any terrain or building. +block.phase-conveyor.description = Advanced item transport block. Uses power to teleport items to a connected phase conveyor over several tiles. +block.sorter.description = Sorts items. If an item matches the selection, it is allowed to pass. Otherwise, the item is outputted to the left and right. +block.router.description = Accepts items, then outputs them to up to 3 other directions equally. Useful for splitting the materials from one source to multiple targets.\n\n[scarlet]Never use next to production inputs, as they will get clogged by output.[] +block.distributor.description = An advanced router. Splits items to up to 7 other directions equally. +block.overflow-gate.description = A combination splitter and router. Only outputs to the left and right if the front path is blocked. +block.mass-driver.description = The ultimate item transport block. Collects several items and then shoots them to another mass driver over a long range. Requires power to operate. +block.mechanical-pump.description = A cheap pump with slow output, but no power consumption. +block.rotary-pump.description = An advanced pump. Pumps more liquid, but requires power. +block.thermal-pump.description = The ultimate pump. +block.conduit.description = Basic liquid transport block. Moves liquids forward. Used in conjunction with pumps and other conduits. +block.pulse-conduit.description = An advanced liquid transport block. Transports liquids faster and stores more than standard conduits. +block.liquid-router.description = Accepts liquids from one direction and outputs them to up to 3 other directions equally. Can also store a certain amount of liquid. Useful for splitting the liquids from one source to multiple targets. +block.liquid-tank.description = Stores a large amount of liquids. Use for creating buffers in situations with non-constant demand of materials or as a safeguard for cooling vital blocks. +block.liquid-junction.description = Acts as a bridge for two crossing conduits. Useful in situations with two different conduits carrying different liquids to different locations. +block.bridge-conduit.description = Advanced liquid transport block. Allows transporting liquids over up to 3 tiles of any terrain or building. +block.phase-conduit.description = Advanced liquid transport block. Uses power to teleport liquids to a connected phase conduit over several tiles. +block.power-node.description = Transmits power to connected nodes. The node will receive power from or supply power to any adjacent blocks. +block.power-node-large.description = An advanced power node with greater range and more connections. +block.surge-tower.description = An extremely long-range power node with fewer available connections. +block.battery.description = Stores power as a buffer in times of surplus energy. Outputs power in times of deficit. +block.battery-large.description = Stores much more power than a regular battery. +block.combustion-generator.description = Generates power by burning flammable materials, such as coal. +block.thermal-generator.description = Generates power when placed in hot locations. +block.turbine-generator.description = An advanced combustion generator. More efficient, but requires additional water for generating steam. +block.differential-generator.description = Generates large amounts of energy. Utilizes the temperature difference between cryofluid and burning pyratite. +block.rtg-generator.description = A simple, reliable generator. Uses the heat of decaying radioactive compounds to produce energy at a slow rate. +block.solar-panel.description = Provides a small amount of power from the sun. +block.solar-panel-large.description = A significantly more efficient version of the standard solar panel. +block.thorium-reactor.description = Generates significant amounts of power from thorium. Requires constant cooling. Will explode violently if insufficient amounts of coolant are supplied. Power output depends on fullness, with base power generated at full capacity. +block.impact-reactor.description = An advanced generator, capable of creating massive amounts of power at peak efficiency. Requires a significant power input to kickstart the process. +block.mechanical-drill.description = A cheap drill. When placed on appropriate tiles, outputs items at a slow pace indefinitely. Only capable of mining basic resources. +block.pneumatic-drill.description = An improved drill, capable of mining titanium. Mines at a faster pace than a mechanical drill. +block.laser-drill.description = Allows drilling even faster through laser technology, but requires power. Capable of mining thorium. +block.blast-drill.description = The ultimate drill. Requires large amounts of power. +block.water-extractor.description = Extracts groundwater. Used in locations with no surface water available. +block.cultivator.description = Cultivates tiny concentrations of spores in the atmosphere into industry-ready pods. +block.oil-extractor.description = Uses large amounts of power, sand and water to drill for oil. +block.core-shard.description = The first iteration of the core capsule. Once destroyed, all contact to the region is lost. Do not let this happen. +block.core-foundation.description = The second version of the core. Better armored. Stores more resources. +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.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. +block.scatter.description = An essential anti-air turret. Sprays clumps of lead or scrap flak at enemy units. +block.scorch.description = Burns any ground enemies close to it. Highly effective at close range. +block.hail.description = A small, long-range artillery turret. +block.wave.description = A medium-sized turret. Shoots streams of liquid at enemies. Automatically extinguishes fires when supplied with water. +block.lancer.description = A medium-sized anti-ground laser turret. Charges and fires powerful beams of energy. +block.arc.description = A small close-range electric turret. Fires arcs of electricity at enemies. +block.swarmer.description = A medium-sized missile turret. Attacks both air and ground enemies. Fires homing missiles. +block.salvo.description = A larger, more advanced version of the Duo turret. Fires quick salvos of bullets at the enemy. +block.fuse.description = A large, close-range energy turret. Fires three piercing beams at nearby enemies. +block.ripple.description = An extremely powerful artillery turret. Shoots clusters of shells at enemies over long distances. +block.cyclone.description = A large anti-air and anti-ground turret. Fires explosive clumps of flak at nearby units. +block.spectre.description = A massive dual-barreled cannon. Shoots large armor-piercing bullets at air and ground targets. +block.meltdown.description = A massive laser cannon. Charges and fires a persistent laser beam at nearby enemies. Requires coolant to operate. +block.draug-factory.description = Produces Draug mining drones. +block.spirit-factory.description = Produces Spirit structural repair drones. +block.phantom-factory.description = Produces advanced construction drones. +block.wraith-factory.description = Produces fast, hit-and-run interceptor units. +block.ghoul-factory.description = Produces heavy carpet bombers. +block.revenant-factory.description = Produces heavy missile-based units. +block.dagger-factory.description = Produces basic ground units. +block.crawler-factory.description = Produces fast self-destructing swarm units. +block.titan-factory.description = Produces advanced, armored ground units. +block.fortress-factory.description = Produces heavy artillery ground units. +block.repair-point.description = Continuously heals the closest damaged unit in its vicinity. +block.dart-mech-pad.description = Provides transformation into a basic attack mech.\nUse by tapping while standing on it. +block.delta-mech-pad.description = Provides transformation into a lightly armored hit-and-run attack mech.\nUse by tapping while standing on it. +block.tau-mech-pad.description = Provides transformation into an advanced support mech.\nUse by tapping while standing on it. +block.omega-mech-pad.description = Provides transformation into a heavily-armored missile mech.\nUse by tapping while standing on it. +block.javelin-ship-pad.description = Provides transformation into a quick, lightly-armored interceptor.\nUse by tapping while standing on it. +block.trident-ship-pad.description = Provides transformation into a heavy support bomber.\nUse by tapping while standing on it. +block.glaive-ship-pad.description = Provides transformation into a large, well-armored gunship.\nUse by tapping while standing on it. \ No newline at end of file diff --git a/core/assets/bundles/bundle_fr.properties b/core/assets/bundles/bundle_fr.properties index 68f8ca7b64..b6d9e879a0 100644 --- a/core/assets/bundles/bundle_fr.properties +++ b/core/assets/bundles/bundle_fr.properties @@ -10,6 +10,7 @@ link.dev-builds.description = Versions instables du jeu link.trello.description = Trello officiel pour les ajouts futurs link.itch.io.description = Page itch.io avec lien de téléchargement pour PC link.google-play.description = Google Play Store +link.f-droid.description = Catalogue F-Droid link.wiki.description = Le wiki officiel de Mindustry linkfail = Erreur lors de l'ouverture du lien !\nL'URL a été copiée dans votre presse papier. screenshot = Capture d'écran sauvegardée à {0} @@ -18,12 +19,14 @@ gameover = Game over gameover.pvp = L'équipe [accent] {0}[] a gagné ! highscore = [accent]Nouveau meilleur score! copied = Copié. + load.sound = Sons load.map = Cartes load.image = Images load.content = Contenu load.system = Système load.mod = Mods + schematic = Schéma schematic.add = Sauvegarder le schéma... schematics = Schémas @@ -40,6 +43,7 @@ schematic.saved = Schéma sauvegardé. schematic.delete.confirm = Ce schéma sera complètement éradiqué. schematic.rename = Renommer le schéma schematic.info = {0}x{1}, {2} blocs + stat.wave = Vagues vaincues:[accent] {0} stat.enemiesDestroyed = Ennemis détruits:[accent] {0} stat.built = Bâtiments construits:[accent] {0} @@ -47,6 +51,7 @@ stat.destroyed = Bâtiments détruits:[accent] {0} stat.deconstructed = Bâtiments déconstruits:[accent] {0} stat.delivered = Ressources transférées: stat.rank = Rang Final: [accent]{0} + launcheditems = [accent]Ressources transférées launchinfo = [unlaunched][[LANCER] votre noyau pour obtenir les objets indiqués en bleu. map.delete = Êtes-vous certain(e) de vouloir supprimer la carte "[accent]{0}[]"? @@ -74,6 +79,7 @@ maps.browse = Parcourir les cartes continue = Continuer maps.none = [lightgray]Aucune carte trouvée! invalid = Invalide +pickcolor = Choisir la Couleur preparingconfig = Préparation de la configuration preparingcontent = Préparation du contenu uploadingcontent = Publication du contenu @@ -81,6 +87,7 @@ uploadingpreviewfile = Publication du fichier d'aperçu committingchanges = Validation des modifications done = Fait feature.unsupported = Votre appareil ne supporte pas cette fonctionnalité. + mods.alphainfo = Gardez à l'esprit que les mods sont en alpha et[scarlet] peuvent être très buggés[].\nMerci de signaler les problèmes que vous rencontrez via le GitHub ou le Discord Mindustry. mods.alpha = [accent](Alpha) mods = Mods @@ -92,6 +99,7 @@ mod.enabled = [lightgray]Activé mod.disabled = [scarlet]Désactivé mod.disable = Désactiver mod.delete.error = Unable to delete mod. File may be in use. +mod.requiresversion = [scarlet]Version du jeu requise : [accent]{0} mod.missingdependencies = [scarlet]Dépendances manquantes: {0} mod.nowdisabled = [scarlet]Le mod '{0}' a des dépendances manquantes:[accent] {1}\n[lightgray]Ces mods doivent d'abord être téléchargés.\nCe mod sera automatiquement désactivé. mod.enable = Activer @@ -104,6 +112,7 @@ mod.author = [LIGHT_GRAY]Auteur:[] {0} mod.missing = Cette sauvegarde contient des mods que vous avez récemment mis à jour ou que vous avez désinstallés. Votre sauvegarde risque d'être corrompue. Êtes-vous sûr de vouloir l'importer?\n[lightgray]Mods:\n{0} mod.preview.missing = Avant de publier ce mod dans le workshop, vous devez ajouter une image servant d'aperçu.\nPlacez une image nommée[accent] preview.png[] dans le dossier du mod et réessayez. mod.folder.missing = Seuls les mods sous forme de dossiers peuvent être publiés sur l'atelier.\nPour convertir n'importe quel mod en un dossier, dézippez-le tout simplement dans un dossier et supprimez l'ancien zip, puis redémarrez votre jeu ou rechargez vos mods. + about.button = À propos name = Nom: noname = Commencer par choisir un[accent] nom de joueur[]. @@ -271,6 +280,7 @@ publishing = [accent]Publication... publish.confirm = Êtes-vous sûr de vouloir publier ceci ?\n\n[lightgray]Assurez-vous d'être d'abord d'accord avec les CGU du workshop, sinon vos éléments n'apparaîtront pas ! publish.error = Erreur de publication de l'élément: {0} steam.error = Failed to initialize Steam services.\nError: {0} + editor.brush = Pinceau editor.openin = Ouvrir dans l'éditeur editor.oregen = Génération de minerais @@ -347,6 +357,7 @@ editor.overwrite = [accent]Attention!\nCeci écrase une carte existante. editor.overwrite.confirm = [scarlet]Attention![] Une carte avec ce nom existe déjà. Êtes-vous sûr de vouloir l'écraser? editor.exists = Une carte avec ce nom existe déjà. editor.selectmap = Sélectionnez une carte: + toolmode.replace = Remplacer toolmode.replace.description = Dessiner seulement sur les blocs solides. toolmode.replaceall = Tout remplacer @@ -361,6 +372,7 @@ toolmode.fillteams = Remplir les équipes toolmode.fillteams.description = Rempli les équipes au lieu des blocs. toolmode.drawteams = Dessiner les équipes toolmode.drawteams.description = Dessine les équipes au lieu de blocs. + filters.empty = [lightgray]Aucun filtre! Ajoutez-en un avec les boutons ci-dessous. filter.distort = Déformation filter.noise = Bruit @@ -392,6 +404,7 @@ filter.option.floor2 = Sol secondaire filter.option.threshold2 = Seuil secondaire filter.option.radius = Rayon filter.option.percentile = Centile + width = Largeur: height = Hauteur: menu = Menu @@ -407,6 +420,7 @@ tutorial = Tutoriel tutorial.retake = Refaire le Tutoriel editor = Éditeur mapeditor = Éditeur de carte + abandon = Abandonner abandon.text = Cette zone et toutes ses ressources vont être perdues. locked = Verrouillé @@ -437,6 +451,7 @@ zone.objective.survival = Survivre zone.objective.attack = Détruire le noyau ennemi add = Ajouter... boss.health = Santé du Boss + connectfail = [crimson]Échec de la connexion au serveur :\n\n[accent]{0} error.unreachable = Serveur injoignable.\nL'adresse IP est correcte? error.invalidaddress = Adresse invalide. @@ -447,6 +462,7 @@ error.mapnotfound = Carte introuvable! error.io = Erreur de Réseau (I/O) error.any = Erreur réseau inconnue error.bloom = Échec de l'initialisation du flou lumineux.\nVotre appareil peux ne pas le supporter. + zone.groundZero.name = Première Bataille zone.desertWastes.name = Désert Sauvage zone.craters.name = Les Cratères @@ -461,6 +477,7 @@ zone.saltFlats.name = Marais Salants zone.impact0078.name = Impact 0078 zone.crags.name = Rochers zone.fungalPass.name = Passe Fongique + zone.groundZero.description = L'emplacement optimal pour débuter. Faible menace ennemie. Peu de ressources. \nRecueillez autant de plomb et de cuivre que possible.\nRien d'autre à signaler. zone.frozenForest.description = Même ici, plus près des montagnes, les spores se sont propagées. Les températures glaciales ne pourront pas les contenir pour toujours.\n\nFamiliarisez vous avec l'Énergie. Construisez des générateurs a combustion. Apprenez a utiliser les réparateurs. zone.desertWastes.description = Cette étendue désertique est immense, imprévisible. On y croise des structures abandonnées.\nLe charbon est présent dans la région. Brûlez-le pour générer de l'Énergie ou synthétisez-le en graphite.\n\n[lightgray]Ce lieu d'atterisage est imprévisible. @@ -475,10 +492,12 @@ zone.nuclearComplex.description = Une ancienne installation de production et tra zone.fungalPass.description = Une zone de transition entre les hautes montagnes et les basses régions infestées de spores. Une petite base de reconnaissance ennemie s'y trouve.\nDétruisez la.\nUtilisez les unités Poignard et Rampeurs. Détruisez les deux noyaux. zone.impact0078.description = zone.crags.description = + settings.language = Langue settings.data = Données du Jeu settings.reset = Valeurs par Défaut settings.rebind = Réattribuer +settings.resetKey = Réinitialiser settings.controls = Contrôles settings.game = Jeu settings.sound = Son @@ -494,8 +513,8 @@ no = Non info.title = Info error.title = [crimson]Une erreur s'est produite error.crashtitle = Une erreur s'est produite -blocks.input = Input -blocks.output = Output +blocks.input = Entrée +blocks.output = Sortie blocks.booster = Booster block.unknown = [lightgray]??? blocks.powercapacity = Capacité d'énergie @@ -529,9 +548,10 @@ blocks.inaccuracy = Imprécision blocks.shots = Tirs blocks.reload = Tirs/Seconde blocks.ammo = Munitions + bar.drilltierreq = Foreuse Améliorée Requise -bar.drillspeed = Vitesse de forage: {0}/s -bar.pumpspeed = Pump Speed: {0}/s +bar.drillspeed = Vitesse de Forage: {0}/s +bar.pumpspeed = Vitesse de Pompage: {0}/s bar.efficiency = Efficacité: {0}% bar.powerbalance = Énergie: {0}/s bar.powerstored = Stocké: {0}/{1} @@ -544,6 +564,9 @@ bar.heat = Chaleur bar.power = Énergie bar.progress = Progression de la construction bar.spawned = Unités: {0}/{1} +bar.input = Entrée +bar.output = Sortie + bullet.damage = [stat]{0}[lightgray] dégâts bullet.splashdamage = [stat]{0}[lightgray] dégâts de zone ~[stat] {1}[lightgray] blocs bullet.incendiary = [stat]incendiaire @@ -555,6 +578,7 @@ bullet.freezing = [stat]gel bullet.tarred = [stat]goudronné bullet.multiplier = [stat]{0}[lightgray]x multiplicateur de munitions bullet.reload = [stat]{0}[lightgray]x vitesse de tir + unit.blocks = blocs unit.powersecond = énergie/seconde unit.liquidsecond = unité de liquide/seconde @@ -567,6 +591,8 @@ unit.persecond = /sec unit.timesspeed = x vitesse unit.percent = % unit.items = objets +unit.thousands = k +unit.millions = mil category.general = Général category.power = Énergie category.liquids = Liquides @@ -576,9 +602,10 @@ category.shooting = Défense category.optional = Améliorations optionnelles setting.landscape.name = Verrouiller en rotation paysage setting.shadows.name = Ombres -setting.blockreplace.name = Automatic Block Suggestions +setting.blockreplace.name = Suggestions Automatiques de Blocs setting.linear.name = Filtrage Linéaire setting.hints.name = Astuces +setting.buildautopause.name = Pause Automatique de la Construction setting.animatedwater.name = Eau animée setting.animatedshields.name = Boucliers Animés setting.antialias.name = Antialias[lightgray] (redémarrage du jeu nécessaire)[] @@ -599,14 +626,17 @@ setting.difficulty.insane = Extrême setting.difficulty.name = Difficulté: setting.screenshake.name = Tremblement de l'écran setting.effects.name = Afficher les effets -setting.destroyedblocks.name = Display Destroyed Blocks -setting.conveyorpathfinding.name = Conveyor Placement Pathfinding +setting.destroyedblocks.name = Afficher les Blocs Détruits +setting.conveyorpathfinding.name = Recherche de Chemin pour le Placement de Convoyeurs setting.sensitivity.name = Sensibilité de la manette setting.saveinterval.name = Intervalle des sauvegardes auto setting.seconds = {0} secondes +setting.blockselecttimeout.name = Délai d'Attente de Sélection de Bloc +setting.milliseconds = {0} millisecondes setting.fullscreen.name = Plein Écran setting.borderlesswindow.name = Fenêtre sans bords (Borderless)[lightgray] (peut nécessiter le redémarrage du jeu) setting.fps.name = Afficher FPS +setting.blockselectkeys.name = Afficher les Touches de Sélection de Bloc setting.vsync.name = VSync setting.pixelate.name = Pixeliser[lightgray] (désactive les animations) setting.minimap.name = Afficher la Minimap @@ -635,16 +665,36 @@ category.multiplayer.name = Multijoueur command.attack = Attaque command.rally = Rassembler command.retreat = Retraite +placement.blockselectkeys = \n[lightgray]Touche: [{0}, keybind.clear_building.name = Effacer les constructions keybind.press = Appuyer sur une touche... keybind.press.axis = Appuyer sur un axe ou une touche... keybind.screenshot.name = Capture d'écran -keybind.move_x.name = Mouvement x -keybind.move_y.name = Mouvement y +keybind.toggle_power_lines.name = Montrer/Cacher les Connections d'Énergie +keybind.move_x.name = Mouvement X +keybind.move_y.name = Mouvement Y +keybind.mouse_move.name = Suivre la Souris +keybind.dash.name = Sprint keybind.schematic_select.name = Sélectionner une région keybind.schematic_menu.name = Menu des schéma keybind.schematic_flip_x.name = Retourner le schéma sur l'axe X keybind.schematic_flip_y.name = Retourner le schéma sur l'axe Y +keybind.category_prev.name = Catégorie Précédente +keybind.category_next.name = Catégorie Suivante +keybind.block_select_left.name = Sélectionner Bloc de Gauche +keybind.block_select_right.name = Sélectionner Bloc de Droite +keybind.block_select_up.name = Sélectionner Bloc en Haut +keybind.block_select_down.name = Sélectionner Bloc en Bas +keybind.block_select_01.name = Sélectionner Catégorie/Bloc 1 +keybind.block_select_02.name = Sélectionner Catégorie/Bloc 2 +keybind.block_select_03.name = Sélectionner Catégorie/Bloc 3 +keybind.block_select_04.name = Sélectionner Catégorie/Bloc 4 +keybind.block_select_05.name = Sélectionner Catégorie/Bloc 5 +keybind.block_select_06.name = Sélectionner Catégorie/Bloc 6 +keybind.block_select_07.name = Sélectionner Catégorie/Bloc 7 +keybind.block_select_08.name = Sélectionner Catégorie/Bloc 8 +keybind.block_select_09.name = Sélectionner Catégorie/Bloc 9 +keybind.block_select_10.name = Sélectionner Catégorie/Bloc 10 keybind.fullscreen.name = Basculer en Plein Écran keybind.select.name = Sélectionner/Tirer keybind.diagonal_placement.name = Placement en diagonale @@ -658,18 +708,17 @@ keybind.menu.name = Menu keybind.pause.name = Pause keybind.pause_building.name = Pauser/Reprendre la construction keybind.minimap.name = Minimap -keybind.dash.name = Sprint keybind.chat.name = Chat -keybind.player_list.name = Liste des joueurs +keybind.player_list.name = Liste des Joueurs keybind.console.name = Console keybind.rotate.name = Tourner keybind.rotateplaced.name = Tourner existant (maintenir) -keybind.toggle_menus.name = Cacher/afficher les menus -keybind.chat_history_prev.name = Remonter l'historique du chat -keybind.chat_history_next.name = Descendre l'historique du chat -keybind.chat_scroll.name = Défilement du chat +keybind.toggle_menus.name = Cacher/Afficher les Menus +keybind.chat_history_prev.name = Remonter l'Historique du Chat +keybind.chat_history_next.name = Descendre l'Historique du Chat +keybind.chat_scroll.name = Défilement du Chat keybind.drop_unit.name = Larguer l'unité -keybind.zoom_minimap.name = Zoom minimap +keybind.zoom_minimap.name = Zoom Minimap mode.help.title = Description des modes de jeu mode.survival.name = Survie mode.survival.description = Le mode normal. Ressources limitées et vagues automatiques.\n[gray]Nécessite un point d'apparition pour les ennemis. @@ -681,7 +730,9 @@ mode.pvp.description = Battez-vous contre d'autres joueurs en local.\n[gray]Requ mode.attack.name = Attaque mode.attack.description = Pas de vagues, le but étant de détruire la base ennemie.\n[gray]Requiert un noyaux rouge dans la map pour y jouer. mode.custom = Règles personnalisées + rules.infiniteresources = Ressources infinies +rules.reactorexplosions = Explosion des Réacteurs rules.wavetimer = Minuterie pour les vagues rules.waves = Vagues rules.attack = Mode d'Attaque @@ -707,6 +758,10 @@ rules.title.resourcesbuilding = Ressources & Construction rules.title.player = Joueurs rules.title.enemy = Ennemis rules.title.unit = Unités +rules.title.experimental = Expérimental +rules.lighting = Éclairage +rules.ambientlight = Éclairage Ambiant + content.item.name = Objets content.liquid.name = Liquides content.unit.name = Unités @@ -753,6 +808,7 @@ mech.trident-ship.name = Trident mech.trident-ship.weapon = Bombes mech.glaive-ship.name = Glaive mech.glaive-ship.weapon = Mitraille incendiaire +item.corestorable = [lightgray]Stockable dans le Noyau: {0} item.explosiveness = [LIGHT_GRAY]Explosivité: {0} item.flammability = [LIGHT_GRAY]Inflammabilité: {0} item.radioactivity = [LIGHT_GRAY]Radioactivité: {0} @@ -768,6 +824,7 @@ mech.buildspeed = [LIGHT_GRAY]Vitesse de Construction: {0}% liquid.heatcapacity = [LIGHT_GRAY]Capacité Thermique: {0} liquid.viscosity = [LIGHT_GRAY]Viscosité: {0} liquid.temperature = [LIGHT_GRAY]Température: {0} + block.sand-boulder.name = Bloc de Sable block.grass.name = Herbe block.salt.name = Sel @@ -866,6 +923,8 @@ block.distributor.name = Distributeur block.sorter.name = Trieur block.inverted-sorter.name = Trieur Inversé block.message.name = Message +block.illuminator.name = Illuminateur +block.illuminator.description = Une petite source lumineuse compacte et configurable. Nécessite de l'énergie pour fonctionner. block.overflow-gate.name = Barrière de Débordement block.silicon-smelter.name = Fonderie de Silicium block.phase-weaver.name = Tisseur à Phase @@ -879,6 +938,7 @@ block.coal-centrifuge.name = Centrifugeur à Charbon block.power-node.name = Transmetteur Énergétique block.power-node-large.name = Grand Transmetteur Énergétique block.surge-tower.name = Tour de Surtension +block.diode.name = Diode de Batterie block.battery.name = Batterie block.battery-large.name = Grande Batterie block.combustion-generator.name = Générateur à Combustion @@ -931,6 +991,7 @@ block.fortress-factory.name = Usine de Méchas Forteresses block.revenant-factory.name = Usine de Combattants Revenants block.repair-point.name = Point de Réparation block.pulse-conduit.name = Conduit à Impulsion +block.plated-conduit.name = Conduit Plaqué block.phase-conduit.name = Conduit Phasé block.liquid-router.name = Routeur de Liquide block.liquid-tank.name = Réservoir à Liquide @@ -938,7 +999,7 @@ block.liquid-junction.name = Jonction à Liquide block.bridge-conduit.name = Conduit Surélevé block.rotary-pump.name = Pompe Rotative block.thorium-reactor.name = Réacteur à Thorium -block.mass-driver.name = Transporteur de Masses +block.mass-driver.name = Catapulte Électromagnétique block.blast-drill.name = Foreuse à Explosion block.thermal-pump.name = Pompe Thermique block.thermal-generator.name = Générateur Thermique @@ -982,7 +1043,7 @@ unit.eradicator.name = Éradicateur unit.lich.name = Liche unit.reaper.name = Faucheur tutorial.next = [lightgray] -tutorial.intro = Vous venez de commencer le [scarlet]Tutoriel de Mindustry.[]\nUtilisez [[ZQSD] pour vous déplacer.\n[accent]Maintenez [[Ctrl] tout en faisant rouler la molette de la souris[] pour zoomer et dézoomer.\nCommencez en minant du [accent]cuivre[]. Pour cela, rapprochez vous de la veine de minerais de cuivre près de votre noyau et faites un clic gauche dessus.\n\n[accent]{0}/{1} cuivre +tutorial.intro = Vous venez de commencer le [scarlet]Tutoriel de Mindustry.[]\nUtilisez [accent][[ZQSD][] pour vous déplacer.\n[accent]Maintenez [[Ctrl] tout en faisant rouler la molette de la souris[] pour zoomer et dézoomer.\nCommencez en minant du [accent]cuivre[]. Pour cela, rapprochez vous de la veine de minerais de cuivre près de votre noyau et faites un clic gauche dessus.\n\n[accent]{0}/{1} cuivre tutorial.intro.mobile = Vous venez de commencer le [scarlet]Tutoriel de Mindustry.[]\nBalayez l'écran pour vous déplacer.\n[accent] Pincer avec deux doigts [] afin d'agrandir et rétrécir la perspective.\nCommencez en[accent] minant du cuivre[]. Pour cela, appuyez sur une veine de minerai de cuivre près de votre noyau.\n\n[accent]{0}/{1} cuivre tutorial.drill = Miner manuellement est inefficace.\n[accent]Les foreuses []peuvent miner pour vous.\nCliquez sur l'onglet des foreuses en bas à droite.\nSélectionnez la [accent]foreuse mécanique[]. Placez-la sur une veine de cuivre en cliquant.\n[accent]Faite un clique-droit[] pour arrêter la construction. tutorial.drill.mobile = Miner manuellement est inefficace.\n[accent]Les foreuses []peuvent miner pour vous.\nAppuyez sur l'onglet des foreuses en bas à droite.\nSélectionnez la [accent]foreuse mécanique[].\nPlacez-la sur une veine de cuivre en y appuyant, puis en touchant la[accent] coche[] pour confirmer votre placement.\nAppuyez sur le [accent]bouton en forme de croix[] pour annuler le placement. @@ -1002,6 +1063,7 @@ tutorial.deposit = Déposez des ressources dans des blocs en les faisant glisser tutorial.waves = L'[lightgray] ennemi[] approche.\n\nDéfendez le noyau pendant 2 vagues.[accent] Cliquez[] pour tirer.\nConstruisez plus de tourelles et de foreuses. Minez plus de cuivre. tutorial.waves.mobile = L'[lightgray] ennemi[] approche.\n\nDéfendez le noyau pendant 2 vagues. Votre vaisseau tirera automatiquement sur les ennemis.\nConstruisez plus de tourelles et de foreuses. Minez plus de cuivre. tutorial.launch = Une fois que vous aurez atteint une vague spécifique, vous aurez la possibilité de[accent] faire décoller le noyau[], abandonnant vos défenses mais [accent]sécurisant toutes les ressources stockées dans votre noyau.[]\nCes ressources peuvent ensuite être utilisées pour rechercher de nouvelles technologies.\n\n[accent]Appuyez sur le bouton de lancement. + item.copper.description = Le matériau structurel de base. Utilisé intensivement dans tout les blocs. item.lead.description = Un matériau de départ. Utilisé intensivement en électronique et dans les blocs de transport de liquides. item.metaglass.description = Un composé de vitre super-résistant. Utilisé largement pour le transport et le stockage de liquides. @@ -1026,7 +1088,7 @@ mech.alpha-mech.description = Le mécha standard. Est basé sur une unité Poign mech.delta-mech.description = Un mécha rapide, avec une armure légère, conçu pour les attaques de frappe. Il inflige, par contre, peu de dégâts aux structures. Néanmoins il peut tuer de grand groupes d'ennemis très rapidement avec ses arcs électriques. mech.tau-mech.description = Un mécha de support. Soigne les blocs alliés en tirant dessus. Il peut aussi éteindre les feux et soigner ses alliés en zone avec sa compétence. mech.omega-mech.description = Un mécha cuirassé et large fait pour les assauts frontaux. Sa compétence lui permet de bloquer 90% des dégâts. -mech.dart-ship.description = Le vaisseau standard. Raisonnablement rapide et léger. Il a néanmoins peu d'attaque et une faible vitesse de minage. +mech.dart-ship.description = Le vaisseau standard. Il est raisonnablement rapide, léger et possède une vitesse de minage rapide. Néanmoins, ses capacités d'attaque sont faibles. mech.javelin-ship.description = Un vaisseau de frappe éclair qui, bien que lent au départ, peut accélérer pour atteindre de très grandes vitesses et voler jusqu'aux avant-postes ennemis, faisant d'énormes dégâts avec ses arc électriques obtenus à vitesse maximum et ses missiles. mech.trident-ship.description = Un bombardier lourd, conçu pour la construction et pour la destruction des fortifications ennemies. Assez bien blindé. mech.glaive-ship.description = Un grand vaisseau de combat cuirassé. Équipé avec un fusil automatique à munitions incendiaires. Est très maniable. @@ -1083,21 +1145,22 @@ block.overdrive-projector.description = Accélère les bâtiments autour de lui, block.force-projector.description = Crée un champ de force hexagonal autour de lui qui protège les bâtiments et les unités à l'intérieur des dégâts.\nSurchauffe si trop de dégâts sont reçus. Peut utiliser du liquide réfrigérant pour éviter la surchauffe. Peut utiliser du tissu phasé pour booster la taille du bouclier. block.shock-mine.description = Blesse les ennemis qui marchent dessus. Quasiment invisible pour l'ennemi. block.conveyor.description = Convoyeur basique servant à transporter des objets. Les objets déplacés en avant sont automatiquement déposés dans les tourelles ou les bâtiments. Peut être tourné. -block.titanium-conveyor.description = Convoyeur avancé . Déplace les objets plus rapidement que les convoyeurs standards. +block.titanium-conveyor.description = Convoyeur avancé. Déplace les objets plus rapidement que les convoyeurs standards. block.junction.description = Agit comme un pont pour deux lignes de convoyeurs se croisant. Utile lorsque deux différents convoyeurs déplacent différents matériaux à différents endroits. block.bridge-conveyor.description = Bloc de transport avancé permettant de traverser jusqu'à 3 blocs de n'importe quel terrain ou bâtiment. -block.phase-conveyor.description = Convoyeur très avancé. Utilise de l'énergie pour téléporter des objets à un convoyeur phasé connecté jusqu'à une longue distance . -block.sorter.description = Trie les articles. Si un article correspond à la sélection, il peut passer. Autrement, l'article est distribué vers la gauche ou la droite. -block.inverted-sorter.description = Trie les articles comme un trieur standard, mais ceux correspondant à la sélection sont envoyés sur les côtés. +block.phase-conveyor.description = Convoyeur très avancé. Utilise de l'énergie pour téléporter des objets à un convoyeur phasé connecté jusqu'à une longue distance. +block.sorter.description = Trie les ressources. Si une ressource correspond à la sélection, elle peut passer. Autrement, elle est distribuée vers la gauche ou la droite. +block.inverted-sorter.description = Trie les ressources comme un trieur standard, mais ceux correspondant à la sélection sont envoyés sur les côtés. block.router.description = Accepte les objets depuis une ou plus directions et le renvoie dans n'importe quelle direction. Utile pour séparer une chaîne de convoyeurs en plusieurs.[accent]Le seul et l'Unique[] block.distributor.description = Un routeur avancé qui sépare les objets jusqu'à 7 autres directions équitablement. -block.overflow-gate.description = C'est la combinaison entre un Routeur et un Diviseur qui peut seulement distribuer à gauche et à droite si le chemin de devant est bloqué. -block.mass-driver.description = bâtiment de transport d'objet [accent]ultime[]. Collecte un grand nombre d'objets puis les tire à un autre transporteur de masse sur une très longue distance. -block.mechanical-pump.description = Une pompe de faible prix pompant lentement, mais ne consomme pas d'énergie. +block.overflow-gate.description = Bloc envoyant les ressources à gauche et à droite si le chemin de devant est bloqué. +block.mass-driver.description = Le moyen de transport de resources ultime. Collecte plusieurs ressources puis les envoie à une autre catapulte sur une longue distance. Nécessite de l'énergie pour fonctionner. +block.mechanical-pump.description = Une pompe de faible prix pompant lentement, mais ne consommant pas d'énergie. block.rotary-pump.description = Une pompe avancée plus rapide mais utilisant de l'énergie. -block.thermal-pump.description = La pompe ultime. Beaucoup plus rapide qu'une pompe mécanique et la seule pompe capable de récupérer de la lave. -block.conduit.description = Tuyau basique permettant le transport de liquide . Marche comme un convoyeur mais avec les liquides. Utile si utilisé avec des extracteurs, des pompes ou d'autres conduits. -block.pulse-conduit.description = Tuyau avancé permettant le transport de liquide . Transporte les liquides plus rapidement et en stocke plus que les tuyaux standards. +block.thermal-pump.description = La pompe ultime. +block.conduit.description = Bloc de transport de liquide de base. Fait avancer les liquides. Utilisé avec des pompes et autres conduits. +block.pulse-conduit.description = Tuyau avancé permettant le transport de liquide. Transporte les liquides plus rapidement et en stocke plus que les tuyaux standards. +block.plated-conduit.description = Déplace les liquides au même rythme que les conduits d'impulsion, mais possède plus d'armure. N'accepte pas de liquides provenant des côtés par autre chose que des conduits.\nFuit moins. block.liquid-router.description = Accepte les liquides en une direction et les rejette de tous les côtés équitablement. Peut aussi stocker une certaine quantité de liquide. Utile pour envoyer un liquide à plusieurs endroits. block.liquid-tank.description = Stocke une grande quantité de liquides . Utile pour réguler la sortie quand la demande est inconstante ou comme sécurité pour refroidir des bâtiments important. block.liquid-junction.description = Agit comme une intersection pour deux conduits se croisant.Utile si deux conduits amènent différents liquides à différents endroits. @@ -1106,11 +1169,12 @@ block.phase-conduit.description = Tuyau très avancé permettant le transport de block.power-node.description = Transmet l'énergie aux transmetteurs énergétiques connectés. Le transmetteur recevra de l'énergie ou la transmettra à n'importe quel bâtiment adjacent. block.power-node-large.description = Possède un rayon plus grand que le transmetteur énergétique standard, connectant d'autant plus de consommateurs ou transmetteurs d'énergie. block.surge-tower.description = Un transmetteur énergétique de très grande portée mais avec moins de connections disponibles. +block.diode.description = La batterie ne peut circuler dans ce bloc que dans un sens, mais uniquement si l’autre côté a moins d’énergie stockée. block.battery.description = Stocke l'énergie quand elle est en abondance et la redistribue si il y a un deficit d'énergie dans la limite des réserves disponibles. block.battery-large.description = Stocke bien plus d'énergie qu'une batterie normale. -block.combustion-generator.description = Génère de l'énergie en brûlant du charbon ou des matériaux inflammables. -block.thermal-generator.description = Génère une grande quantité d'énergie à partir de zone de chaleur . -block.turbine-generator.description = Plus efficace qu'un générateur à combustion, mais requiert de l'eau . +block.combustion-generator.description = Génère de l'énergie en brûlant du charbon ou d'autres matériaux inflammables. +block.thermal-generator.description = Génère une grande quantité d'énergie à partir de zone de chaleur. +block.turbine-generator.description = Plus efficace qu'un générateur à combustion, mais requiert de l'eau. block.differential-generator.description = Génère de grande quantité d'energie. Utilise différence de temperature entre le liquide cryogénique et la pyratite brûlante. block.rtg-generator.description = Un générateur thermo-électrique à radioisotope qui ne demande pas de refroidissement mais produit moins d'énergie qu'un réacteur à Thorium. block.solar-panel.description = Génère une faible quantité d'énergie grace au rayons du soleil. diff --git a/core/assets/bundles/bundle_it.properties b/core/assets/bundles/bundle_it.properties index d1f19ae8b1..7fb632244c 100644 --- a/core/assets/bundles/bundle_it.properties +++ b/core/assets/bundles/bundle_it.properties @@ -1,45 +1,50 @@ credits.text = Creato da [ROYAL]Anuken[] - [SKY]anukendev@gmail.com[] credits = Crediti contributors = Traduttori e Contributori -discord = Entra nel server discord di mindustry! -link.discord.description = la chatroom ufficiale del server discord di Mindustry +discord = Entra nel server Discord di mindustry! +link.discord.description = La chatroom ufficiale del server Discord di Mindustry link.reddit.description = The Mindustry subreddit link.github.description = Codice sorgente del gioco link.changelog.description = Elenco delle modifiche del gioco link.dev-builds.description = Build di sviluppo versioni instabili link.trello.description = Scheda ufficiale trello per funzionalità pianificate -link.itch.io.description = pagina di itch.io con download per PC e versione web +link.itch.io.description = Pagina di itch.io con download per PC e versione web link.google-play.description = Elenco di Google Play Store -link.wiki.description = wiki ufficiale di Mindustry +link.f-droid.description = Catalogo F-Droid +link.wiki.description = Wiki ufficiale di Mindustry linkfail = Impossibile aprire il link! L'URL è stato copiato. screenshot = Screenshot salvato a {0} screenshot.invalid = Mappa troppo grossa, probabilmente non c'è abbastanza memoria libera. -gameover = Il nucleo è stato distrutto. +gameover = Il Nucleo è stato distrutto. gameover.pvp = La squadra [accent] {0}[] ha vinto! highscore = [YELLOW]Nuovo record! + copied = Copiato. load.sound = Suoni load.map = Mappe load.image = Immagini -load.content = Content +load.content = Contenuti load.system = Sistema load.mod = Mods -schematic = Schematiche -schematic.add = Salva Schema... -schematics = Schemi -schematic.replace = A schematic by that name already exists. Replace it? -schematic.import = Importa schema... +load.scripts = Testi + +schematic = Schematica +schematic.add = Salva Schematica... +schematics = Schematiche +schematic.replace = Una schematica con questo nome esiste già. Sostituirla? +schematic.import = Importa schematica... schematic.exportfile = Esporta file schematic.importfile = Importa File schematic.browseworkshop = Naviga sul Workshop -schematic.copy = copia negli appunti +schematic.copy = Copia negli appunti schematic.copy.import = Importa dagli appunti schematic.shareworkshop = Condividi sul Workshop -schematic.flip = [accent][[{0}][]/[accent][[{1}][]: Flip Schematic -schematic.saved = Schema salvato. -schematic.delete.confirm = Questo schema sarà cancellato definitivamente. -schematic.rename = Rinomina schema -schematic.info = {0}x{1}, {2} blocks +schematic.flip = [accent][[{0}][]/[accent][[{1}][]: Ruota Schematica +schematic.saved = Schematica salvata. +schematic.delete.confirm = Questa schematica sarà cancellata definitivamente. +schematic.rename = Rinomina schematica +schematic.info = {0}x{1}, {2} blocchi + stat.wave = Ondate sconfitte:[accent] {0} stat.enemiesDestroyed = Nemici distrutti:[accent] {0} stat.built = Costruzioni erette:[accent] {0} @@ -47,30 +52,31 @@ stat.destroyed = Costruzioni distrutte:[accent] {0} stat.deconstructed = Costruzioni smantellate:[accent] {0} stat.delivered = Riorse lanciate: stat.rank = Livello finale: [accent]{0} -launcheditems = [accent]Oggetti lanciati -launchinfo = [unlaunched][[LAUNCH] il tuo core per ottenere gli oggetti indicati in blu. -map.delete = Sei sicuro di voler eliminare questa mappa"[accent]{0}[]"? -level.highscore = Miglior punteggio: [accent]{0} -level.select = Selezione del livello -level.mode = Modalità di gioco: -showagain = non mostrare più -coreattack = < Il nucleo è sotto attacco! > + +launcheditems = [accent]Oggetti Lanciati +launchinfo = [unlaunched][[LAUNCH] il tuo Nucleo per ottenere gli oggetti indicati in blu. +map.delete = Sei sicuro di voler eliminare la mappa"[accent]{0}[]"? +level.highscore = Miglior Punteggio: [accent]{0} +level.select = Selezione del Livello +level.mode = Modalità di Gioco: +showagain = Non mostrare più +coreattack = < Il Nucleo è sotto attacco! > nearpoint = [[ [scarlet]LASCIA LA ZONA NEMICA IMMEDIATAMENTE[] ]\nautodistruzione imminente -database = Database nucleo +database = Database Nucleo savegame = Salva loadgame = Carica -joingame = Unisciti al gioco -customgame = Gioco personalizzato +joingame = Unisciti al Gioco +customgame = Gioco Personalizzato newgame = Nuova partita -none = +none = minimap = Minimappa -position = Position +position = Posizione close = Chiuso website = Sito web quit = Esci save.quit = Salva ed esci maps = Mappe -maps.browse = Consulta Mappe +maps.browse = Esplora Mappe continue = Continua maps.none = [LIGHT_GRAY]Nessuna mappa trovata! invalid = Non valido @@ -80,66 +86,69 @@ uploadingcontent = Carico il contenuto uploadingpreviewfile = Carico file di anteprima committingchanges = Applico le modifiche done = Fatto -feature.unsupported = Your device does not support this feature. -mods.alphainfo = Tieni a mente che queste mod sono in alpha, e[scarlet] possono avere molti bug[].\nRiporta tutti i problemi che trovi in Mindustry su GitHub o Discord. +feature.unsupported = Il tuo dispositivo non supporta questa funzione. + +mods.alphainfo = Tieni a mente che queste Mod sono in alpha, e[scarlet] possono contenere molti bug[].\Segnala tutti i problemi che trovi su GitHub o Discord di Mindustry. mods.alpha = [accent](Alpha) mods = Mods -mods.none = [LIGHT_GRAY]Nessuna mod trovata! -mods.guide = guida per il modding! -mods.report = Riporta un bug -mods.openfolder = Open Mod Folder +mods.none = [LIGHT_GRAY]Nessuna Mod trovata! +mods.guide = Guida per il modding! +mods.report = Segnala un Bug +mods.openfolder = Apri Cartella Mod mod.enabled = [lightgray]Abilitato mod.disabled = [scarlet]Disabilitato mod.disable = Disabilita -mod.delete.error = Unable to delete mod. File may be in use. -mod.missingdependencies = [scarlet]Missing dependencies: {0} -mod.nowdisabled = [scarlet]Mod '{0}' is missing dependencies:[accent] {1}\n[lightgray]These mods need to be downloaded first.\nThis mod will be automatically disabled. +mod.delete.error = Impossibile eliminare questa Mod. Il file potrebbe essere in uso. +mod.missingdependencies = [scarlet]Dipendenze mancanti: {0} +mod.nowdisabled = [scarlet]Alla Mod '{0}' mancano delle dipendenze:[accent] {1}\n[lightgray]Queste Mod devono essere scaricate prima.\nQuesta Mod verrà disabilitata automaticamente. mod.enable = Abilita -mod.requiresrestart = . +mod.requiresrestart = Il gioco verrà chiuso per applicare i cambiamenti. mod.reloadrequired = [scarlet]Riavvio necessario -mod.import = Importa una mod -mod.import.github = Import GitHub Mod -mod.remove.confirm = Questa mod verrà cancellata. -mod.author = [LIGHT_GRAY]Author:[] {0} -mod.missing = Questo salvataggio contiene mod che hai recentemente aggiornato o non le hai piu installate. Il salvataggio può essere corrotto. sei sicuro di volerlo caricare?\n[lightgray]Mods:\n{0} -mod.preview.missing = Prima di pubblicare questa mod nel workshop, devi aggiungere un immagine di copertina.\nmetti un immagine[accent] preview.png[] nella cartella della mod e riprova . -mod.folder.missing = Solo mod in una cartella possono essere pubblicate nel workshop.\nPer pubblicare una mod, bisogna decompressare il file in una cartella e eliminare il file zip, dopo riavvia il gioco e ricarica la mod +mod.import = Importa una Mod +mod.import.github = Importa una Mod da GitHub +mod.item.remove = Questo item fa parte della Mod[accent] '{0}'[]. Per rimuoverlo, disinstalla questa Mod. +mod.remove.confirm = Questa Mod verrà eliminata. +mod.author = [LIGHT_GRAY]Autore:[] {0} +mod.missing = Questo salvataggio contiene Mod che hai recentemente aggiornato o non hai più installate. Il salvataggio potrebbe corrompersi. Sei sicuro di volerlo caricare?\n[lightgray]Mods:\n{0} +mod.preview.missing = Prima di pubblicare questa Mod nel Workshop, devi aggiungere un immagine di copertina.\nMetti un immagine[accent] con nome preview.png[] nella cartella della Mod e riprova. +mod.folder.missing = Solo le Mod in una cartella possono essere pubblicate nel Workshop.\nPer convertire una Mod in una cartella, decomprimi i suoi file in una cartella ed elimina il vecchio zip, quindi riavvia il gioco o ricarica le tue mods. + about.button = Info name = Nome: -noname = Scegli un [accent] nome[] prima di unirti. +noname = Scegli un[accent] nome[] prima di unirti. filename = Nome file: unlocked = Nuovo blocco scoperto! -completed = [accent]Completo +completed = [accent]Completato techtree = Albero scoperta research.list = [LIGHT_GRAY]Ricerca: research = Ricerca researched = [LIGHT_GRAY]{0} cercati. players = {0} giocatori online players.single = {0} giocatori online -server.closing = [accent]Chiusura server ... +server.closing = [accent]Chiusura server... server.kicked.kick = Sei stato cacciato dal server! -server.kicked.whitelist = Non sei presente in questa whitelist. +server.kicked.whitelist = Non sei presente nella whitelist. server.kicked.serverClose = Server chiuso. -server.kicked.vote = Sei stato cacciato su richiesta dei giocatori. Buona giornata. +server.kicked.vote = Sei stato cacciato su richiesta dei giocatori. Addio. server.kicked.clientOutdated = Versione del client obsoleta! Aggiorna il tuo gioco! server.kicked.serverOutdated = Server obsoleto! Chiedi all'host di aggiornare la versione del server! -server.kicked.banned = Sei bandito da questo server. -server.kicked.typeMismatch = Questo server non è compatibile con la tua build. +server.kicked.banned = Sei stato bandito da questo server. +server.kicked.typeMismatch = Questo server non è compatibile con il tuo client. server.kicked.playerLimit = Questo server è pieno. Attendi che si liberi un posto. server.kicked.recentKick = Sei stato cacciato di recente.\nAspetta prima di riconnetterti. server.kicked.nameInUse = C'è già qualcuno con il tuo nome su questo server. server.kicked.nameEmpty = Il tuo nome deve contenere almeno un carattere. server.kicked.idInUse = Sei già su questo server! Non è permesso connettersi con due account. -server.kicked.customClient = Questo server non supporta le build personalizzate. Scarica la versione ufficiale dal sito. +server.kicked.customClient = Questo server non supporta i client personalizzati. Scarica la versione ufficiale dal sito. server.kicked.gameover = Game over! -server.versions = Your version:[accent] {0}[]\nServer version:[accent] {1}[] -host.info = Il pulsante [accent]host [] ospita un server sulla porta [scarlet]6567[].[] Chiunque sulla stessa [LIGHT_GRAY]connessione wifi o rete locale[] dovrebbe essere in grado di vedere il server nell'elenco server.\n\n Se vuoi che le persone siano in grado di connettersi ovunque tramite IP, è richiesto il [accent]port forwarding[]. \n\n[LIGHT_GRAY]Nota: se qualcuno sta riscontrando problemi durante la connessione al gioco LAN, assicurati di aver consentito a Mindustry di accedere alla rete locale nelle impostazioni del firewall. -join.info = Qui è possibile inserire un [accent]IP del server[] a cui connettersi, o scoprire [accent]un server sulla rete locale[] disponibile.\n Sono supportati sia il multiplayer LAN che WAN. \n\n[LIGHT_GRAY]Nota: non esiste un elenco di server globali automatici; se si desidera connettersi a qualcuno tramite IP, è necessario chiedere all'host il proprio IP. +server.versions = Your version:[accent] {0}[]\nVersione server:[accent] {1}[] +host.info = Il pulsante [accent]host [] ospita un server sulla porta [scarlet]6567[].[] Chiunque sulla stessa [LIGHT_GRAY]rete wifi o locale[] dovrebbe essere in grado di vedere il server nell'elenco server.\n\n Se vuoi che le persone siano in grado di connettersi ovunque tramite il tuo IP, è richiesto il [accent]port forwarding[]. \n\n[LIGHT_GRAY]Nota: se qualcuno sta riscontrando problemi durante la connessione al gioco LAN, assicurati di aver consentito a Mindustry di accedere alla rete locale nelle impostazioni del firewall. +join.info = Qui è possibile inserire l'[accent]IP del server[] a cui connettersi, o scoprire [accent]un server sulla rete locale[] disponibile.\nSono supportati sia il multiplayer LAN che WAN. \n\n[LIGHT_GRAY]Nota: non esiste un elenco automatico dei server globali; se desideri connetterti a qualcuno tramite il suo IP, è necessario chiedere all'host il proprio IP. hostserver = Ospita Server invitefriends = Invita amici hostserver.mobile = Ospita\nServer host = Host -hosting = [accent] Apertura del server ... +hosting = [accent] Apertura del server... hosts.refresh = Aggiorna hosts.discovering = Ricerca partite LAN hosts.discovering.any = Ricerca partite @@ -152,7 +161,7 @@ trace.ip = IP: [accent]{0} trace.id = ID univoco: [accent]{0} trace.mobile = Mobile Client: [accent]{0} trace.modclient = Client personalizzato: [accent]{0} -invalidid = ID client non valido! Invia una segnalazione di bug. +invalidid = ID client non valido! Segnala un bug. server.bans = Lista Ban server.bans.none = Nessun giocatore bandito trovato! Finora tutto liscio. server.admins = Amministratori @@ -173,51 +182,51 @@ confirmunadmin = Sei sicuro di voler rimuovere lo stato di amministratore da que joingame.title = Unisciti alla Partita joingame.ip = IP: disconnect = Disconnesso. -disconnect.error = Connection error. -disconnect.closed = Connection closed. +disconnect.error = Errore di connessione. +disconnect.closed = Connessione chiusa. disconnect.timeout = Timed out. -disconnect.data = errore nel caricamento del mondo, mi dispiace! +disconnect.data = Errore durante il caricamento del mondo! cantconnect = Impossibile unirsi al server ([accent]{0}[]). -connecting = [accent]Connessione in corso ... -connecting.data = [accent]Caricamento dei dati del mondo ... +connecting = [accent]Connessione in corso... +connecting.data = [accent]Caricamento del mondo... server.port = Porta: server.addressinuse = Indirizzo già in uso! -server.invalidport = Numero di porta non valido! +server.invalidport = Numero porta non valido! server.error = [crimson]Errore nell'hosting del server: [accent] {0} save.new = Nuovo Salvataggio save.overwrite = Sei sicuro di voler sovrascrivere questo salvataggio? overwrite = Sovrascrivi save.none = Nessun salvataggio trovato! -saveload = [accent]Salvataggio ... -savefail = [crimson]Salvataggio del gioco NON riuscito! +saveload = [accent]Salvataggio in corso... +savefail = [crimson]Salvataggio del gioco non riuscito! save.delete.confirm = Sei sicuro di voler eliminare questo salvataggio? save.delete = Elimina save.export = Esporta Salvataggio save.import.invalid = [accent]Questo salvataggio non è valido! -save.import.fail = [crimson]Impossibile importare salvataggio: [accent]{0} +save.import.fail = [crimson]Impossibile importare il salvataggio: [accent]{0} save.export.fail = [crimson]Impossibile esportare il salvataggio: [accent]{0} save.import = Importa Salvataggio -save.newslot = Salva nome: +save.newslot = Nome: save.rename = Rinomina save.rename.text = Nuovo nome: selectslot = Seleziona un salvataggio. slot = [accent]Slot {0} -editmessage = Modifica messaggio +editmessage = Modifica Messaggio save.corrupted = [orang]Salvataggio corrotto o non valido! -empty = +empty = on = On off = Off -save.autosave = Salvataggio automatico: {0} +save.autosave = Salvataggio Automatico: {0} save.map = Mappa: {0} save.wave = Ondata: {0} save.mode = Gamemode: {0} -save.date = Ultimo salvataggio: {0} -save.playtime = Tempo di gioco: {0} +save.date = Ultimo Salvataggio: {0} +save.playtime = Tempo di Gioco: {0} warning = Attenzione confirm = Conferma delete = Elimina view.workshop = Vedi nel Workshop -workshop.listing = Edit Workshop Listing +workshop.listing = Modifica l'elenco del Workshop ok = OK open = Apri customize = Personalizza @@ -229,14 +238,14 @@ data.export = Esporta Salvataggio data.import = Importa Salvataggio data.exported = Dati esportati. data.invalid = Questi non sono dati di gioco validi. -data.import.confirm = Importare dati di gioco esterni eliminerà[scarlet] tutti[] i tuoi progressi attuali.\n[accent]L'operazione è irreversibile![]\n\nUna volta importati i dati, il gioco si chiuderà immediatamente. -classic.export = Esporta dati classici -classic.export.text = [accent]Mindustry[] ha appena rilasciato un aggiornamento importante.\nSalvataggio Classic (v3.5 build 40) o dati delle mappe è stato ritrovato. Vorresti esportare questi salvatagggi sul tuo telefono per usarli nella Mindustry Classic app? +data.import.confirm = Importare dati di gioco esterni sovrascriverà[scarlet] tutti[] i tuoi progressi attuali.\n[accent]L'operazione è irreversibile![]\n\nUna volta importati i dati, il gioco si chiuderà immediatamente. +classic.export = Esporta Dati Classici +classic.export.text = [accent]Mindustry[] ha appena rilasciato un aggiornamento importante.\nSalvataggio Classic (v3.5 build 40) o dati delle mappe è stato ritrovato. Vuoi esportare questi salvatagggi sul tuo telefono per usarli nella Mindustry Classic app? quit.confirm = Sei sicuro di voler uscire? -quit.confirm.tutorial = Sei sicuro di sapere cosa stai facendo? Il tutorial può essere ripetuto in[accent] Gioca > Tutorial.[] -loading = [accent]Caricamento in corso ... -reloading = [accent]Reloading Mods... -saving = [accent]Salvando ... +quit.confirm.tutorial = Sei sicuro di sapere cosa stai facendo? Il tutorial può essere ripetuto in[accent]\nImpostazioni -> Gioco -> Ripeti il Tutorial.[] +loading = [accent]Caricamento in Corso... +reloading = [accent]Ricaricamento delle mods... +saving = [accent]Salvataggio in corso... cancelbuilding = [accent][[{0}][] to clear plan selectschematic = [accent][[{0}][] to select+copy pausebuilding = [accent][[{0}][] to pause building @@ -245,7 +254,7 @@ wave = [accent]Ondata {0} wave.waiting = [LIGHT_GRAY]Ondata tra {0} wave.waveInProgress = [LIGHT_GRAY]Ondata in corso... waiting = In attesa... -waiting.players = Aspettando giocatori... +waiting.players = Attendendo giocatori... wave.enemies = [LIGHT_GRAY]{0} Nemici Rimasti wave.enemy = [LIGHT_GRAY]{0} Nemico Rimasto loadimage = Carica immagine @@ -255,19 +264,19 @@ custom = Personalizzato builtin = Incluso map.delete.confirm = Sei sicuro di voler eliminare questa mappa? L'operazione è irreversibile! map.random = [accent]Mappa casuale -map.nospawn = Questa mappa non possiede un nucleo in cui spawnare! Aggiungine uno nell'editor. -map.nospawn.pvp = Questa mappa non ha un nucleo nemico! Aggiungi un [SCARLET]nucleo rosso[] nell'editor per poter giocare. -map.nospawn.attack = Questa mappa non ha un nucleo nemico! Aggiungi un [SCARLET]nucleo rosso[] nell'editor per poter giocare. +map.nospawn = Questa mappa non possiede un Nucleo in cui spawnare! Aggiungine uno nell'editor. +map.nospawn.pvp = Questa mappa non ha un Nucleo nemico! Aggiungi un [SCARLET]Nucleo rosso[] nell'editor per poter giocare. +map.nospawn.attack = Questa mappa non ha un Nucleo nemico! Aggiungi un [SCARLET]Nucleo rosso[] nell'editor per poter giocare. map.invalid = Errore nel caricamento della mappa: file mappa corrotto o non valido. -workshop.update = Update Item -workshop.error = Error fetching workshop details: {0} +workshop.update = Aggiorna elemento +workshop.error = Errore nel recupero dei dettagli del Workshop: {0} map.publish.confirm = Vuoi pubblicare questa mappa?\n\n[lightgray]Assicurati di aver accettato il Workshop EULA, o le tue mappe non saranno visibili! -workshop.menu = Select what you would like to do with this item. -workshop.info = Item Info -changelog = Changelog (optional): +workshop.menu = Seleziona cosa vorresti fare con questo elemento. +workshop.info = Info elemento +changelog = Changelog (opzionale): eula = Steam EULA -missing = This item has been deleted or moved.\n[lightgray]The workshop listing has now been automatically un-linked. -publishing = [accent]Publishing... +missing = This item has been deleted or moved.\n[lightgray]The Workshop listing has now been automatically un-linked. +publishing = [accent]Pubblicazione... publish.confirm = Are you sure you want to publish this?\n\n[lightgray]Make sure you agree to the Workshop EULA first, or your items will not show up! publish.error = Error publishing item: {0} steam.error = Failed to initialize Steam services.\nError: {0} @@ -288,7 +297,7 @@ editor.newmap = Nuova mappa workshop = Workshop waves.title = Ondate waves.remove = Rimuovi -waves.never = mai +waves.never = waves.every = sempre waves.waves = ondata/e waves.perspawn = per spawn @@ -297,7 +306,7 @@ waves.boss = Boss waves.preview = Anteprima waves.edit = Modifica... waves.copy = Copia negli appunti -waves.load = Caica dagli appunti +waves.load = Carica dagli appunti waves.invalid = Onde dagli appunti non valide. waves.copied = Onde copiate. waves.none = Nessun nemico definiti.\n Nota che le disposizioni di ondate vuote verranno automaticamente rimpiazzate con la disposizione predefinita. @@ -310,7 +319,7 @@ editor.removeunit = Rimuovi un'unità editor.teams = Squadre editor.errorload = Errore nel caricamento di:\n[accent]{0} editor.errorsave = Errore nel salvataggio di:\n[accent]{0} -editor.errorimage = Quella è un'immagine, non una mappa. Non cambiare estensioni sperando che funzioni.\n\n Se vuoi importare una mappa vecchia clicca su "importa una mappa vecchia" nell'editor. +editor.errorimage = Quella è un'immagine, non una mappa.\n\nSe vuoi importare una mappa vecchia clicca su "Importa una mappa vecchia" nell'editor. editor.errorlegacy = La mappa è troppo vecchia ed usa un formato che non è più supportato. editor.errornot = Questo file non è una mappa. editor.errorheader = Questo file della mappa è invalido o corrotto. @@ -339,7 +348,7 @@ editor.exportfile.description = Esporta file mappa editor.exportimage = Esporta immagine editor.exportimage.description = Esporta file immagine mappa editor.loadimage = Carica\nimmagine -editor.saveimage = Salva\nImmagine +editor.saveimage = Salva\nimmagine editor.unsaved = [scarlet]Alcune modifiche non sono state salvate![]\nSei sicuro di voler uscire? editor.resizemap = Ridimensiona la mappa editor.mapname = Nome Mappa: @@ -347,9 +356,10 @@ editor.overwrite = [accent]Attenzione!\nQuesto sovrascrive una mappa esistente. editor.overwrite.confirm = [scarlet]Attenzione![] Una mappa con questo nome esiste già. Sei sicuro di volerla sovrascrivere? editor.exists = Esiste già una mappa con questo nome. editor.selectmap = Seleziona una mappa da caricare: -toolmode.replace = Rimpiazzare + +toolmode.replace = Sostituire toolmode.replace.description = Disegna solo su blocchi solidi. -toolmode.replaceall = Rimpiazzare tutto +toolmode.replaceall = Sostituisci tutto toolmode.replaceall.description = Rimpiazza tutti i blocchi nella mappa toolmode.orthogonal = Ortogonale toolmode.orthogonal.description = Disegna solo linee ortogonali @@ -357,10 +367,11 @@ toolmode.square = Quadrato toolmode.square.description = Pennello quadrato toolmode.eraseores = Rimuovi Minerali toolmode.eraseores.description = Rimuove solo minerali -toolmode.fillteams = Riempi squadre +toolmode.fillteams = Riempi Squadre toolmode.fillteams.description = Riempe squadre al posto di blocchi -toolmode.drawteams = Disegna squadre +toolmode.drawteams = Disegna Squadre toolmode.drawteams.description = Disegna squadre al posto di blocchi + filters.empty = [LIGHT_GRAY]Nessun filtro! Aggiungine uno cliccando il tasto sotto. filter.distort = Modifica filter.noise = Interferenza @@ -391,7 +402,8 @@ filter.option.ore = Minerale filter.option.floor2 = Pavimento secondario filter.option.threshold2 = Soglia secondaria filter.option.radius = Raggio -filter.option.percentile = percentuale +filter.option.percentile = Percentuale + width = Larghezza: height = Altezza: menu = Menu @@ -404,41 +416,43 @@ ping = Ping: {0}ms language.restart = Riavvia il gioco affinché il cambiamento della lingua abbia effetto. settings = Impostazioni tutorial = Tutorial -tutorial.retake = Ripeti il tutorial +tutorial.retake = Ripeti il Tutorial editor = Editor mapeditor = Editor Mappe + abandon = Abbandona abandon.text = Questa zona e tutte le tue risorse saranno perdute e passeranno al nemico. locked = Bloccato complete = [LIGHT_GRAY]Completato: -requirement.wave = Reach Wave {0} in {1} -requirement.core = Destroy Enemy Core in {0} -requirement.unlock = Unlock {0} -resume = Riprendi zona:\n[LIGHT_GRAY]{0} -bestwave = [LIGHT_GRAY]Migliore: {0} -launch = Decollare +requirement.wave = Raggiungi onda {0} in {1} +requirement.core = Distruggi il Nucleo nemico in {0} +requirement.unlock = Sblocca {0} +resume = Riprendi Zona:\n[LIGHT_GRAY]{0} +bestwave = [LIGHT_GRAY]Ondata migliore: {0} +launch = < DECOLLARE > launch.title = Decollo riuscito! -launch.next = [LIGHT_GRAY]Nuova opportunità all'ondata {0} +launch.next = [LIGHT_GRAY]nuova opportunità all'ondata {0} launch.unable2 = [scarlet]IMPOSSIBILE DECOLLARE![] -launch.confirm = Questo trasporterà tutte le risorse nel tuo nucleo.\nNon riuscirai a ritornare in questa base. +launch.confirm = Questo trasporterà tutte le risorse nel tuo Nucleo.\nNon riuscirai a ritornare in questa base. launch.skip.confirm = Se salti adesso non riuscirai a decollare fino alle ondate successive -uncover = Svelare +uncover = Scopri configure = Configura l'equipaggiamento -bannedblocks = Banned Blocks -addall = Add All +bannedblocks = Blocchi banditi +addall = Aggiungi tutti configure.locked = [LIGHT_GRAY]Arriva all'ondata {0}\nper configurare l'equipaggiamento. configure.invalid = Il valore dev'essere un numero compresto tra 0 e {0}. zone.unlocked = [LIGHT_GRAY]{0} sbloccata. zone.requirement.complete = Ondata {0} raggiunta:\n{1} requisiti di zona soddisfatti. -zone.config.unlocked = Loadout unlocked:[lightgray]\n{0} -zone.resources = Risorse trovate: +zone.config.unlocked = Equipaggiamento sbloccato:[lightgray]\n{0} +zone.resources = Risorse Trovate: zone.objective = [lightgray]Obiettivo: [accent]{0} zone.objective.survival = Sopravvivere -zone.objective.attack = Distruggere il nucleo nemico +zone.objective.attack = Distruggere il Nucleo Nemico add = Aggiungi... boss.health = Vita del Boss + connectfail = [crimson] Impossibile connettersi al server: [accent] {0} -error.unreachable = Server irraggiungibile +error.unreachable = Server irraggiungibile. L'indirizzo è scritto correttamente? error.invalidaddress = Indirizzo invalido. error.timedout = Timeout!\n Assicurati che l'host abbia il port forwarding impostato e che l'indirizzo sia corretto! error.mismatch = Errore pacchetti:\nPossibile discordanza della versione client / server.\n Assicurati che tu e l'host possiediate l'ultima versione di Mindustry! @@ -447,6 +461,7 @@ error.mapnotfound = Mappa non trovata error.io = Errore I/O di rete. error.any = Errore di rete sconosciuto. error.bloom = Errore dell'avvio del bloom.\nIl tuo dispositivo potrebbe non supportarlo. + zone.groundZero.name = Terreno Zero zone.desertWastes.name = Rifiuti Desertici zone.craters.name = Crateri @@ -461,10 +476,11 @@ zone.saltFlats.name = Saline zone.impact0078.name = Impatto 0078 zone.crags.name = Dirupi zone.fungalPass.name = Passaggio Fungoso + zone.groundZero.description = La posizione ottimale per cominciare. Bassa minaccia nemica. Poche risorse.\nRaccogli quanto più piombo e rame possibile.\nProcedi. zone.frozenForest.description = Anche qui, più vicino alle montagne, le spore si sono diffuse. Le temperature rigide non possono contenerle per sempre.\n Inizia la scoperta dell'energia. Costruisci generatori a combustione. Impara a usare i riparatori. zone.desertWastes.description = Questi rifiuti sono vasti, imprevedibili ed attraversati da strutture settoriali abbandonate.\n\nIl carbone è presente nella regione. Bruciatelo per ottenere energia o sintetizzate la grafite.\n\n[lightgray]Questa posizione di atterraggio non può essere garantita. -zone.saltFlats.description = Alle periferie del deserto si trovano le saline. Poche risorse possono essere trovate in questa posizione.\n\nIl nemico ha eretto un complesso di archiviazione delle risorse qui. Sradicare il loro nucleo. Non lasciare nulla in piedi. +zone.saltFlats.description = Alle periferie del deserto si trovano le saline. Poche risorse possono essere trovate in questa posizione.\n\nIl nemico ha eretto un complesso di archiviazione delle risorse qui. Sradicare il loro Nucleo. Non lasciare nulla in piedi. zone.craters.description = L'acqua si è accumulata in questo cratere, reliquia delle vecchie guerre. Recupera l'area. Raccogli la sabbia. Fondi il vetro metallico. Pompa l'acqua per raffreddare torrette e trivelle. zone.ruinousShores.description = Oltre i rifiuti, c'è il litorale. Una volta, questa posizione ospitava una schiera di difesa costiera. Non rimane molto. Solo le strutture di difesa più elementari sono rimaste incolume, tutto il resto ridotto a rottami.\nContinua l'espansione verso l'esterno. Riscopri la tecnologia. zone.stainedMountains.description = Più nell'entroterra si trovano le montagne, non ancora contaminate da spore.\nEstrai l'abbondante titanio in questa zona. Scopri come usarlo.\n\nLa presenza del nemico è maggiore qui. Non dare loro il tempo di inviare le loro unità più forti. @@ -475,23 +491,24 @@ zone.nuclearComplex.description = Un ex impianto per la produzione e la lavorazi zone.fungalPass.description = Un'area di transizione tra alte montagne e terre più basse, piene di spore. Qui si trova una piccola base di ricognizione nemica.\nDistruggila.\nUsa le unità Pugnale e Strisciatore. Elimina i due nuclei. zone.impact0078.description = zone.crags.description = + settings.language = Lingua settings.data = Importa/Esporta salvataggio -settings.reset = Resetta Alle Impostazioni Predefinite +settings.reset = Ripristina Impostazioni settings.rebind = Modifica settings.controls = Controlli settings.game = Gioco settings.sound = Suoni settings.graphics = Grafica -settings.cleardata = Cancella dati di gioco... -settings.clear.confirm = Sei sicuro di voler cancellare i dati?\nNon può essere annullato! -settings.clearall.confirm = [scarlet]ATTENZIONE![]\nQuesto cancellerà tutti i dati, includendo salvataggi, mappe, oggetti sbloccati, impostazioni.\nDopo aver premuto su 'ok' il gioco eliminerà i dati e si chiuderà. -paused = In pausa -clear = Clear -banned = [scarlet]Banned +settings.cleardata = Elimina Dati di Gioco... +settings.clear.confirm = Sei sicuro di voler cancellare i dati?\nQuesta operazione non può essere annullata! +settings.clearall.confirm = [scarlet]ATTENZIONE![]\nQuesto cancellerà tutti i dati, inclusi salvataggi, mappe, oggetti sbloccati ed impostazioni.\nDopo aver premuto su 'ok' il gioco eliminerà i dati e si chiuderà automaticamente. +paused = [accent]< In Pausa > +clear = Pulisci +banned = [scarlet]Bandito yes = Si no = No -info.title = [accent] Info +info.title = Info error.title = [crimson]Si è verificato un errore error.crashtitle = Si è verificato un errore blocks.input = Ingresso @@ -501,49 +518,53 @@ block.unknown = [LIGHT_GRAY]??? blocks.powercapacity = Capacità Energetica blocks.powershot = Danno/Colpo blocks.damage = Danno -blocks.targetsair = Attacca nemici aerei -blocks.targetsground = Attacca nemici terreni -blocks.itemsmoved = Velocità movimento -blocks.launchtime = Tempo fra decolli +blocks.targetsair = Attacca Nemici Aerei +blocks.targetsground = Attacca Nemici Terreni +blocks.itemsmoved = Velocità di Movimento +blocks.launchtime = Tempo fra Decolli blocks.shootrange = Raggio blocks.size = Grandezza -blocks.liquidcapacity = Capacità del liquido +blocks.liquidcapacity = Capacità del Liquido blocks.powerrange = Raggio Energia -blocks.powerconnections = Max Connections -blocks.poweruse = Utilizzo energia +blocks.powerconnections = Connessioni Massime +blocks.poweruse = Utilizzo Energia blocks.powerdamage = Energia/Danno blocks.itemcapacity = Capacità -blocks.basepowergeneration = Generazione energia di base -blocks.productiontime = Tempo di produzione -blocks.repairtime = Tempo di riparazione completa +blocks.basepowergeneration = Generazione Energia di Base +blocks.productiontime = Tempo di Produzione +blocks.repairtime = Tempo di Riparazione Completa blocks.speedincrease = Aumento Velocità blocks.range = Raggio blocks.drilltier = Scavabili -blocks.drillspeed = Velocità di scavo stabile -blocks.boosteffect = Effetto boost -blocks.maxunits = Unità attive max +blocks.drillspeed = Velocità di Scavo Stabile +blocks.boosteffect = Effetto Boost +blocks.maxunits = Unità Attive Max blocks.health = Salute -blocks.buildtime = Tempo di costruzione +blocks.buildtime = Tempo di Costruzione blocks.buildcost = Costo di Costruzione blocks.inaccuracy = Inaccuratezza blocks.shots = Colpi blocks.reload = Ricarica blocks.ammo = Munizioni -bar.drilltierreq = Miglior trivella richiesta -bar.drillspeed = Velocità scavo: {0}/s -bar.pumpspeed = Pump Speed: {0}/s + +bar.drilltierreq = Miglior Trivella Richiesta +bar.drillspeed = Velocità Scavo: {0}/s +bar.pumpspeed = Velocità di Pompaggio: {0}/s bar.efficiency = Efficienza: {0}% bar.powerbalance = Energia: {0} -bar.powerstored = Stored: {0}/{1} +bar.powerstored = Immagazzinata: {0}/{1} bar.poweramount = Energia: {0} -bar.poweroutput = Energia in uscita: {0} +bar.poweroutput = Energia in Uscita: {0} bar.items = Oggetti: {0} -bar.capacity = Capacity: {0} +bar.capacity = Capacità: {0} bar.liquid = Liquido bar.heat = Calore bar.power = Energia -bar.progress = Progresso della costruzione +bar.progress = Progresso della Costruzione bar.spawned = Unità: {0}/{1} +bar.input = Entrata +bar.output = Uscita + bullet.damage = [stat]{0}[lightgray] danno bullet.splashdamage = [stat]{0}[lightgray] danno ad area ~[stat] {1}[lightgray] blocchi bullet.incendiary = [stat]incendiario @@ -555,6 +576,7 @@ bullet.freezing = [stat]congelante bullet.tarred = [stat]viscoso bullet.multiplier = [stat]{0}[lightgray]x moltiplicatore munizioni bullet.reload = [stat]{0}[lightgray]x ricarica + unit.blocks = blocchi unit.powersecond = unità energia/secondo unit.liquidsecond = unità liquide/secondo @@ -567,6 +589,8 @@ unit.persecond = /sec unit.timesspeed = x velocità unit.percent = % unit.items = oggetti +unit.thousands = k +unit.millions = mln category.general = Generali category.power = Energia category.liquids = Liquidi @@ -574,58 +598,62 @@ category.items = Oggetti category.crafting = Produzione category.shooting = Potenza di fuoco category.optional = Miglioramenti Opzionali -setting.landscape.name = Blocca paesaggio +setting.landscape.name = Blocca Paesaggio setting.shadows.name = Ombre -setting.blockreplace.name = Automatic Block Suggestions -setting.linear.name = Filtro lineare -setting.hints.name = Hints -setting.animatedwater.name = Acqua animata -setting.animatedshields.name = Scudi animati -setting.antialias.name = Antialias[LIGHT_GRAY] (richiede riapertura gioco)[] -setting.indicators.name = Indicatori Alleati -setting.autotarget.name = Mira automatica +setting.blockreplace.name = Suggerimento Blocchi Automatico +setting.linear.name = Filtro Lineare +setting.hints.name = Suggerimenti +setting.buildautopause.name = Auto-Pause Building +setting.animatedwater.name = Acqua Animata +setting.animatedshields.name = Scudi Animati +setting.antialias.name = Antialias[LIGHT_GRAY] (richiede riavvio)[] +setting.indicators.name = Indicatori Alleati/Nemici +setting.autotarget.name = Mira Automatica setting.keyboard.name = Tastiera -setting.touchscreen.name = Controlli Touchscreen +setting.touchscreen.name = Controlli Touchscreen setting.fpscap.name = Limite FPS setting.fpscap.none = Niente setting.fpscap.text = {0} FPS -setting.uiscale.name = Ridimensionamento dell'interfaccia utente[lightgray] (richiede riapertura gioco)[] -setting.swapdiagonal.name = Posizionamento sempre diagonale +setting.uiscale.name = Ridimensionamento Interfaccia[lightgray] (richiede riavvio)[] +setting.swapdiagonal.name = Posizionamento Sempre Diagonale setting.difficulty.training = Allenamento setting.difficulty.easy = Facile -setting.difficulty.normal = Medio +setting.difficulty.normal = Normale setting.difficulty.hard = Difficile setting.difficulty.insane = Impossibile setting.difficulty.name = Difficoltà: -setting.screenshake.name = Movimento dello schermo -setting.effects.name = Visualizza effetti -setting.destroyedblocks.name = Display Destroyed Blocks +setting.screenshake.name = Movimento dello Schermo +setting.effects.name = Visualizza Effetti +setting.destroyedblocks.name = Mostra Blocchi Distrutti setting.conveyorpathfinding.name = Conveyor Placement Pathfinding -setting.sensitivity.name = Sensibilità del controller -setting.saveinterval.name = Intervallo di salvataggio automatico -setting.seconds = {0} Secondi +setting.sensitivity.name = Sensibilità del Controller +setting.saveinterval.name = Intervallo di Salvataggio Automatico +setting.blockselecttimeout.name = Tempo di Selezione del Blocco +setting.milliseconds = {0} millisecondi +setting.seconds = {0} secondi setting.fullscreen.name = Schermo Intero -setting.borderlesswindow.name = Schermo senza bordi[LIGHT_GRAY] (potrebbe richiedere riapertura gioco) -setting.fps.name = Mostra FPS +setting.borderlesswindow.name = Finestra Senza Bordi[LIGHT_GRAY] (potrebbe richiedere riavvio) +setting.fps.name = Mostra FPS e Ping +setting.blockselectkeys.name = Mostra Tasto di Selezione del Blocco setting.vsync.name = VSync -setting.pixelate.name = Sfocare [LIGHT_GRAY](potrebbe ridure il rendimento) -setting.minimap.name = Mostra minimappa -setting.position.name = Show Player Position +setting.pixelate.name = Effetto Pixel [LIGHT_GRAY](potrebbe ridure le prestazioni) +setting.minimap.name = Mostra Minimappa +setting.position.name = Mostra Posizione Giocatori setting.musicvol.name = Volume Musica setting.ambientvol.name = Volume Ambiente -setting.mutemusic.name = Silenzia musica +setting.mutemusic.name = Silenzia Musica setting.sfxvol.name = Volume Effetti -setting.mutesound.name = Togli suoni -setting.crashreport.name = Invia rapporti sugli arresti anomali anonimamente +setting.mutesound.name = Togli Suoni +setting.crashreport.name = Invia rapporti anonimi sugli arresti anomali setting.savecreate.name = Autosalvataggio -setting.publichost.name = Gioco visibile pubblicamente -setting.chatopacity.name = Opacità chat -setting.lasersopacity.name = Power Laser Opacity +setting.publichost.name = Gioco Visibile Pubblicamente +setting.chatopacity.name = Opacità Chat +setting.lasersopacity.name = Opacità Laser d'Energia setting.playerchat.name = Mostra Chat in-game public.confirm = Do you want to make your game public?\n[accent]Anyone will be able to join your games.\n[lightgray]This can be changed later in Settings->Game->Public Game Visibility. public.beta = Note that beta versions of the game cannot make public lobbies. -uiscale.reset = La scala dell'interfaccia utente è stata modificata.\nPremere "OK" per confermare questa scala.\n[scarlet] Ripristina ed esci dalle impostazioni [accent] {0}[] impostazioni... -uiscale.cancel = Annulla ed esci +uiscale.reset = La scala dell'interfaccia utente è stata modificata.\nPremere "OK" per confermare questa scala.\n[scarlet] Ripristina ed esci in [accent] {0}[] secondi... +uiscale.cancel = Annulla ed Esci setting.bloom.name = Shaders keybind.title = Configurazione Tasti keybinds.mobile = [scarlet]La maggior parte dei keybind qui non sono funzionali sui dispositivi mobili. È supportato solo il movimento di base. @@ -635,71 +663,92 @@ category.multiplayer.name = Multigiocatore command.attack = Attacca command.rally = Guardia command.retreat = Ritirata -keybind.clear_building.name = Clear Building +placement.blockselectkeys = \n[lightgray]Tasto: [{0}, +keybind.clear_building.name = Pulisci Costruzione keybind.press = Premi un tasto... keybind.press.axis = Premi un'asse o un tasto... -keybind.screenshot.name = Screenshot della mappa -keybind.move_x.name = Muovi orizzontale -keybind.move_y.name = Muovi verticale -keybind.schematic_select.name = Select Region -keybind.schematic_menu.name = Schematic Menu -keybind.schematic_flip_x.name = Flip Schematic X -keybind.schematic_flip_y.name = Flip Schematic Y +keybind.screenshot.name = Screenshot della Mappa +keybind.move_x.name = Muovi Orizzontalmente +keybind.move_y.name = Muovi Verticalmente +keybind.mouse_move.name = Segui il Mouse +keybind.dash.name = Scatto +keybind.schematic_select.name = Seleziona Regione +keybind.schematic_menu.name = Menu Schematica +keybind.schematic_flip_x.name = Ruota Schematica Orizzontalmente +keybind.schematic_flip_y.name = Flip Schematic Verticalmente +keybind.category_prev.name = Categoria Precedente +keybind.category_next.name = Categoria Successiva +keybind.block_select_left.name = Seleziona Blocco Sinistra +keybind.block_select_right.name = Seleziona Blocco Destra +keybind.block_select_up.name = Seleziona Blocco Su +keybind.block_select_down.name = Seleziona Blocco Giù +keybind.block_select_01.name = Categoria/Seleziona Blocco 1 +keybind.block_select_02.name = Categoria/Seleziona Blocco 2 +keybind.block_select_03.name = Categoria/Seleziona Blocco 3 +keybind.block_select_04.name = Categoria/Seleziona Blocco 4 +keybind.block_select_05.name = Categoria/Seleziona Blocco 5 +keybind.block_select_06.name = Categoria/Seleziona Blocco 6 +keybind.block_select_07.name = Categoria/Seleziona Blocco 7 +keybind.block_select_08.name = Categoria/Seleziona Blocco 8 +keybind.block_select_09.name = Categoria/Seleziona Blocco 9 +keybind.block_select_10.name = Categoria/Seleziona Blocco 10 keybind.fullscreen.name = Schermo Intero -keybind.select.name = Seleziona -keybind.diagonal_placement.name = Posizionamento diagonale +keybind.select.name = Seleziona/Spara +keybind.diagonal_placement.name = Posizionamento Diagonale keybind.pick.name = Scegli Blocco -keybind.break_block.name = Rompi blocco +keybind.break_block.name = Rompi Blocco keybind.deselect.name = Deseleziona keybind.shoot.name = Spara -keybind.zoom_hold.name = Attiva zoom -keybind.zoom.name = Esegui zoom -keybind.menu.name = Apri Menu +keybind.zoom_hold.name = Attiva Zoom +keybind.zoom.name = Esegui Zoom +keybind.menu.name = Menu keybind.pause.name = Pausa -keybind.pause_building.name = Pause/Resume Building +keybind.pause_building.name = Pausa/Riprendi Costruzione keybind.minimap.name = Minimappa -keybind.dash.name = Scatto keybind.chat.name = Chat keybind.player_list.name = Lista dei Giocatori keybind.console.name = Console -keybind.rotate.name = Ruotare -keybind.rotateplaced.name = Rotate Existing (Hold) +keybind.rotate.name = Ruota +keybind.rotateplaced.name = Ruota Blocco Esistente (Premuto) keybind.toggle_menus.name = Mostra/Nascondi HUD -keybind.chat_history_prev.name = Scorri chat vero l'alto -keybind.chat_history_next.name = Scorri chatt verso il basso -keybind.chat_scroll.name = Scorri chat -keybind.drop_unit.name = Lascia materiali -keybind.zoom_minimap.name = Esegui Zoom minimappa -mode.help.title = Descrizione delle modalità +keybind.chat_history_prev.name = Scorri Chat vero l'alto +keybind.chat_history_next.name = Scorri Chat verso il basso +keybind.chat_scroll.name = Scorri Chat +keybind.drop_unit.name = Lascia Materiali +keybind.zoom_minimap.name = Esegui Zoom Minimappa +keybind.toggle_power_lines.name = Attiva/Disattiva Laser d'Energia +mode.help.title = Descrizione delle Modalità mode.survival.name = Sopravvivenza -mode.survival.description = La modalità normale. Risorse limitate ed ondate in entrata automatiche. +mode.survival.description = Modalità normale. Risorse limitate ed ondate in entrata automatiche. mode.sandbox.name = Creativa mode.sandbox.description = Risorse infinite e nessun timer per le ondate. mode.editor.name = Editor mode.pvp.name = PvP mode.pvp.description = Lotta contro altri giocatori. mode.attack.name = Schermaglia -mode.attack.description = Obiettivo: Distruggere la base nemica, non ci sono ondate -mode.custom = Regole personalizzate +mode.attack.description = Obiettivo: Distruggere la base nemica, non ci sono ondate. +mode.custom = Regole Personalizzate + rules.infiniteresources = Risorse infinite -rules.wavetimer = Timer ondate +rules.reactorexplosions = Esplosioni Reattore +rules.wavetimer = Timer Ondate rules.waves = Ondate -rules.attack = Modalità attacco -rules.enemyCheat = Infinite Risorse AI +rules.attack = Modalità Attacco +rules.enemyCheat = Risorse AI Infinite rules.unitdrops = Generazione Unità -rules.unitbuildspeedmultiplier = Moltiplicatore velocità costruzione unità -rules.unithealthmultiplier = Moltiplicatore vita unità -rules.playerhealthmultiplier = Moltiplicatore vita giocatore -rules.playerdamagemultiplier = Moltiplicatore danno giocatore -rules.unitdamagemultiplier = Moltiplicatore danno unità -rules.enemycorebuildradius = Raggio dove non si può costruire attorno al nucleo nemico:[LIGHT_GRAY] (tiles) +rules.unitbuildspeedmultiplier = Moltiplicatore Velocità Costruzione Unità +rules.unithealthmultiplier = Moltiplicatore Vita Unità +rules.playerhealthmultiplier = Moltiplicatore Vita Giocatore +rules.playerdamagemultiplier = Moltiplicatore Danno Giocatore +rules.unitdamagemultiplier = Moltiplicatore Danno Unità +rules.enemycorebuildradius = Raggio di Protezione del Nucleo Nemico dalle Costruzioni:[LIGHT_GRAY] (tiles) rules.respawntime = Tempo di rigeneratione:[LIGHT_GRAY] (sec) -rules.wavespacing = Tempo fra ondate:[LIGHT_GRAY] (secondi) -rules.buildcostmultiplier = Moltiplicatore costo costruzione -rules.buildspeedmultiplier = Moltiplicatore velocità costruzione +rules.wavespacing = Tempo fra Ondate:[LIGHT_GRAY] (secondi) +rules.buildcostmultiplier = Moltiplicatore Costo Costruzione +rules.buildspeedmultiplier = Moltiplicatore Velocità Costruzione rules.waitForWaveToEnd = Ondate aspettano fino a quando l'ondata precedente finisce -rules.dropzoneradius = Raggio di generazione:[LIGHT_GRAY] (blocchi) -rules.respawns = Massimo di rigenerazioni per ondata +rules.dropzoneradius = Raggio di Generazione:[LIGHT_GRAY] (blocchi) +rules.respawns = Rigenerazioni per ondata max rules.limitedRespawns = Limite rigenerazioni rules.title.waves = Ondate rules.title.respawns = Rigenerazioni @@ -707,6 +756,10 @@ rules.title.resourcesbuilding = Risorse e costruzioni rules.title.player = Giocatori rules.title.enemy = Nemici rules.title.unit = Unità +rules.title.experimental = Sperimentale +rules.lighting = Illuminazione +rules.ambientlight = Illuminazione Ambientale + content.item.name = Oggetti content.liquid.name = Liquidi content.unit.name = Unità @@ -733,26 +786,27 @@ liquid.slag.name = Scoria liquid.oil.name = Petrolio liquid.cryofluid.name = Criofluido mech.alpha-mech.name = Alpha -mech.alpha-mech.weapon = Ripetitore pesante +mech.alpha-mech.weapon = Ripetitore Pesante mech.alpha-mech.ability = Orda di droni mech.delta-mech.name = Delta -mech.delta-mech.weapon = Generatore di fulmini +mech.delta-mech.weapon = Generatore di Fulmini mech.delta-mech.ability = Scarica mech.tau-mech.name = Tau -mech.tau-mech.weapon = Laser ricostruttore -mech.tau-mech.ability = Impulso riparatore +mech.tau-mech.weapon = Laser Ricostruttore +mech.tau-mech.ability = Impulso Riparatore mech.omega-mech.name = Omega -mech.omega-mech.weapon = Sciame di missili -mech.omega-mech.ability = Configurazione armata +mech.omega-mech.weapon = Sciame di Missili +mech.omega-mech.ability = Configurazione Armata mech.dart-ship.name = Dardo mech.dart-ship.weapon = Ripetitore mech.javelin-ship.name = Giavellotto -mech.javelin-ship.weapon = Missili esplosivi -mech.javelin-ship.ability = Booster di scarico +mech.javelin-ship.weapon = Missili Esplosivi +mech.javelin-ship.ability = Booster di Scarico mech.trident-ship.name = Tridente -mech.trident-ship.weapon = Valle delle bombe +mech.trident-ship.weapon = Valle delle Bombe mech.glaive-ship.name = Glaive -mech.glaive-ship.weapon = Ripetitore di fiamma +mech.glaive-ship.weapon = Ripetitore di Fiamma +item.corestorable = [lightgray]Immagazzinabili nel Nucleo: {0} item.explosiveness = [LIGHT_GRAY]Esplosività: {0} item.flammability = [LIGHT_GRAY]Infiammabilità: {0} item.radioactivity = [LIGHT_GRAY]Radioattività: {0} @@ -760,42 +814,43 @@ unit.health = [LIGHT_GRAY]Salute: {0} unit.speed = [LIGHT_GRAY]Velocità: {0} mech.weapon = [LIGHT_GRAY]Armi: {0} mech.health = [LIGHT_GRAY]Salute: {0} -mech.itemcapacity = [LIGHT_GRAY]Capacità oggetti: {0} -mech.minespeed = [LIGHT_GRAY]Velocità di scavo: {0} -mech.minepower = [LIGHT_GRAY]Potenza di scavo: {0} +mech.itemcapacity = [LIGHT_GRAY]Capacità Oggetti: {0} +mech.minespeed = [LIGHT_GRAY]Velocità di Scavo: {0} +mech.minepower = [LIGHT_GRAY]Potenza di Scavo: {0} mech.ability = [LIGHT_GRAY]Abilità: {0} -mech.buildspeed = [LIGHT_GRAY]Velocità costruzione: {0}% -liquid.heatcapacity = [LIGHT_GRAY]Capacità calorifica: {0} +mech.buildspeed = [LIGHT_GRAY]Velocità di Costruzione: {0}% +liquid.heatcapacity = [LIGHT_GRAY]Capacità Termica: {0} liquid.viscosity = [LIGHT_GRAY]Viscosità: {0} liquid.temperature = [LIGHT_GRAY]Temperatura: {0} + block.sand-boulder.name = Masso di Sabbia block.grass.name = Erba block.salt.name = Sale block.saltrocks.name = Rocce salate block.pebbles.name = Ciottoli block.tendrils.name = Viticci -block.sandrocks.name = Rocce sabbiose +block.sandrocks.name = Rocce Sabbiose block.spore-pine.name = Pino di Spore block.sporerocks.name = Roccia di Spore block.rock.name = Roccia -block.snowrock.name = Roccia innevata -block.snow-pine.name = Pino innevato +block.snowrock.name = Roccia Innevata +block.snow-pine.name = Pino Innevato block.shale.name = Scisto -block.shale-boulder.name = Masso di scisto +block.shale-boulder.name = Masso di Scisto block.moss.name = Muschio block.shrubs.name = Arbusti -block.spore-moss.name = Muschio di spore -block.shalerocks.name = Rocce di scisto +block.spore-moss.name = Muschio di Spore +block.shalerocks.name = Rocce di Scisto block.scrap-wall.name = Muro di Rottami -block.scrap-wall-large.name = Muro di Rottami grande -block.scrap-wall-huge.name = Muro di Rottami enorme -block.scrap-wall-gigantic.name = Muro di Rottami gigante +block.scrap-wall-large.name = Muro di Rottami Grande +block.scrap-wall-huge.name = Muro di Rottami Enorme +block.scrap-wall-gigantic.name = Muro di Rottami Gigante block.thruster.name = Propulsore block.kiln.name = Forno -block.graphite-press.name = Pressa per grafite +block.graphite-press.name = Pressa per Grafite block.multi-press.name = Multi Pressa -block.constructing = {0}\n[LIGHT_GRAY](In costruzione) -block.spawn.name = Spawn nemico +block.constructing = {0}\n[LIGHT_GRAY](In Costruzione) +block.spawn.name = Spawn Nemico block.core-shard.name = Nucleo: Frammento block.core-foundation.name = Nucleo: Fondamento block.core-nucleus.name = Nucleo: Kernel @@ -810,24 +865,24 @@ block.darksand.name = Sabbia Scura block.ice.name = Ghiaccio block.snow.name = Neve block.craters.name = Crateri -block.sand-water.name = Acqua sabbiosa -block.darksand-water.name = Acqua sabbiosa scura +block.sand-water.name = Acqua Sabbiosa +block.darksand-water.name = Acqua Sabbiosa scura block.char.name = Carbone block.holostone.name = Pietra Holo -block.ice-snow.name = Neve ghiacciata +block.ice-snow.name = Neve Ghiacciata block.rocks.name = Rocce -block.icerocks.name = Rocce ghiacciate -block.snowrocks.name = Rocce innevate -block.dunerocks.name = Rocce delle dune +block.icerocks.name = Rocce Ghiacciate +block.snowrocks.name = Rocce Innevate +block.dunerocks.name = Rocce delle Dune block.pine.name = Pino -block.white-tree-dead.name = Albero bianco morto -block.white-tree.name = Albero morto -block.spore-cluster.name = Agglomerato di spore -block.metal-floor.name = Pavimento metallico -block.metal-floor-2.name = Pavimento metallico 2 -block.metal-floor-3.name = Pavimento metallico 3 -block.metal-floor-5.name = Pavimento metallico 5 -block.metal-floor-damaged.name = Pavimento metallico danneggiato +block.white-tree-dead.name = Albero Bianco Morto +block.white-tree.name = Albero Morto +block.spore-cluster.name = Agglomerato di Spore +block.metal-floor.name = Pavimento Metallico +block.metal-floor-2.name = Pavimento Metallico 2 +block.metal-floor-3.name = Pavimento Metallico 3 +block.metal-floor-5.name = Pavimento Metallico 4 +block.metal-floor-damaged.name = Pavimento Metallico Danneggiato block.dark-panel-1.name = Pannello scuro 1 block.dark-panel-2.name = Pannello scuro 2 block.dark-panel-3.name = Pannello scuro 3 @@ -839,55 +894,58 @@ block.ignarock.name = Roccia Ignea block.hotrock.name = Roccia Bollente block.magmarock.name = Roccia Magmatica block.cliffs.name = Scogliere -block.copper-wall.name = Muro di rame -block.copper-wall-large.name = Muro grande di rame -block.titanium-wall.name = Muro di titanio -block.titanium-wall-large.name = Muro grande di titanio -block.plastanium-wall.name = Plastanium Wall -block.plastanium-wall-large.name = Large Plastanium Wall -block.phase-wall.name = Muro di fase -block.phase-wall-large.name = Muro grande di fase -block.thorium-wall.name = Muro di torio -block.thorium-wall-large.name = Muro grande di torio +block.copper-wall.name = Muro di Rame +block.copper-wall-large.name = Muro Grande di Rame +block.titanium-wall.name = Muro di Titanio +block.titanium-wall-large.name = Muro Grande di Titanio +block.plastanium-wall.name = Muro di Plastanio +block.plastanium-wall-large.name = Muro Grande di Plastanio +block.phase-wall.name = Muro di Fase +block.phase-wall-large.name = Muro Grande di Fase +block.thorium-wall.name = Muro di Torio +block.thorium-wall-large.name = Muro Grande di Torio block.door.name = Porta -block.door-large.name = Porta grande +block.door-large.name = Porta Grande block.duo.name = Torretta Duo block.scorch.name = Bruciatore -block.scatter.name = Cannone a dispersione +block.scatter.name = Cannone a Dispersione block.hail.name = Bombardiere block.lancer.name = Lanciere -block.conveyor.name = Nastro trasportatore -block.titanium-conveyor.name = Nastro avanzato -block.armored-conveyor.name = Nastro corazzato +block.conveyor.name = Nastro Trasportatore +block.titanium-conveyor.name = Nastro Avanzato +block.armored-conveyor.name = Nastro Corazzato block.armored-conveyor.description = Trasporta gli oggetti alla stessa velocità del nastro avanzato, ma è più resistente. Accetta input dai lati solo da altri nastri. block.junction.name = Incrocio block.router.name = Distributore block.distributor.name = Distributore Grande block.sorter.name = Filtro -block.inverted-sorter.name = Inverted Sorter -block.message.name = Message -block.overflow-gate.name = Separatore per eccesso +block.inverted-sorter.name = Filtro Inverso +block.message.name = Messaggio +block.illuminator.name = Lanterna +block.illuminator.description = Una piccola, compatta sorgente di luce. Richiede energia per funzionare. +block.overflow-gate.name = Separatore per Eccesso block.silicon-smelter.name = Fonderia -block.phase-weaver.name = Tessitore di fase +block.phase-weaver.name = Tessitore di Fase block.pulverizer.name = Polverizzatore -block.cryofluidmixer.name = Miscelatore di liquidi +block.cryofluidmixer.name = Miscelatore di Liquidi block.melter.name = Fonditore block.incinerator.name = Inceneritore block.spore-press.name = Pressa di Spore block.separator.name = Separatore block.coal-centrifuge.name = Centrifuga di Carbone -block.power-node.name = Nodo energetico -block.power-node-large.name = Nodo energetico grande +block.power-node.name = Nodo Energetico +block.power-node-large.name = Nodo Energetico Grande block.surge-tower.name = Torre di Sovratensione +block.diode.name = Diodo block.battery.name = Batteria -block.battery-large.name = Batteria grande -block.combustion-generator.name = Generatore a combustibile -block.turbine-generator.name = Turbina a vapore -block.differential-generator.name = Generatore differenziale +block.battery-large.name = Batteria Grande +block.combustion-generator.name = Generatore a Combustibile +block.turbine-generator.name = Turbina a Vapore +block.differential-generator.name = Generatore Differenziale block.impact-reactor.name = Reattore ad Impatto -block.mechanical-drill.name = Trivella meccanica -block.pneumatic-drill.name = Trivella pneumatica -block.laser-drill.name = Trivella laser +block.mechanical-drill.name = Trivella Meccanica +block.pneumatic-drill.name = Trivella Pneumatica +block.laser-drill.name = Trivella Laser block.water-extractor.name = Estrattore d'acqua block.cultivator.name = Coltivatore block.dart-mech-pad.name = Piattaforma del Mech Dardo @@ -897,27 +955,27 @@ block.trident-ship-pad.name = Piattaforma della Nave Tridente block.glaive-ship-pad.name = Piattaforma della Nave Glaive block.omega-mech-pad.name = Piattaforma del Mech Omega block.tau-mech-pad.name = Piattaforma del Mech Tau -block.conduit.name = Condotta -block.mechanical-pump.name = Pompa meccanica -block.item-source.name = Fonte infinita (oggetti) +block.conduit.name = Condotto +block.mechanical-pump.name = Pompa Meccanica +block.item-source.name = Fonte Infinita (oggetti) block.item-void.name = Cestino (oggetti) -block.liquid-source.name = Fonte infinita (liquidi) +block.liquid-source.name = Fonte Infinita (liquidi) block.power-void.name = Cestino (energia) -block.power-source.name = Fonte infinita (energia) +block.power-source.name = Fonte Infinita (energia) block.unloader.name = Scaricatore block.vault.name = Deposito block.wave.name = Idrogetto block.swarmer.name = Sciamatore block.salvo.name = Cannone Leggero block.ripple.name = Cannone Pesante -block.phase-conveyor.name = Nastro di fase -block.bridge-conveyor.name = Nastro trasportatore sopraelevato -block.plastanium-compressor.name = Compressore al plastanio -block.pyratite-mixer.name = Miscelatore di pirite -block.blast-mixer.name = Miscelatore di esplosivi -block.solar-panel.name = Pannello solare -block.solar-panel-large.name = Pannello solare 3x3 -block.oil-extractor.name = Estrattore di petrolio +block.phase-conveyor.name = Nastro di Fase +block.bridge-conveyor.name = Nastro Trasportatore Sopraelevato +block.plastanium-compressor.name = Compressore al Plastanio +block.pyratite-mixer.name = Miscelatore di Pirite +block.blast-mixer.name = Miscelatore d'Esplosivi +block.solar-panel.name = Pannello Solare +block.solar-panel-large.name = Pannello Solare Grande +block.oil-extractor.name = Estrattore di Petrolio block.command-center.name = Centro di Comando block.draug-factory.name = Fabbrica Droni Minatori block.spirit-factory.name = Fabbrica Droni Riparatori @@ -929,19 +987,19 @@ block.crawler-factory.name = Fabbrica Mech Strisciatore block.titan-factory.name = Fabbrica Mech Titano block.fortress-factory.name = Fabbrica Mech Fortezza block.revenant-factory.name = Fabbrica Combattenti Superstiti -block.repair-point.name = Punto di riparazione -block.pulse-conduit.name = Condotta attiva -block.phase-conduit.name = Condotta di fase -block.liquid-router.name = Distributore di liquidi +block.repair-point.name = Punto di Riparazione +block.pulse-conduit.name = Condotto Attiva +block.phase-conduit.name = Condotta di Fase +block.liquid-router.name = Distributore di Liquidi block.liquid-tank.name = Serbatoio -block.liquid-junction.name = Giunzione liquida -block.bridge-conduit.name = Condotta sopraelevata -block.rotary-pump.name = Pompa a turbina -block.thorium-reactor.name = Reattore al torio +block.liquid-junction.name = Giunzione Liquida +block.bridge-conduit.name = Condotta Sopraelevata +block.rotary-pump.name = Pompa a Turbina +block.thorium-reactor.name = Reattore al Torio block.mass-driver.name = Lancia Materiali -block.blast-drill.name = Trivella ad impulsi -block.thermal-pump.name = Pompa termica -block.thermal-generator.name = Generatore termico +block.blast-drill.name = Trivella ad Impulsi +block.thermal-pump.name = Pompa Termica +block.thermal-generator.name = Generatore Termico block.alloy-smelter.name = Altoforno block.mender.name = Riparatore block.mend-projector.name = Riparatore Grande @@ -982,12 +1040,12 @@ unit.eradicator.name = Estirpatore unit.lich.name = Lich unit.reaper.name = Mietitore tutorial.next = [lightgray] -tutorial.intro = Sei entrato nel[scarlet] Tutorial di Mindustry.[]\nInizia[accent] scavando rame[]. Clicca un minerale di rame vicino al tuo nucleo per farlo.\n\n[accent]{0}/{1} rame +tutorial.intro = Sei entrato nel[scarlet] Tutorial di Mindustry.[]\nInizia[accent] scavando rame[]. Clicca un minerale di rame vicino al tuo Nucleo per farlo.\n\n[accent]{0}/{1} rame tutorial.intro.mobile = You have entered the[scarlet] Mindustry Tutorial.[]\nSwipe the screen to move.\n[accent]Pinch with 2 fingers [] 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 = Ora crea una trivella.\n[accent]Le trivelle []scavano da sole e sono più efficienti. Piazzane una su un minerale di rame. tutorial.drill.mobile = Ora crea una trivella. \n[accent] Le trivelle []scavano da sole e sono più efficienti. \n Toccare la scheda della trivella in basso a destra. \n Selezionare la trivella meccanica [accent] []. \n Posizionarlo su una vena di rame toccando, quindi premere il segno di spunta [accent] [] in basso per confermare la selezione. \n Premere il tasto X [accent] [] per annullare il posizionamento. tutorial.blockinfo = Ogni blocco ha statistiche diverse. Alcuni minerali richiedono trivelle specifiche.\nPer controllare le informazioni e le statistiche di un blocco, [accent] tocca "?" mentre lo selezioni nel database. []\n\n[accent]Accedi ora alle statistiche della trivella meccanica. [] -tutorial.conveyor = [accent]I nastri trasportatori []sono usati per trasportare oggetti al nucleo. \nCrea una linea di nastri dalla trivella al nucleo. +tutorial.conveyor = [accent]I nastri trasportatori []sono usati per trasportare oggetti al Nucleo. \nCrea una linea di nastri dalla trivella al Nucleo. tutorial.conveyor.mobile = [accent] I nastri trasportatori [] sono usati per trasportare oggetti nel nocciolo. \nCrea una linea di nastri trasportatori dalla trivella al nocciolo. \n[accent] Posizionati in una linea tenendo premuto il dito per alcuni secondi [] e trascinando in una direzione. \n\n [accent] {0} / {1} nastri trasportatori disposti in linea \n [accent] 0/1 oggetti consegnati tutorial.turret = Costruisci delle torrette per respingere il nemico [LIGHT_GRAY] []. \nCostruisci una torretta Duo vicino alla tua base. tutorial.drillturret = La Torretta Duo richiede[accent] munizioni di rame[] per sparare.\nPosiziona una trivella e collega un nastro alla torretta per rifornirla di munizioni con il rame estratto. @@ -995,13 +1053,14 @@ tutorial.pause = Durante la battaglia, puoi mettere in pausa il gioco [accent]. tutorial.pause.mobile = Durante la battaglia, puoi mettere in pausa il gioco [accent]. []\nPuoi disporre gli edifici mentre sei in pausa. \n\n[accent] Premi questo pulsante in alto a sinistra per mettere in pausa. tutorial.unpause = Ora premi di nuovo spazio per annullare la pausa. tutorial.unpause.mobile = Ora premilo di nuovo per annullare la pausa. -tutorial.breaking = I blocchi spesso devono essere distrutti. \n [accent]Tieni premuto il tasto destro del mouse [] per distruggere tutti i blocchi in una selezione. []\n[accent]Distruggi tutti i blocchi di scarto a sinistra del tuo core usando la selezione dell'area . -tutorial.breaking.mobile = I blocchi spesso devono essere distrutti. \n [accent] Seleziona la modalità di decostruzione [], quindi tocca un blocco per iniziare a smantellarlo. \n Distruggi un'area tenendo premuto il dito per alcuni secondi [] e trascinando in una direzione.\nPremi il pulsante con il segno di spunta per confermare la rimozione. \n\n [accent] Distruggi tutti i blocchi di scarto a sinistra del tuo nucleo usando la selezione dell'area. -tutorial.withdraw = In alcune situazioni, è necessario prendere gli oggetti direttamente dai blocchi.\nPer fare ciò, [accent] tocca un blocco []con oggetti al suo interno, quindi [accent] tocca l'oggetto [] nell'inventario. \nPuoi prelevare più oggetti insieme[accent]tenendo premuto il tasto sinistro del mouse[].\n[accent]Preleva un po' di rame dal nucleo. [] -tutorial.deposit = Deposita tutti gli oggetti che trasporti trascinandoli dalla tua nave al blocco di destinazione. \n[accent]Rimetti il rame nel nucleo. [] -tutorial.waves = Il nemico [LIGHT_GRAY] si avvicina.\nDifendi il tuo nucleo per 2 ondate. Costruisci più torrette. Puoi sparare tenendo premuto il tasto sinistro del mouse. -tutorial.waves.mobile = Il [lightgray] nemico si avvicina.\n\n Difendi il nucleo per 2 ondate. La tua nave sparerà automaticamente contro i nemici.\nCostruisci più torrette. -tutorial.launch = Una volta raggiunta un'ondata specifica, sarai in grado di [accent] decollare con il nucleo [], lasciando la zona e abbandonando le tue difese e le tue strutture\nOtterrai [accent]tutte le risorse nel tuo nucleo[] e potrai quindi usarle per ricercare nuove tecnologie.\n\n [accent]Decolla e conferma per terminare il tutorial. +tutorial.breaking = I blocchi spesso devono essere distrutti. \n [accent]Tieni premuto il tasto destro del mouse [] per distruggere tutti i blocchi in una selezione. []\n[accent]Distruggi tutti i blocchi di scarto a sinistra del tuo Nucleo usando la selezione dell'area . +tutorial.breaking.mobile = I blocchi spesso devono essere distrutti. \n [accent] Seleziona la modalità di decostruzione [], quindi tocca un blocco per iniziare a smantellarlo. \n Distruggi un'area tenendo premuto il dito per alcuni secondi [] e trascinando in una direzione.\nPremi il pulsante con il segno di spunta per confermare la rimozione. \n\n [accent] Distruggi tutti i blocchi di scarto a sinistra del tuo Nucleo usando la selezione dell'area. +tutorial.withdraw = In alcune situazioni, è necessario prendere gli oggetti direttamente dai blocchi.\nPer fare ciò, [accent] tocca un blocco []con oggetti al suo interno, quindi [accent] tocca l'oggetto [] nell'inventario. \nPuoi prelevare più oggetti insieme[accent]tenendo premuto il tasto sinistro del mouse[].\n[accent]Preleva un po' di rame dal Nucleo. [] +tutorial.deposit = Deposita tutti gli oggetti che trasporti trascinandoli dalla tua nave al blocco di destinazione. \n[accent]Rimetti il rame nel Nucleo. [] +tutorial.waves = Il nemico [LIGHT_GRAY] si avvicina.\nDifendi il tuo Nucleo per 2 ondate. Costruisci più torrette. Puoi sparare tenendo premuto il tasto sinistro del mouse. +tutorial.waves.mobile = Il [lightgray] nemico si avvicina.\n\n Difendi il Nucleo per 2 ondate. La tua nave sparerà automaticamente contro i nemici.\nCostruisci più torrette. +tutorial.launch = Una volta raggiunta un'ondata specifica, sarai in grado di [accent] decollare con il Nucleo [], lasciando la zona e abbandonando le tue difese e le tue strutture\nOtterrai [accent]tutte le risorse nel tuo Nucleo[] e potrai quindi usarle per ricercare nuove tecnologie.\n\n [accent]Decolla e conferma per terminare il tutorial. + item.copper.description = Un utile materiale, usato dappertutto item.lead.description = Un materiale di base, molto usato nei blocchi di trasporto. item.metaglass.description = Un durissimo composto di vetro. Estensivamente usato per trasporto di liquidi ed immagazzinamento. @@ -1030,8 +1089,8 @@ mech.dart-ship.description = Una navicella standard. Molto veloce e leggera, ma mech.javelin-ship.description = Una navetta da tocca e fuga. Anche se inizialmente lenta, può accelerare ad alte velocità e volare sopra gli avamposti dei nemici, e provocare molti danni ai nemici tramite l'utilizzo di fulmini o missili. mech.trident-ship.description = Un bombardiere pesante. Molto ben protetto. mech.glaive-ship.description = Una grande e ben armata macchina da guerra. Equipaggiata con lanciafamme e con accelerazione veloce. -unit.draug.description = Un drone minerario primitivo. Economico da produrre. Sacrificabile. Scava automaticamente rame e piombo nelle vicinanze. Fornisce risorse estratte al nucleo più vicino. -unit.spirit.description = L'unità drone di partenza. Si genera nel nucleo per impostazione predefinita. Scava automaticamente, raccoglie oggetti e ripara blocchi. +unit.draug.description = Un drone minerario primitivo. Economico da produrre. Sacrificabile. Scava automaticamente rame e piombo nelle vicinanze. Fornisce risorse estratte al Nucleo più vicino. +unit.spirit.description = L'unità drone di partenza. Si genera nel Nucleo per impostazione predefinita. Scava automaticamente, raccoglie oggetti e ripara blocchi. unit.phantom.description = Un'unità drone avanzata. Scava automaticamente, raccoglie oggetti e ripara blocchi. Significativamente più efficace del drone di partenza. unit.dagger.description = Un unità terrena base, molto più efficiente se in branco. unit.crawler.description = Un'unità di terra costituita da un telaio essenziale con potenti esplosivi legati sulla parte superiore. Non particolarmente resistente. Esplode a contatto con i nemici. @@ -1063,12 +1122,12 @@ block.power-source.description = Produce energia infinita, esiste solo nella mod block.item-source.description = Produce oggetti infiniti, esiste solo nella modalità creativa. block.item-void.description = Elimina gli oggetti che vi entrano senza bisogno di energia, esiste solo nella modalità creativa. block.liquid-source.description = Emette continuamente liquidi. Esiste solo nella modalità creativa. -block.copper-wall.description = Un blocco difensivo economico.\nUtile per proteggere il nucleo e le torrette nelle prime ondate. -block.copper-wall-large.description = Un blocco difensivo economico.\nUtile per proteggere il nucleo e le torrette nelle prime ondate. \nOccupa più blocchi +block.copper-wall.description = Un blocco difensivo economico.\nUtile per proteggere il Nucleo e le torrette nelle prime ondate. +block.copper-wall-large.description = Un blocco difensivo economico.\nUtile per proteggere il Nucleo e le torrette nelle prime ondate. \nOccupa più tessere. block.titanium-wall.description = Un blocco difensivo moderatamente forte.\nFornisce una protezione moderata dai nemici. block.titanium-wall-large.description = Un blocco difensivo moderatamente forte.\nFornisce una protezione moderata dai nemici. \nOccupa più blocchi -block.plastanium-wall.description = A special type of wall that absorbs electric arcs and blocks automatic power node connections. -block.plastanium-wall-large.description = A special type of wall that absorbs electric arcs and blocks automatic power node connections.\nSpans multiple tiles. +block.plastanium-wall.description = Un tipo speciale di muro che assorbe gli archi elettrici e blocca le connessioni automatiche del nodo d'energia. +block.plastanium-wall-large.description = Un tipo speciale di muro che assorbe gli archi elettrici e blocca le connessioni automatiche dei nodi d'energia.\nSi estende su più blocchi. block.thorium-wall.description = Un forte blocco difensivo.\nBuona protezione dai nemici. block.thorium-wall-large.description = Un forte blocco difensivo.\nBuona protezione dai nemici.\nOccupa più blocchi block.phase-wall.description = Non è forte come un muro di torio, ma devia i proiettili a meno che non siano troppo potenti. @@ -1088,7 +1147,7 @@ block.junction.description = Permette di incrociare nastri che trasportano mater block.bridge-conveyor.description = Consente il trasporto di oggetti fino a 3 tessere ad un altro nastro sopraelevato.\nPuò passare sopra ad altri blocchi od edifici. block.phase-conveyor.description = Nastro avanzato. Consuma energia per teletrasportare gli oggetti su un altro nastro di fase collegato. block.sorter.description = Divide gli oggetti. Se l'oggetto corrisponde a quello selezionato, Può passare. Altrimenti viene espulso sui lati. -block.inverted-sorter.description = Processes items like a standard sorter, but outputs selected items to the sides instead. +block.inverted-sorter.description = Elabora gli oggetti come uno smistatore standard, ma in uscita dà gli elementi selezionati ai lati. block.router.description = Accetta gli elementi da una direzione e li emette fino a 3 altre direzioni allo stesso modo. Utile per suddividere i materiali da una fonte a più destinazioni. block.distributor.description = Un distributore avanzato che divide gli oggetti in altre 7 direzioni allo stesso modo. block.overflow-gate.description = Una combinazione di un incrocio e di un distributore , che distribuisce sui suoi lati se in nastro difronte si satura. @@ -1096,13 +1155,13 @@ block.mass-driver.description = Ultimo blocco di trasporto di oggetti. Raccoglie block.mechanical-pump.description = Una pompa economica con potenza lenta, ma nessun consumo di energia. block.rotary-pump.description = Una pompa avanzata che raddoppia la velocità consumando energia. block.thermal-pump.description = La pompa migliore. Tre volte più veloce di una pompa meccanica e l'unica pompa in grado di recuperare la lava. -block.conduit.description = Condotta di base. Funziona come un nastro trasportatore, ma per i liquidi. Ideale per estrattori, pompe o altre condotte. -block.pulse-conduit.description = Condotta avanzata. Trasporta più liquido e più velocemente delle condotte standard. +block.conduit.description = Condotto di base. Funziona come un nastro trasportatore, ma per i liquidi. Ideale per estrattori, pompe o altri condotti. +block.pulse-conduit.description = Condotto avanzato. Trasporta più liquido e più velocemente dei condotti standard. block.liquid-router.description = Accetta i liquidi da una direzione e li emette fino a 3 altre direzioni allo stesso modo. Può anche immagazzinare una certa quantità di liquido. Utile per suddividere i liquidi da una fonte verso più destinazioni. block.liquid-tank.description = Conserva una grande quantità di liquidi. Usalo per creare zone cuscinetto quando c'è una domanda non costante di materiali o come protezione per il raffreddamento di blocchi vitali. -block.liquid-junction.description = Permette di incrociare condotte che trasportano liquidi diversi in posizioni diverse. -block.bridge-conduit.description = Consente il trasporto di liquidi fino a 3 tessere da un altra condotta sopraelevata.\nPuò passare sopra ad altri blocchi od edifici. -block.phase-conduit.description = Condotta avanzata. Consuma energia per teletrasportare i liquidi in un altra condotta di fase collegata. +block.liquid-junction.description = Permette di incrociare condotti che trasportano liquidi diversi in posizioni diverse. +block.bridge-conduit.description = Consente il trasporto di liquidi fino a 3 tessere da un altro condotto sopraelevato.\nPuò passare sopra ad altri blocchi od edifici. +block.phase-conduit.description = Condotto avanzato. Consuma energia per teletrasportare i liquidi in un altro condotto di fase collegato. block.power-node.description = Trasmette energia tra i nodi collegati. È possibile creare fino a quattro collegamenti.\nClicca sul nodo per configurare i collegamenti. block.power-node-large.description = Ha un raggio maggiore rispetto al nodo energetico e si possono creare un massimo di sei collegamenti.\nClicca sul nodo per configurare i collegamenti. block.surge-tower.description = Un nodo di alimentazione a lungo raggio solo due connessioni disponibili.\nClicca sul nodo per configurare i collegamenti. @@ -1124,13 +1183,13 @@ block.blast-drill.description = La trivella migliore. Richiede grandi quantità block.water-extractor.description = Estrae l'acqua dal terreno. Usalo quando non c'è nessun lago nelle vicinanze. block.cultivator.description = Coltiva il terreno con acqua per ottenere materia organica. block.oil-extractor.description = Utilizza grandi quantità di energia per estrarre petrolio dalla sabbia. Usalo quando non c'è una fonte diretta di petrolio nelle vicinanze. -block.core-shard.description = La prima iterazione del nucleo. Una volta distrutto, tutti i contatti con la regione vengono persi. Non lasciare che questo accada. -block.core-foundation.description = La seconda versione del nucleo. Meglio corazzato. Immagazzina più risorse. -block.core-nucleus.description = La terza ed ultima versione del nucleo. Estremamente ben corazzato. Immagazzina enormi quantità di risorse. +block.core-shard.description = La prima iterazione del Nucleo. Una volta distrutto, tutti i contatti con la regione vengono persi. Non lasciare che questo accada. +block.core-foundation.description = La seconda versione del Nucleo. Meglio corazzato. Immagazzina più risorse. +block.core-nucleus.description = La terza ed ultima versione del Nucleo. Estremamente ben corazzato. Immagazzina enormi quantità di risorse. block.vault.description = Immagazzina una grande quantità di oggetti. Usalo per creare zone cuscinetto quando c'è una domanda non costante di materiali. Uno [LIGHT_GRAY]scaricatore[] può essere utilizzato per recuperare elementi dal deposito. block.container.description = Immagazzina una piccola quantità di oggetti. Usalo per creare zone cuscinetto quando c'è una domanda non costante di materiali. Uno [LIGHT_GRAY]scaricatore[] può essere utilizzato per recuperare elementi dal contenitore. -block.unloader.description = Scarica gli oggetti da un contenitore, caveau o nucleo su un trasportatore o direttamente in un blocco adiacente. L'oggetto da scaricare può essere scelto toccando lo scaricatore. -block.launch-pad.description = Lancia oggetti nel tuo nucleo senza necessità di un lasciare la zona. +block.unloader.description = Scarica gli oggetti da un contenitore, caveau o Nucleo su un trasportatore o direttamente in un blocco adiacente. L'oggetto da scaricare può essere scelto toccando lo scaricatore. +block.launch-pad.description = Lancia oggetti nel tuo Nucleo senza necessità di un lasciare la zona. block.launch-pad-large.description = Una versione migliore dell'Ascensore Spaziale, immagazzina più oggetti. Lancia oggetti più frequentemente. block.duo.description = Una torretta piccola ed economica. block.scatter.description = Una torretta antiaerea di medie dimensioni. Spara schegge di piombo o frammenti di rottami sulle unità nemiche. @@ -1146,7 +1205,7 @@ block.ripple.description = Una grande torretta di artiglieria che spara più col block.cyclone.description = Una grande torretta a fuoco rapido. block.spectre.description = Una grande torretta che spara due potenti proiettili contemporaneamente. block.meltdown.description = Una grande torretta che spara un potente laser a lungo raggio. -block.command-center.description = Da istruzioni alle unità alleate nella mappa. Comanda la ricongizione, l'attacco del nucleo nemico o la ritirata verso il proprio nucleo o fabbrica.\nQuando non è presente un nucleo nemico, le unità pattuglieranno anche se viene ordinato un attacco. +block.command-center.description = Da istruzioni alle unità alleate nella mappa. Comanda la ricongizione, l'attacco del Nucleo nemico o la ritirata verso il proprio Nucleo o fabbrica.\nQuando non è presente un Nucleo nemico, le unità pattuglieranno anche se viene ordinato un attacco. block.draug-factory.description = Produce droni per la raccolta mineraria. block.spirit-factory.description = Produce droni che riparano blocchi. block.phantom-factory.description = Produce droni avanzati che seguono il giocatore e lo assistono nella costruzione. diff --git a/core/assets/bundles/bundle_ja.properties b/core/assets/bundles/bundle_ja.properties index 14a3e7e066..06cc822663 100644 --- a/core/assets/bundles/bundle_ja.properties +++ b/core/assets/bundles/bundle_ja.properties @@ -17,29 +17,29 @@ screenshot.invalid = マップが広すぎます。スクリーンショット gameover = ゲームオーバー gameover.pvp = [accent] {0}[] チームの勝利! highscore = [accent]ハイスコアを更新! -copied = Copied. +copied = コピーしました。 load.sound = サウンド load.map = マップ load.image = 画像 load.content = コンテンツ load.system = システム load.mod = MOD -schematic = Schematic -schematic.add = Save Schematic... -schematics = Schematics -schematic.replace = A schematic by that name already exists. Replace it? -schematic.import = Import Schematic... -schematic.exportfile = Export File -schematic.importfile = Import File -schematic.browseworkshop = Browse Workshop -schematic.copy = Copy to Clipboard -schematic.copy.import = Import from Clipboard -schematic.shareworkshop = Share on Workshop +schematic = 設計図 +schematic.add = 設計図を保存しています... +schematics = 設計図一覧 +schematic.replace = 同じ名前の設計図があるようです。 上書きしますか? +schematic.import = 設計図を読み込んでいます... +schematic.exportfile = ファイルに出力する +schematic.importfile = ファイルから読み込む +schematic.browseworkshop = ワークショップを表示する +schematic.copy = クリップボードにコピーする +schematic.copy.import = クリップボードから読み込む +schematic.shareworkshop = ワークショップで共有する schematic.flip = [accent][[{0}][]/[accent][[{1}][]: Flip Schematic -schematic.saved = Schematic saved. -schematic.delete.confirm = This schematic will be utterly eradicated. -schematic.rename = Rename Schematic -schematic.info = {0}x{1}, {2} blocks +schematic.saved = 設計図を保存しました。 +schematic.delete.confirm = この設計図は完全に削除されます。よろしいですか +schematic.rename = 設計図の名前を変更する。 +schematic.info = {0}x{1}, {2} ブロック stat.wave = 防衛したウェーブ:[accent] {0} stat.enemiesDestroyed = 敵による破壊数:[accent] {0} stat.built = 建設した建造物数:[accent] {0} @@ -64,7 +64,7 @@ customgame = カスタムプレイ newgame = 新しく始める none = <なし> minimap = ミニマップ -position = Position +position = 位置 close = 閉じる website = ウェブサイト quit = 終了 @@ -80,25 +80,25 @@ uploadingcontent = コンテンツをアップロードしています uploadingpreviewfile = プレビューファイルをアップロードしています committingchanges = 変更を適応中 done = 完了 -feature.unsupported = Your device does not support this feature. +feature.unsupported = あなたのデバイスはこの機能をサポートしていません。 mods.alphainfo = Mods機能は実験的なものです。[scarlet] エラーが含まれている可能性があります[]。\n 発見した問題をMindustry GitHubに報告してください。 mods.alpha = [accent](Alpha) mods = Mods mods.none = [LIGHT_GRAY]Modが見つかりませんでした! mods.guide = Modding Guide -mods.report = Report Bug -mods.openfolder = Open Mod Folder +mods.report = バグを報告する +mods.openfolder = MODのフォルダを開く mod.enabled = [lightgray]有効 mod.disabled = [scarlet]無効 mod.disable = 無効化 -mod.delete.error = Unable to delete mod. File may be in use. +mod.delete.error = MODを削除することができませんでした。 mod.missingdependencies = [scarlet]Missing dependencies: {0} mod.nowdisabled = [scarlet]Mod '{0}' is missing dependencies:[accent] {1}\n[lightgray]These mods need to be downloaded first.\nThis mod will be automatically disabled. mod.enable = 有効化 mod.requiresrestart = このModをインストールするためにはゲームの再起動が必要です。 mod.reloadrequired = [scarlet]Modを有効にするには、この画面を開き直してください。 mod.import = Modをインポート -mod.import.github = Import GitHub Mod +mod.import.github = GitHubからMODを読み込む mod.remove.confirm = このModを削除します。 mod.author = [LIGHT_GRAY]著者:[] {0} mod.missing = このセーブには、アップグレードされた可能性があるModsか、ここに存在しないModsが必要です。 メモリのセーブを保存する! ロードしてもよろしいですか?\n[lightgray]MODS:\n{0} @@ -166,7 +166,7 @@ server.version = [lightgray]バージョン: {0} {1} server.custombuild = [yellow]カスタムビルド confirmban = このプレイヤーをBanしてもよろしいですか? confirmkick = このプレイヤーをキックしてもよろしいですか? -confirmvotekick = Are you sure you want to vote-kick this player? +confirmvotekick = このプレイヤーを投票キックしてもよろしいですか? confirmunban = このプレイヤーのBanを解除してもよろしいですか? confirmadmin = このプレイヤーを管理者にしてもよろしいですか? confirmunadmin = このプレイヤーを管理者から削除してもよろしいですか? @@ -202,7 +202,7 @@ save.rename = 名前を変更 save.rename.text = 新しい名前: selectslot = セーブデータを選択してください。 slot = [accent]スロット {0} -editmessage = Edit Message +editmessage = メッセージを編集する save.corrupted = [accent]セーブファイルが無効、または破損しました!\nゲームのアップデート直後の場合、恐らくセーブデータのフォーマットの変更によるもので、バグではありません。 empty = <空> on = オン @@ -237,10 +237,10 @@ quit.confirm.tutorial = チュートリアルを終了しますか?\nチュー loading = [accent]読み込み中... reloading = [accent]Reloading Mods... saving = [accent]保存中... -cancelbuilding = [accent][[{0}][] to clear plan -selectschematic = [accent][[{0}][] to select+copy -pausebuilding = [accent][[{0}][] to pause building -resumebuilding = [scarlet][[{0}][] to resume building +cancelbuilding = [accent][[{0}][] 選択を解除する +selectschematic = [accent][[{0}][] 選択し、コピーする +pausebuilding = [accent][[{0}][] 建築を一時的に中断する +resumebuilding = [scarlet][[{0}][] 建築を再開する wave = [accent]ウェーブ {0} wave.waiting = [lightgray]次のウェーブまで {0} 秒 wave.waveInProgress = [lightgray]ウェーブ進行中 @@ -424,8 +424,8 @@ launch.confirm = すべての資源をコアに搬入し、発射します。\n launch.skip.confirm = スキップすると、次の発射可能なウェーブまで発射できません。 uncover = 開放 configure = 積み荷の設定 -bannedblocks = Banned Blocks -addall = Add All +bannedblocks = 禁止ブロック +addall = すべて追加 configure.locked = [lightgray]ウェーブ {0} を達成すると積み荷を設定できるようになります。 configure.invalid = 値は 0 から {0} の間でなければなりません。 zone.unlocked = [lightgray]{0} がアンロックされました. @@ -509,7 +509,7 @@ blocks.shootrange = 範囲 blocks.size = 大きさ blocks.liquidcapacity = 液体容量 blocks.powerrange = 電力範囲 -blocks.powerconnections = Max Connections +blocks.powerconnections = 最大接続数 blocks.poweruse = 電力使用量 blocks.powerdamage = 電力/ダメージ blocks.itemcapacity = アイテム容量 @@ -531,10 +531,10 @@ blocks.reload = ショット/秒 blocks.ammo = 弾薬 bar.drilltierreq = より良いドリルが必要です bar.drillspeed = 採掘速度: {0}/秒 -bar.pumpspeed = Pump Speed: {0}/s +bar.pumpspeed = ポンプの速度: {0}/s bar.efficiency = 効率: {0}% bar.powerbalance = 電力: {0}/秒 -bar.powerstored = Stored: {0}/{1} +bar.powerstored = 残量: {0}/{1} bar.poweramount = 電力: {0} bar.poweroutput = 電力発電量: {0} bar.items = アイテム: {0} @@ -578,7 +578,7 @@ setting.landscape.name = 横画面で固定 setting.shadows.name = 影 setting.blockreplace.name = Automatic Block Suggestions setting.linear.name = リニアフィルター -setting.hints.name = Hints +setting.hints.name = ヒント setting.animatedwater.name = 水のアニメーション setting.animatedshields.name = シールドのアニメーション setting.antialias.name = アンチエイリアス[lightgray] (再起動が必要)[] @@ -599,7 +599,7 @@ setting.difficulty.insane = クレイジー setting.difficulty.name = 難易度: setting.screenshake.name = 画面の揺れ setting.effects.name = 画面効果 -setting.destroyedblocks.name = Display Destroyed Blocks +setting.destroyedblocks.name = 破壊されたブロックを表示 setting.conveyorpathfinding.name = Conveyor Placement Pathfinding setting.sensitivity.name = 操作感度 setting.saveinterval.name = 自動保存間隔 @@ -610,7 +610,7 @@ setting.fps.name = FPSを表示 setting.vsync.name = VSync setting.pixelate.name = ピクセル化[lightgray] (アニメーションが無効化されます) setting.minimap.name = ミニマップを表示 -setting.position.name = Show Player Position +setting.position.name = プレイヤーの位置表示 setting.musicvol.name = 音楽 音量 setting.ambientvol.name = 環境音 音量 setting.mutemusic.name = 音楽をミュート @@ -620,7 +620,7 @@ setting.crashreport.name = 匿名でクラッシュレポートを送信する setting.savecreate.name = 自動保存 setting.publichost.name = 誰でもゲームに参加できるようにする setting.chatopacity.name = チャットの透明度 -setting.lasersopacity.name = Power Laser Opacity +setting.lasersopacity.name = レーザーの透明度 setting.playerchat.name = ゲーム内にチャットを表示 public.confirm = Do you want to make your game public?\n[accent]Anyone will be able to join your games.\n[lightgray]This can be changed later in Settings->Game->Public Game Visibility. public.beta = Note that beta versions of the game cannot make public lobbies. @@ -843,8 +843,8 @@ block.copper-wall.name = 銅の壁 block.copper-wall-large.name = 巨大な銅の壁 block.titanium-wall.name = チタンの壁 block.titanium-wall-large.name = 巨大なチタンの壁 -block.plastanium-wall.name = Plastanium Wall -block.plastanium-wall-large.name = Large Plastanium Wall +block.plastanium-wall.name = プラスタニウムの壁 +block.plastanium-wall-large.name = 巨大なプラスタニウムの壁 block.phase-wall.name = フェーズファイバーの壁 block.phase-wall-large.name = 巨大なフェーズファイバーの壁 block.thorium-wall.name = トリウムの壁 @@ -864,8 +864,8 @@ block.junction.name = ジャンクション block.router.name = ルーター block.distributor.name = ディストリビューター block.sorter.name = ソーター -block.inverted-sorter.name = Inverted Sorter -block.message.name = Message +block.inverted-sorter.name = 反転ソーター +block.message.name = メッセージブロック block.overflow-gate.name = オーバーフローゲート block.silicon-smelter.name = シリコン溶鉱炉 block.phase-weaver.name = フェーズ織機 @@ -1088,7 +1088,7 @@ block.junction.description = 十字に交差したコンベアーをそれぞれ block.bridge-conveyor.description = 高度な輸送ブロックです。地形や建物を超えて、3ブロック離れた場所にアイテムを輸送することができます。 block.phase-conveyor.description = 改良されたアイテム転送ブロックです。電力を使用して、離れた場所にあるフェーズコンベアーにアイテムを転送することができます。 block.sorter.description = アイテムを分別して搬出します。設定したアイテムは通過させます。他のアイテムが搬入されると側面にアイテムを搬出します。 -block.inverted-sorter.description = Processes items like a standard sorter, but outputs selected items to the sides instead. +block.inverted-sorter.description = アイテムを分別して搬出します。設定したアイテムは側面に搬出されます。他のアイテムが搬入されるとアイテムを通過させます。通常のルーターと反対の動作をします。 block.router.description = 搬入したアイテムをほかの3方向に均等に搬出します。一つの資源から複数に分ける際などに使われます。 block.distributor.description = 高度なルーターです。搬入したアイテムをほかの7方向に均等に分けて搬出します。 block.overflow-gate.description = 搬出先にアイテムを搬入する空きがない場合に左右にアイテムを搬出します。 diff --git a/core/assets/bundles/bundle_ko.properties b/core/assets/bundles/bundle_ko.properties index 51ef110c8f..ddaa1612f0 100644 --- a/core/assets/bundles/bundle_ko.properties +++ b/core/assets/bundles/bundle_ko.properties @@ -10,6 +10,7 @@ link.dev-builds.description = 불안정한 개발 빌드들 link.trello.description = 다음 출시될 기능들을 게시한 공식 Trello 보드 link.itch.io.description = PC 버전 다운로드와 HTML5 버전이 있는 itch.io 사이트 link.google-play.description = Google Play 스토어 정보 +link.f-droid.description = F-Droid 카탈로그 link.wiki.description = 공식 Mindustry 위키 linkfail = 링크를 여는 데 실패했습니다!\nURL이 기기의 클립보드에 복사되었습니다. screenshot = 스크린샷이 {0} 경로에 저장되었습니다. @@ -18,12 +19,15 @@ gameover = 게임 오버 gameover.pvp = [accent]{0}[] 팀이 승리했습니다! highscore = [accent]최고점수 달성! copied = 복사됨. + load.sound = 소리 load.map = 맵 load.image = 사진 load.content = 컨텐츠 load.system = 시스템 load.mod = 모드 +load.scripts = 스크립트 + schematic = 설계도 schematic.add = 설계도 저장하기 schematics = 설계도 모음 @@ -40,6 +44,7 @@ schematic.saved = 설계도 저장됨. schematic.delete.confirm = 삭제된 설계도는 복구할 수 없습니다. 정말로 삭제하시겠습니까? schematic.rename = 설계도명 변경 schematic.info = 크기 : {0}x{1}, 블럭 수 : {2} + stat.wave = 버틴 단계 수 : [accent]{0} stat.enemiesDestroyed = 파괴한 적 수 : [accent]{0} stat.built = 건설한 건물 수 : [accent]{0} @@ -47,6 +52,7 @@ stat.destroyed = 파괴된 건물 수 : [accent]{0} stat.deconstructed = 파괴한 건물 수 : [accent]{0} stat.delivered = 획득한 자원 : stat.rank = 최종 점수 : [accent]{0} + launcheditems = [accent]창고 launchinfo = [출격되지 않음][[출격]파랑색으로 표시된 자원들을 획득합니다. map.delete = 정말로 "[accent]{0}[]" 맵을 삭제하시겠습니까? @@ -74,6 +80,7 @@ maps.browse = 맵 검색 continue = 계속하기 maps.none = [LIGHT_GRAY]맵을 찾을 수 없습니다! invalid = 오류 +pickcolor = 색 preparingconfig = 설정 사전준비 preparingcontent = 컨텐츠 사전준비 uploadingcontent = 컨텐츠 업로드 @@ -81,17 +88,19 @@ uploadingpreviewfile = 미리보기 파일 업로드 committingchanges = 바뀐 점 적용 done = 완료 feature.unsupported = 당신의 기기는 이 기능을 지원하지 않습니다. + mods.alphainfo = 현재의 모드는 첫 번째 시도이며, 그리고[scarlet] 버그가 매우 많음을 명심하십시오[].\n만약 버그를 발견할경우 Mindustry 깃허브 또는 디스코드로 제보해주세요. mods.alpha = [scarlet](Alpha) mods = 모드 mods.none = [LIGHT_GRAY]추가한 모드가 없습니다! mods.guide = 모드 가이드 mods.report = 버그 신고 -mods.openfolder = Open Mod Folder -mod.enabled = [firebrick]활성화 -mod.disabled = [lightgray]비활성화 +mods.openfolder = 모드 폴더 열기 +mod.enabled = [lightgray]활성화 +mod.disabled = [scarlet]비활성화 mod.disable = 비활성화 mod.delete.error = 모드를 삭제할 수 없습니다. 아마도 해당 모드가 사용중인 것 같습니다. +mod.requiresversion = [scarlet]게임의 버전이 낮아 모드를 활성화할 수 없습니다!\n[scarlet]요구되는 게임 버전 : [accent]{0} mod.missingdependencies = [scarlet]의존되는 모드: {0} mod.nowdisabled = [scarlet]모드 '{0}'는 다음의 모드에 의존합니다 :[accent] {1}\n[lightgray]이 모드를 먼저 다운로드해야합니다.\n이 모드는 자동으로 비활성화됩니다. mod.enable = 활성화 @@ -99,11 +108,14 @@ mod.requiresrestart = 모드 변경사항을 적용하기 위해 게임을 종 mod.reloadrequired = [scarlet]새로고침 예정됨 mod.import = 모드 추가 mod.import.github = 깃허브 모드 추가 +mod.item.remove = 이것은 모드[accent] '{0}'[]의 자원입니다. 이 자원을 삭제하려면, 이 모드를 제거해야합니다. mod.remove.confirm = 이 모드를 삭제하시겠습니까? mod.author = [LIGHT_GRAY]제작자 : [] {0} mod.missing = 이 세이브파일에는 설치하지 않은 모드 혹은 이 버전에 속해있지 않은 데이터가 포함되어 있습니다. 이 파일을 불러올 경우 세이브파일의 데이터가 손상될 수 있습니다. 정말로 이 파일을 불러오시겠습니까?\n[lightgray]모드 :\n{0} mod.preview.missing = 워크샵에 당신의 모드를 업로드하기 전에 미리보기 이미지를 먼저 추가해야합니다.\n[accent] preview.png[]라는 이름으로 미리보기 이미지를 당신의 모드 폴더안에 준비한 후 다시 시도해주세요. mod.folder.missing = 워크샵에는 폴더 형태의 모드만 게시할 수 있습니다.\n모드를 폴더 형태로 바꾸려면 파일을 폴더에 압축 해제하고 이전 압축파일을 제거한 후, 게임을 재시작하거나 모드를 다시 로드하십시오. +mod.scripts.unsupported = 당신의 기기는 모드스크립트를 지원하지 않습니다. 모드의 일부 기능이 작동하지 않을 수 있습니다. + about.button = 정보 name = 이름 : noname = 먼저 [accent] [] 을 설정하세요. @@ -148,7 +160,7 @@ hosts.none = [lightgray]LAN 게임을 찾을 수 없습니다! host.invalid = [scarlet]서버에 연결할 수 없습니다! trace = 플레이어 정보 보기 trace.playername = 닉네임 : [accent]{0} -trace.ip = IP : [accent]{0}{0} +trace.ip = IP : [accent]{0} trace.id = UUID : [accent]{0} trace.mobile = 모바일 접속 유무 : [accent]{0} trace.modclient = 수정된 클라이언트 : [accent]{0} @@ -173,7 +185,7 @@ confirmunadmin = 이 플레이어를 일반 유저로 만들겠습니까? joingame.title = 게임 참가 joingame.ip = 주소 : disconnect = 서버와 연결이 해제되었습니다. -disconnect.error = 연결 . +disconnect.error = 연결 오류. disconnect.closed = 연결이 끊어졌습니다.. disconnect.timeout = 연결 시간 한계 도달.. disconnect.data = 월드 데이터 로딩 실패.. @@ -183,7 +195,7 @@ connecting.data = [accent]월드 데이터 로딩중... server.port = 포트 : server.addressinuse = 주소가 이미 사용중입니다! server.invalidport = 포트가 올바르지 않습니다! -server.error = [accent]{0}[crimson]서버를 여는 데 오류가 발생했습니다. +server.error = [crimson]서버를 여는 데 오류가 발생했습니다. save.new = 새로 저장 save.overwrite = 이 저장 슬롯을 덮어씌우겠습니까? overwrite = 덮어쓰기 @@ -271,6 +283,7 @@ publishing = [accent]업로드 중... publish.confirm = 맵을 업로드 하시겠습니까?\n\n[lightgray]먼저 워크샵 EULA에 동의하시지 않으면 맵이 표시되지 않습니다! publish.error = 맵 업로드 오류 : {0} steam.error = 스팀 서비스를 초기화하는데 실패했습니다.\n에러 코드 : {0} + editor.brush = 브러쉬 editor.openin = 편집기 열기 editor.oregen = 광물 무작위 생성 @@ -308,8 +321,8 @@ editor.name = 이름 : editor.spawn = 유닛 생성 editor.removeunit = 유닛 삭제 editor.teams = 팀 -editor.errorload = [accent]{0} 파일을 불러오는 데 실패했습니다. -editor.errorsave = [accent]{0} 파일을 저장하는 데 실패했습니다. +editor.errorload = 파일을 불러오지 습니다. +editor.errorsave = 파일을 저장하지 못했습니다. editor.errorimage = 이것은 맵이 아니라 사진입니다.\n\n예전 맵을 가져오려면 편집기의 '예전 맵 가져오기' 버튼을 사용하세요. editor.errorlegacy = 이 맵은 너무 오래되어, 더는 지원하지 않는 맵 형식을 사용합니다. editor.errornot = 선택한 대상이 맵 파일이 아닙니다. @@ -347,6 +360,7 @@ editor.overwrite = [accept]경고!이 명령은 기존 맵을 덮어씌우게 editor.overwrite.confirm = [scarlet]경고![] 이 이름을 가진 맵이 이미 있습니다. 덮어 쓰시겠습니까? editor.exists = 같은 이름의 맵이 이미 존재합니다. editor.selectmap = 불러올 맵 선택 : + toolmode.replace = 재배치 toolmode.replace.description = 블록을 배치합니다. toolmode.replaceall = 모두 재배치 @@ -361,6 +375,7 @@ toolmode.fillteams = 팀 채우기 toolmode.fillteams.description = 블록 대신 팀 건물로 채웁니다. toolmode.drawteams = 팀 그리기 toolmode.drawteams.description = 블록 대신 팀 건물을 배치합니다. + filters.empty = [LIGHT_GRAY]필터가 없습니다!! 아래 버튼을 눌러 추가하세요. filter.distort = 왜곡 filter.noise = 맵 전체에 타일 혹은 블럭 뿌리기 @@ -392,6 +407,7 @@ filter.option.floor2 = 2번째 바닥 filter.option.threshold2 = 2번째 한계점 filter.option.radius = 반경 filter.option.percentile = 백분위수 + width = 넓이 : height = 높이 : menu = 메뉴 @@ -407,6 +423,7 @@ tutorial = 튜토리얼 tutorial.retake = 튜토리얼 editor = 편집기 mapeditor = 맵 편집기 + abandon = 지역 포기 abandon.text = 이 구역의 모든 자원이 적에게 빼앗길 것입니다. locked = 잠김 @@ -428,7 +445,7 @@ bannedblocks = 금지된 블럭들 addall = 모두 추가 configure.locked = [lightgray]{0}시 시작자원 설정이 해금됩니다. configure.invalid = 해당 값은 0 과 {0} 사이여야 합니다. -zone.unlocked = [LIGHT_GRAY] 잠금 해제되었습니다! +zone.unlocked = [LIGHT_GRAY]지역 {0}이 잠금 해제되었습니다! zone.requirement.complete = {0} 단계 달성 성공! \n{1} 지역 요구사항이 충족되었습니다! zone.config.unlocked = 시작자원 설정 해금! : [lightgray]\n{0} zone.resources = 감지된 자원 목록 : @@ -437,6 +454,7 @@ zone.objective.survival = 생존 zone.objective.attack = 적 코어 파괴 add = 추가... boss.health = 보스 체력 + connectfail = [crimson]{0}[accent] 서버에 연결하지 못했습니다.[] error.unreachable = 서버에 연결하지 못했습니다.\n서버 주소가 정확히 입력되었나요? error.invalidaddress = 잘못된 주소입니다. @@ -447,6 +465,7 @@ error.mapnotfound = 맵 파일을 찾을 수 없습니다! error.io = 네트워크 I/O 오류. error.any = 알 수 없는 네트워크 오류. error.bloom = 블룸 그래픽 효과를 적용하지 못했습니다.\n당신의 기기가 이 기능을 지원하지 않는 것일 수도 있습니다. + zone.groundZero.name = 전초기지 zone.desertWastes.name = 쓰레기 사막 zone.craters.name = 크레이터 @@ -461,6 +480,7 @@ zone.saltFlats.name = 소금 사막 zone.impact0078.name = Impact 0078 zone.crags.name = 협곡 zone.fungalPass.name = 포자 지대 + zone.groundZero.description = 이 장소는 다시 시작하기에 최적의 환경을 지닌 장소입니다. 적은 수준의 위협이 있으며 자원의 양은 적습니다.\n가능한 한 많은 양의 구리와 납을 수집하십시오.\n출격합시다! zone.frozenForest.description = 이 지역도 산과 가까운 지역입니다 포자들이 흩뿌려져 있으며 극한의 추위도 포자를 막을 수 있을 것 같지 않습니다.\n화력 발전소를 짓고 전력을 확보하여 채광 드론을 사용하는 법을 배우십시오. zone.desertWastes.description = 이 황무지는 끝을 알 수 없을 정도로 광활하고 십자가 형태의 버려진 구조물이 존재합니다.\n석탄이 존재하며 이를 화력발전에 쓰거나 흑연 정제에 쓰십시오.\n\n[lightgray]이 지역에서의 착륙장소는 확실하지 않습니다. @@ -475,10 +495,12 @@ zone.nuclearComplex.description = 과거 토륨의 생산, 연구와 처리를 zone.fungalPass.description = 고산지대과 포자지대 사이의 지역입니다. 소규모의 적 정찰기지가 있으니 디거와 크롤러를 이용해 적의 코어를 파괴하십시오. zone.impact0078.description = [ROYAL]죄송합니다. 아직 설명이 준비되지 않았습니다. zone.crags.description = [ROYAL]죄송합니다. 아직 설명이 준비되지 않았습니다. + settings.language = 언어 settings.data = 게임 데이터 settings.reset = 설정 초기화 settings.rebind = 키 재설정 +settings.resetKey = 키 설정 settings.controls = 조작 settings.game = 게임 settings.sound = 소리 @@ -497,7 +519,7 @@ error.crashtitle = 오류가 발생했습니다. blocks.input = 소모 자원 blocks.output = 출력 자원 blocks.booster = 가속 -block.unknown = [LIGHT_GRAY]??? +block.unknown = [LIGHT_GRAY]OHNO blocks.powercapacity = 전력 용량 blocks.powershot = 1발당 전력 소모량 blocks.damage = 공격력 @@ -509,7 +531,7 @@ blocks.shootrange = 사거리 blocks.size = 크기 blocks.liquidcapacity = 액체 용량 blocks.powerrange = 전력 범위 -blocks.powerconnections = Max Connections +blocks.powerconnections = 최대 연결 수 blocks.poweruse = 전력 사용 blocks.powerdamage = 전력/데미지 blocks.itemcapacity = 저장 용량 @@ -529,14 +551,15 @@ blocks.inaccuracy = 오차각 blocks.shots = 공격 속도 blocks.reload = 재장전 blocks.ammo = 탄약 + bar.drilltierreq = 더 좋은 드릴이 요구됨 -bar.drillspeed = 초당 {0}개 채굴중 -bar.pumpspeed = Pump Speed: {0}/s +bar.drillspeed = 드릴 속도 : {0}개/s +bar.pumpspeed = 펌프 속도 : {0}/s bar.efficiency = 활성화율 : {0}% -bar.powerbalance = 초당 {0} 발전중 +bar.powerbalance = 전력 발전 : {0}/s bar.powerstored = 총 전력 저장량 : {0}/{1} bar.poweramount = 전력 저장량 : {0} -bar.poweroutput = 초당 {0} 발전중 +bar.poweroutput = 전력 출력 : {0} bar.items = 자원량 : {0} bar.capacity = 저장공간 : {0} bar.liquid = 액체 @@ -544,6 +567,9 @@ bar.heat = 발열 bar.power = 전력 bar.progress = 생산 진행도 bar.spawned = 최대 {1}기 중 {0}기 생산됨 +bar.input = 입력 +bar.output = + bullet.damage = [lightgray]피해량 : [stat]{0}[] bullet.splashdamage = [lightgray]범위 피해량 : [stat]{0}[] / [lightgray]피해 범위 : [stat]{1}[lightgray] 타일 bullet.incendiary = [stat]방화 @@ -555,6 +581,7 @@ bullet.freezing = [stat]빙결 bullet.tarred = [stat]타르 bullet.multiplier = 추가 타격 횟수 : [stat]{0}[lightgray] bullet.reload = 공격 속도 : [stat]{0}[lightgray] + unit.blocks = 블록 unit.powersecond = 전력/초 unit.liquidsecond = 액체/초 @@ -567,6 +594,8 @@ unit.persecond = /초 unit.timesspeed = x 배 unit.percent = % unit.items = 자원 +unit.thousands = 천 +unit.millions = 백만 category.general = 일반 category.power = 전력 category.liquids = 액체 @@ -574,11 +603,12 @@ category.items = 아이템 category.crafting = 제작 category.shooting = 사격 category.optional = 보조 아이템 -setting.landscape.name = 가로화면으로 고정 +setting.landscape.name = 가로화면 setting.shadows.name = 그림자 setting.blockreplace.name = 블럭 제안 자동화 setting.linear.name = 선형 필터링 setting.hints.name = 힌트 활성화 +setting.buildautopause.name = 건설 자동 일시정지 setting.animatedwater.name = 움직이는 물 setting.animatedshields.name = 움직이는 보호막 setting.antialias.name = 안티 에일리어싱[LIGHT_GRAY] (재시작 필요)[] @@ -599,14 +629,17 @@ setting.difficulty.insane = 미침 setting.difficulty.name = 난이도 : setting.screenshake.name = 화면 흔들기 setting.effects.name = 화면 효과 -setting.destroyedblocks.name = Display Destroyed Blocks -setting.conveyorpathfinding.name = Conveyor Placement Pathfinding +setting.destroyedblocks.name = 부서진 블럭 표시 +setting.conveyorpathfinding.name = 교차기 자동 설치 setting.sensitivity.name = 컨트롤러 감도 setting.saveinterval.name = 저장 간격 -setting.seconds = 초 +setting.seconds = {0} 초 +setting.blockselecttimeout.name = 블록 선택 시간 초과 +setting.milliseconds = {0} 밀리초 setting.fullscreen.name = 전체 화면 setting.borderlesswindow.name = 테두리 없는 창모드[LIGHT_GRAY] (재시작이 필요할 수 있습니다) setting.fps.name = FPS 표시 +setting.blockselectkeys.name = 블럭 선택 키 setting.vsync.name = VSync 활성화 setting.pixelate.name = 픽셀화[LIGHT_GRAY] (게임에 렉이 심할 경우 이 옵션을 켜주세요.) setting.minimap.name = 미니맵 보기 @@ -618,7 +651,7 @@ setting.sfxvol.name = 효과음 크기 setting.mutesound.name = 소리 끄기 setting.crashreport.name = 익명으로 오류 보고서 자동 전송 setting.savecreate.name = 자동 저장 활성화 -setting.publichost.name = 공개 서버 보이기 +setting.publichost.name = 스팀 공개 서버 보이기 setting.chatopacity.name = 채팅 투명도 setting.lasersopacity.name = 전력 레이저 밝기 setting.playerchat.name = 채팅 말풍선 표시 @@ -635,16 +668,35 @@ category.multiplayer.name = 멀티플레이 command.attack = 공격 command.rally = 순찰 command.retreat = 후퇴 +placement.blockselectkeys = \n[lightgray]키: [{0}, keybind.clear_building.name = 설계도 초기화 keybind.press = 키를 누르세요... keybind.press.axis = 마우스 휠 또는 키를 누르세요... keybind.screenshot.name = 맵 스크린샷 -keybind.move_x.name = 오른쪽/왼쪽 이동 -keybind.move_y.name = 위 / 아래 중간 +keybind.toggle_power_lines.name = 전력 라인 허용 +keybind.move_x.name = 오른쪽 / 왼쪽 이동 +keybind.move_y.name = 위 / 아래 이동 +keybind.mouse_move.name = 커서를 따라서 이동 keybind.schematic_select.name = 영역 설정 keybind.schematic_menu.name = 설계도 메뉴 keybind.schematic_flip_x.name = 설계도 X축 뒤집기 keybind.schematic_flip_y.name = 설계도 Y축 뒤집기 +keybind.category_prev.name = 이전 목록 +keybind.category_next.name = 다음 목록 +keybind.block_select_left.name = 블럭 왼쪽 선택 +keybind.block_select_right.name = 블럭 오른쪽 선택 +keybind.block_select_up.name = 블럭 위쪽 선택 +keybind.block_select_down.name = 블럭 아래쪽 선택 +keybind.block_select_01.name = 카테고리/블럭 선택 1 +keybind.block_select_02.name = 카테고리/블럭 선택 2 +keybind.block_select_03.name = 카테고리/블럭 선택 3 +keybind.block_select_04.name = 카테고리/블럭 선택 4 +keybind.block_select_05.name = 카테고리/블럭 선택 5 +keybind.block_select_06.name = 카테고리/블럭 선택 6 +keybind.block_select_07.name = 카테고리/블럭 선택 7 +keybind.block_select_08.name = 카테고리/블럭 선택 8 +keybind.block_select_09.name = 카테고리/블럭 선택 9 +keybind.block_select_10.name = 카테고리/블럭 선택 10 keybind.fullscreen.name = 전체 화면 keybind.select.name = 선택/공격 keybind.diagonal_placement.name = 대각선 설치 @@ -681,9 +733,11 @@ mode.pvp.description = 실제 플레이어와 PvP를 합니다. 맵에 적어도 mode.attack.name = 공격 mode.attack.description = 적 기지를 파괴하세요. 맵에 빨간팀 코어가 있어야 플레이 가능합니다. mode.custom = 사용자 정의 규칙 + rules.infiniteresources = 무한 자원 -rules.wavetimer = 단계 -rules.waves = 단계 +rules.reactorexplosions = 원자로 폭발 허가여부 +rules.wavetimer = 단계 대기시간 +rules.waves = 단계 활성화 rules.attack = 공격 모드 rules.enemyCheat = 무한한 적 자원 rules.unitdrops = 유닛 처치시 자원 약탈 @@ -692,13 +746,13 @@ rules.unithealthmultiplier = 유닛 체력 배수 rules.playerhealthmultiplier = 플레이어 체력 배수 rules.playerdamagemultiplier = 플레이어 공격력 배수 rules.unitdamagemultiplier = 유닛 공격력 배수 -rules.enemycorebuildradius = 적 코어 건설 금지구역:[LIGHT_GRAY] (타일) -rules.respawntime = 플레이어 부활 대기 시간:[LIGHT_GRAY] (초) +rules.enemycorebuildradius = 적 코어 건설 금지구역 범위 : [LIGHT_GRAY] (타일) +rules.respawntime = 플레이어 부활 대기 시간 : [LIGHT_GRAY] (초) rules.wavespacing = 단계 간격 : [LIGHT_GRAY] (초) rules.buildcostmultiplier = 건설 소모 배수 rules.buildspeedmultiplier = 건설 속도 배수 rules.waitForWaveToEnd = 단계가 끝날때까지 기다리는중 -rules.dropzoneradius = 적 소환 구역 반경 : [LIGHT_GRAY] (타일) +rules.dropzoneradius = 소환 충격파 범위 : [LIGHT_GRAY] (타일) rules.respawns = 단계당 최대 플레이어 부활 횟수 rules.limitedRespawns = 플레이어 부활 제한 rules.title.waves = 단계 @@ -707,6 +761,10 @@ rules.title.resourcesbuilding = 자원 & 건축 rules.title.player = 플레이어들 rules.title.enemy = 적 rules.title.unit = 유닛 +rules.title.experimental = 실험적인 기능 +rules.lighting = 전장의 안개 활성화 +rules.ambientlight = 안개 색 + content.item.name = 아이템 content.liquid.name = 액체 content.unit.name = 유닛 @@ -721,7 +779,7 @@ item.thorium.name = 토륨 item.silicon.name = 실리콘 item.plastanium.name = 플라스터늄 item.phase-fabric.name = 메타 -item.surge-alloy.name = 서지 합금 +item.surge-alloy.name = 설금 item.spore-pod.name = 포자 포드 item.sand.name = 모래 item.blast-compound.name = 폭발물 @@ -753,6 +811,7 @@ mech.trident-ship.name = 트라이던트 mech.trident-ship.weapon = 폭탄 저장고 mech.glaive-ship.name = 글레이브 mech.glaive-ship.weapon = 중무장 인화성 소총 +item.corestorable = [lightgray]코어 잔여 저장공간: {0} item.explosiveness = [LIGHT_GRAY]폭발성 : {0} item.flammability = [LIGHT_GRAY]인화성 : {0} item.radioactivity = [LIGHT_GRAY]방사능 : {0} @@ -768,6 +827,7 @@ mech.buildspeed = [LIGHT_GRAY]건설 속도 : {0}% liquid.heatcapacity = [LIGHT_GRAY]발열 용량 : {0} liquid.viscosity = [LIGHT_GRAY]점도 : {0} liquid.temperature = [LIGHT_GRAY]온도 : {0} + block.sand-boulder.name = 사암 block.grass.name = 잔디 block.salt.name = 소금 @@ -866,6 +926,8 @@ block.distributor.name = 대형 분배기 block.sorter.name = 필터 block.inverted-sorter.name = 반전 필터 block.message.name = 메모 블럭 +block.illuminator.name = 조명 +block.illuminator.description = 작고, 간단한 조명입니다. 색을 변경할 수 있으며 가동하기 위해서 전력이 필요합니다. block.overflow-gate.name = 포화 필터 block.silicon-smelter.name = 실리콘 제련소 block.phase-weaver.name = 메타 합성기 @@ -879,6 +941,7 @@ block.coal-centrifuge.name = 석탄 원심분리기 block.power-node.name = 전력 노드 block.power-node-large.name = 대형 전력 노드 block.surge-tower.name = 설금 타워 +block.diode.name = 배터리 다이오드 block.battery.name = 배터리 block.battery-large.name = 대형 배터리 block.combustion-generator.name = 화력 발전기 @@ -893,8 +956,8 @@ block.cultivator.name = 온실 block.dart-mech-pad.name = 알파 기체 패드 block.delta-mech-pad.name = 델타 기체 패드 block.javelin-ship-pad.name = 재블린 비행선 패드 -block.trident-ship-pad.name = 삼지창 비행선 패드 -block.glaive-ship-pad.name = 글레브 비행선 패드 +block.trident-ship-pad.name = 트라이던트 폭격기 패드 +block.glaive-ship-pad.name = 글레이브 전투기 패드 block.omega-mech-pad.name = 오메가 기체 패드 block.tau-mech-pad.name = 타우 기체 패드 block.conduit.name = 파이프 @@ -930,7 +993,8 @@ block.titan-factory.name = 타이탄 공장 block.fortress-factory.name = 포트리스 공장 block.revenant-factory.name = 망령 전함 공장 block.repair-point.name = 수리 지점 -block.pulse-conduit.name = 퓨즈 파이프 +block.pulse-conduit.name = 펄스 파이프 +block.plated-conduit.name = 도금된 파이프 block.phase-conduit.name = 메타 파이프 block.liquid-router.name = 액체 분배기 block.liquid-tank.name = 물탱크 @@ -957,8 +1021,8 @@ block.rtg-generator.name = RTG 발전기 block.spectre.name = 스펙터 block.meltdown.name = 멜트다운 block.container.name = 컨테이너 -block.launch-pad.name = 발사대 -block.launch-pad-large.name = 큰 출격 패드 +block.launch-pad.name = 자원 출격 패드 +block.launch-pad-large.name = 대형 자원 출격 패드 team.blue.name = 파랑색 팀 team.crux.name = 빨강색 팀 team.sharded.name = 주황색 팀 @@ -976,10 +1040,10 @@ unit.ghoul.name = 구울 폭격기 unit.wraith.name = 유령 전투기 unit.fortress.name = 포트리스 unit.revenant.name = 망령 전함 -unit.eruptor.name = 이어럽터 -unit.chaos-array.name = 혼돈의 군대 +unit.eruptor.name = 이럽터 +unit.chaos-array.name = 혼돈 군주 unit.eradicator.name = 파괴자 -unit.lich.name = 사자왕 +unit.lich.name = 시체 군주 unit.reaper.name = 사신 tutorial.next = [lightgray]< 이 곳을 터치해 진행하세요. > tutorial.intro = [scarlet]Mindustry 튜토리얼[]을 시작하겠습니다.\n [WASD] 키를 눌러 이동할 수 있습니다.\n[accent]Ctrl 키를 누르고 마우스 휠을 돌려 확대 또는 축소가 가능합니다.\n[accent]주황색의 광맥[]을 눌러 [accent]구리[]를 채광하세요.\n구리를 채광한 후에는 코어 근처로 이동한 뒤, 당신의 기체에서 코어로 드래그해 구리를 코어에 넣으세요. 코어 근처에서 채광하면 자동으로 옮겨집니다.\n\n임무 : 구리 채광({0}/{1}) @@ -1002,6 +1066,7 @@ tutorial.deposit = 자원을 다시 블록에 넣을 수도 있습니다.\n\n[ac tutorial.waves = [LIGHT_GRAY]적[]이 접근합니다.\n당신의 기체는 적을 클릭하여 공격할 수 있습니다. 또한, 구리를 더 캐내고 포탑을 더 지어서 방어를 강화하세요.\n\n[accent]2단계 동안 코어를 보호하세요.[] tutorial.waves.mobile = [LIGHT_GRAY]적[]이 접근합니다.\n당신의 기체는 적을 자동조준하지만, 원하는 적을 클릭하여 공격하고 싶은 대상을 바꿀 수 있습니다.\n구리를 더 캐내고 포탑을 더 지어서 방어를 강화하세요.\n\n[accent]2단계동안 코어를 방어하세요.[] tutorial.launch = 특정 단계에 도달하면 [accent]출격[]이 가능합니다.\n[accent]출격[]을 하게되면 해당 지역의 코어에 들어있는 자원들을 캠페인의 자원 창고로 보내지만, 해당 지역의 [accent]모든 것들[]은 날라가게 되니 주의하세요. + item.copper.description = 모든 종류의 블록에서 광범위하게 사용되는 자원입니다. item.lead.description = 쉽게 구할 수 있으며, 전자 및 액체 수송 블록에서 광범위하게 사용되는 자원입니다. item.metaglass.description = 초강력 유리 화합물. 액체 분배 및 저장에 광범위하게 사용됩니다.\n\n[royal]액체를 활용하기 위한 필수품입니다. @@ -1088,7 +1153,7 @@ block.junction.description = 2개의 컨베이어 벨트를 교차시키는 다 block.bridge-conveyor.description = 자원 수송 블록.\n지형이나 건물을 넘어 최대 3개 타일을 건너뛰고 자원을 운송할 수 있습니다. block.phase-conveyor.description = 고급 자원 수송 블록.\n지형이나 건물을 넘어 최대 11개 타일을 건너뛰고 자원을 운송할 수 있습니다. 전기를 사용하고, 기본 터널 컨베이어보다 빠릅니다. block.sorter.description = 자원을 넣어서 필터에 설정된 자원일 경우 바로 앞으로 통과하며, 그렇지 않을 경우 옆으로 이동시킵니다. -block.inverted-sorter.description = Processes items like a standard sorter, but outputs selected items to the sides instead. +block.inverted-sorter.description = 필터와 비슷하지만, 대신에 반전 필터는 설정된 자원을 필터의 양 옆으로 보냅니다. block.router.description = 한 방향에서 자원을 넣을 시 최대 3개의 다른 방향으로 균등하게 내보냅니다. 자원을 한 곳에서 여러 방향으로 분배하는 데 유용합니다. block.distributor.description = 자원을 최대 7개의 다른 방향으로 균등하게 분베하는 고급 분배기. block.overflow-gate.description = 평소에는 자원의 들어온 방향으로 자원을 통과시키지만, 정면이 자원으로 꽉 차거나 다른 사유로 막힐 시 옆으로 자원을 내보냅니다. @@ -1098,6 +1163,7 @@ block.rotary-pump.description = 전기를 사용해 빠른 속도로 액체를 block.thermal-pump.description = 가장 강력한 펌프. block.conduit.description = 기본 파이프\n액체를 배치된 방향으로 느리게 운송합니다. block.pulse-conduit.description = 고급 파이프\n기본 파이프보다 액체 운송 속도가 빠릅니다. +block.plated-conduit.description = 펄스 파이프와 같은 속도로 액체를 운송시키지만, 체력이 더 많습니다. 양 옆으로는 파이프 의외의 대상에서 액체를 받지 않습니다. \n파이프 끝 부분이 블럭에 연결되지 않고 노출되었을 때 누수되는 액체의 양이 더 적습니다. block.liquid-router.description = 액체를 다른 방향으로 분배할 수 있게 하는 블럭입니다. block.liquid-tank.description = 액체를 저장할 수 있는 물탱크 입니다. block.liquid-junction.description = 교차기와 같은 기능을 하나 자원 대신에 액체를 교차시킵니다. @@ -1106,6 +1172,7 @@ block.phase-conduit.description = 고급 액체 수송블록\n전기를 사용 block.power-node.description = 전기을 연결된 대상과 연동시킵니다.\n최대 20개의 대상을 연결할 수 있습니다. 노드는 붙어있는 블록으로부터 전기가 연동됩니다. block.power-node-large.description = 전기를 연결된 대상과 연동시킵니다.\n최대 30개의 대상을 연결시킬 수 있고, 범위도 더 넓습니다. block.surge-tower.description = 전기를 연결된 대상과 연동시킵니다.\n2개의 대상만 연결시킬 수 있지만 대신에 범위가 매우 넓습니다. +block.diode.description = 이 블럭을 배터리와 배터리 사이에 놓아 연결할경우 전력은 화살표 방향으로만 이동할 수 있습니다. 화살표의 뒤에 있는 배터리의 전력량이 앞에 있는 배터리보다 많을 경우에만 이동시킵니다. block.battery.description = 전력 생산량에 여유가 있을경우, 생산된 잉여 전력을 여기에 저장합니다.\n\n[ROYAL]이것을 이용해 한순간에 많은 전력을 사용하는 포탑들을 보조가능합니다. block.battery-large.description = 일반 배터리보다 훨씬 많은 량의 전력을 저장합니다.\n\n[ROYAL]배터리 9개를 설치하는 것보다 효율이 좋습니다. block.combustion-generator.description = 인화성 물질을 태워 소량의 전력을 생산합니다. diff --git a/core/assets/bundles/bundle_nl_BE.properties b/core/assets/bundles/bundle_nl_BE.properties index 1756cd5135..214dc53a1e 100644 --- a/core/assets/bundles/bundle_nl_BE.properties +++ b/core/assets/bundles/bundle_nl_BE.properties @@ -10,7 +10,8 @@ link.dev-builds.description = Onstabiele versies link.trello.description = Officiële Trello voor geplande toevoegingen. link.itch.io.description = Itch.io pagina met de PC downloads en online versie link.google-play.description = Mindustry op Google Play -link.wiki.description = Officiël Mindustry wiki +link.f-droid.description = F-Droid catalogus +link.wiki.description = Officiële Mindustry-wiki linkfail = Openen van link mislukt!\nDe link is gekopiëerd naar je klembord. screenshot = Locatie screenshot: {0} screenshot.invalid = Kaart te groot, mogelijks te weinig geheugen voor een screenshot te kunnen maken. @@ -20,9 +21,9 @@ highscore = [accent]Nieuw record! copied = Gekopieerd. load.sound = Geluiden load.map = Kaarten -load.image = Images -load.content = Content -load.system = System +load.image = Afbeeldingen +load.content = Inhoud +load.system = Systeem load.mod = Mods schematic = Blauwdruk schematic.add = Blauwdruk Opslaan... @@ -67,22 +68,22 @@ minimap = Kaartje position = Positie close = Sluit website = Website -quit = Verlaat -save.quit = Save & Quit +quit = Verlaten +save.quit = Opslaan & Verlaten maps = Kaarten -maps.browse = Browse Maps +maps.browse = Bekijk Kaarten continue = Ga verder maps.none = [LIGHT_GRAY]Geen kaarten gevonden! -invalid = Invalid -preparingconfig = Config Voorbereiden -preparingcontent = Content Voorbereiden -uploadingcontent = Content Uploaden +invalid = Ongeldig +preparingconfig = Configuratie Voorbereiden +preparingcontent = Inhoud Voorbereiden +uploadingcontent = Inhoud Uploaden uploadingpreviewfile = Voorbeeldbestand Uploaden committingchanges = Veranderingen Toepassen done = Klaar feature.unsupported = Uw apparaat ondersteunt deze functie niet. -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.alphainfo = Mods zijn nog in alfa en [scarlet] kunnen zeer onstabiel zijn[].\nMeld problemen die je ondervindt op de Mindustry Github of Discord. +mods.alpha = [accent](Alfa) mods = Mods mods.none = [LIGHT_GRAY]Geen mods gevonden! mods.guide = Handleiding tot Modding @@ -93,8 +94,8 @@ mod.disabled = [scarlet]Uitgeschakeld mod.disable = Schakel uit mod.delete.error = Kan mod niet verwijderen. Bestand is mogelijk in gebruik. mod.missingdependencies = [scarlet]Missing dependencies: {0} -mod.nowdisabled = [scarlet]Mod '{0}' is missing dependencies:[accent] {1}\n[lightgray]These mods need to be downloaded first.\nThis mod will be automatically disabled. -mod.enable = Enable +mod.nowdisabled = [scarlet]De volgende vereisten ontbreken voor mod '{0}':[accent] {1}\n[lightgray]Deze mods moeten eerst gedownload worden.\nDeze mod wordt automatisch uitgeschakeld. +mod.enable = Schakel in mod.requiresrestart = The game will now close to apply the mod changes. mod.reloadrequired = [scarlet]Herladen Vereist mod.import = Importeer Mod @@ -102,9 +103,9 @@ mod.import.github = Importeer GitHub Mod mod.remove.confirm = Deze mod zal worden verwijderd. mod.author = [LIGHT_GRAY]Auteur:[] {0} mod.missing = Dit opslagbestand bevat mods die zijn geupdate of recentelijk zijn verwijderd. Uw opslagbestand kan beschadigd geraken. Bent u zeker dat u wil verdergaan?\n[lightgray]Mods:\n{0} -mod.preview.missing = Before publishing this mod in the workshop, you must add an image preview.\nPlace an image named[accent] preview.png[] into the mod's folder and try again. -mod.folder.missing = Only mods in folder form can be published on the workshop.\nTo convert any mod into a folder, simply unzip its file into a folder and delete the old zip, then restart your game or reload your mods. -about.button = Extra info +mod.preview.missing = Voordat je de mod publiceert moet je een afbeelding voor de voorvertoning toevoegen.\nPlaats een afbeelding met de naam[accent] preview.png[] in de modfolder. +mod.folder.missing = Mods kunnen enkel gepubliceerd worden in foldervorm.\nOm een mod in foldervorm te zetten exporteer je het modbestand uit de zipfile en verwijder je de oude zipfile. Herlaad vervolgens je mods of herstart het spel. +about.button = Over name = Naam: noname = Kies eerst[accent] een naam[]. filename = Bestandsnaam: @@ -118,42 +119,42 @@ players = {0} spelers online players.single = {0} speler online server.closing = [accent]Server wordt gesloten... server.kicked.kick = Je bent uit de server gegooid! -server.kicked.whitelist = You are not whitelisted here. +server.kicked.whitelist = Je bent niet toegestaan om met deze server te verbinden. (Whitelist) server.kicked.serverClose = Server gesloten. -server.kicked.vote = You have been vote-kicked. Goodbye. +server.kicked.vote = Je bent uit de server gegooid na een stemming! server.kicked.clientOutdated = Verouderde versie! Update Mindustry! server.kicked.serverOutdated = Verouderde server! Vraag de eigenaar van de server om de server te updaten! server.kicked.banned = Je bent verbannen van deze server. -server.kicked.typeMismatch = This server is not compatible with your build type. -server.kicked.playerLimit = This server is full. Wait for an empty slot. -server.kicked.recentKick = Je bent daarnet van de server gegooid.\nWacht even voor je weer verbindt +server.kicked.typeMismatch = Deze server is niet compatibel met jouw Mindustry build type. +server.kicked.playerLimit = De server is vol, wacht voor een plekje. +server.kicked.recentKick = Je bent zonet van de server gegooid.\nWacht even voor je weer verbindt server.kicked.nameInUse = Er is al iemand met dezelfde naam op de server. server.kicked.nameEmpty = Je gekozen naam is ongeldig. server.kicked.idInUse = Je bent al verbonden met de server! Verbinden met 2 clients tegelijk is verboden. server.kicked.customClient = Deze server ondersteunt geen aangepaste versies (mods). Download een officiële versie. server.kicked.gameover = Game over! -server.versions = Your version:[accent] {0}[]\nServer version:[accent] {1}[] -host.info = Ook De [accent]host[] knop hosts een server op poort [scarlet]6567[]. \nIedereen die verbonden is met dezelfde [LIGHT_GRAY]wifi of lokaal netwerk[] zou je server moeten zien in zijn server lijst.\n\nAls je wil dat personen kunnen verbinden met je server van ergens anders via IP. Dan is [accent]port forwarding[] is nodig.\n\n[LIGHT_GRAY]Nota: Als iemand problemen heeft met het verbinden tot je LAN spel, zorg dan dat mindustry toestemming heeft tot je lokale netwerk in de Firewall instellingen. +server.versions = Jouw versie:[accent] {0}[]\nServerversie:[accent] {1}[] +host.info = Ook de [accent]host[] knop hosts een server op poort [scarlet]6567[]. \nIedereen die verbonden is met dezelfde [LIGHT_GRAY]wifi of lokaal netwerk[] zou je server moeten zien in zijn server lijst.\n\nAls je wil dat personen kunnen verbinden met je server van ergens anders via IP. Dan is [accent]port forwarding[] is nodig.\n\n[LIGHT_GRAY]Nota: Als iemand problemen heeft met het verbinden tot je LAN spel, zorg dan dat mindustry toestemming heeft tot je lokale netwerk in de Firewall instellingen. join.info = Hier kan je een [accent]server IP[] invullen waarmee je wil verbinden. Je kan hier ook verbinden met servers op je [accent]lokale netwerk[]. LAN en WAN multiplayer wordt ondersteund.\n\n[LIGHT_GRAY]Belangrijk: er is geen automatische globale server lijst; als je met iemand wil verbinden via een IP adres moet je zijn/haar IP adres vragen. -hostserver = Host Game -invitefriends = Invite Friends -hostserver.mobile = Host\nGame -host = Host +hostserver = Open server voor LAN +invitefriends = Nodig vrienden uit. +hostserver.mobile = Open\nServer +host = Open server hosting = [accent]De server wordt geopend... hosts.refresh = Herlaad hosts.discovering = LAN games worden gezocht -hosts.discovering.any = Discovering games +hosts.discovering.any = Games worden gezocht server.refreshing = De server wordt herladen hosts.none = [lightgray]Geen games op je lokale netwerk gevonden. host.invalid = [scarlet]Kan niet verbinden met de host (server). -trace = Zoeken speler -trace.playername = Naam speler: [accent]{0} +trace = Spelersinformatie +trace.playername = Naam: [accent]{0} trace.ip = IP: [accent]{0} -trace.id = Uniek ID: [accent]{0} -trace.mobile = Mobile Client: [accent]{0} +trace.id = Unieke ID: [accent]{0} +trace.mobile = Mobiele Client: [accent]{0} trace.modclient = Aangepaste Client: [accent]{0} -invalidid = Ongeldig client ID! Verstuur een bug report! -server.bans = Verbannen +invalidid = Ongeldige client ID! Verstuur een bug report! +server.bans = Verbanningen server.bans.none = Geen verbannen spelers gevonden! server.admins = Administrators server.admins.none = Geen Administrators gevonden! @@ -164,29 +165,29 @@ server.outdated = [crimson]Verouderde Server![] server.outdated.client = [crimson]Verouderde Client![] server.version = [lightgray]Versie: {0} {1} server.custombuild = [yellow]Aangepaste versie -confirmban = Ben je zeker dat je deze speler wil verbannen? -confirmkick = Ben je zeker dat je deze speler van de server wil gooien? -confirmvotekick = Are you sure you want to vote-kick this player? -confirmunban = Ben je zeker dat je de verbanning ongedaan wil maken? -confirmadmin = Ben je zeker dat je deze speler administrator wil maken? -confirmunadmin = Ben je zeker dat je de Administrator status van deze speler ongedaan wilt maken? +confirmban = Ben je zeker dat je deze speler wilt verbannen? +confirmkick = Ben je zeker dat je deze speler van de server wilt gooien? +confirmvotekick = Ben je zeker dat je een stemming wilt starten om deze speler uit de server to gooien? +confirmunban = Ben je zeker dat je de verbanning wilt opheffen? +confirmadmin = Ben je zeker dat je deze speler administrator wilt maken? +confirmunadmin = Ben je zeker dat je de administratorstatus van deze speler wilt intrekken? joingame.title = Verbinden met server joingame.ip = IP adres: disconnect = Verbinding verbroken. -disconnect.error = Connection error. -disconnect.closed = Connection closed. -disconnect.timeout = Timed out. -disconnect.data = Laden map data mislukt! -cantconnect = Unable to join game ([accent]{0}[]). +disconnect.error = Verbindingsfout. +disconnect.closed = Verbinding afgesloten. +disconnect.timeout = Het duurde te lang voordat de server antwoordde. +disconnect.data = Laden van mapdata mislukt! +cantconnect = Kon niet tot het spel toetreden. ([accent]{0}[]). connecting = [accent]Verbinden... connecting.data = [accent]Laden map data... server.port = Poort: server.addressinuse = Dit adres wordt al gebruikt! server.invalidport = Ongeldige poort! -server.error = [crimson]Error hosting server: [accent]{0} +server.error = [crimson]Fout bij het openen van de server: [accent]{0} save.new = Nieuwe save -save.overwrite = Ben je zeker dat je deze save\nwil overschrijven? -overwrite = Overschrijf +save.overwrite = Ben je zeker dat je deze save\nwilt overschrijven? +overwrite = Vervang save.none = Geen saves gevonden! saveload = [accent]Opslaan... savefail = Opslaan mislukt! @@ -197,27 +198,27 @@ save.import.invalid = [accent]Deze save is ongeldig! save.import.fail = [crimson]Save importeren mislukt: [accent]{0} save.export.fail = [crimson]Save exporteren mislukt: [accent]{0} save.import = Importeer Save -save.newslot = Save naam: +save.newslot = Naam van de save: save.rename = Naam wijzigen save.rename.text = Nieuwe naam: selectslot = Selecteer een save. -slot = [accent]Slot {0} +slot = [accent]Plaats {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. -empty = +save.corrupted = [accent]Het savebestand is corrupt of ongeldig.\nAls je zonet je spel geupdatet hebt is dit waarschijnlijk een verandering in de savestructuur en dus[scarlet] geen[] bug. +empty = on = Aan off = Uit save.autosave = Autosave: {0} save.map = Map: {0} save.wave = Golf {0} -save.mode = Gamemode: {0} -save.date = Last Saved: {0} +save.mode = Spelmodus: {0} +save.date = Laatste save: {0} save.playtime = Playtime: {0} warning = Waarschuwing. confirm = Bevestig delete = Verwijder -view.workshop = View In Workshop -workshop.listing = Edit Workshop Listing +view.workshop = Bekijk In Workshop +workshop.listing = Bewerk Workshop-Publicatie ok = OK open = Open customize = Pas aan @@ -225,40 +226,40 @@ cancel = Annuleer openlink = Open Link copylink = Kopiëer Link back = Terug -data.export = Export Data -data.import = Import Data -data.exported = Data exported. -data.invalid = This isn't valid game data. +data.export = Exporteer Data +data.import = Importeer Data +data.exported = Data geëxporteerd. +data.invalid = Dit is geen geldige speldata. data.import.confirm = Importing external data will erase[scarlet] all[] your current game data.\n[accent]This cannot be undone![]\n\nOnce the data is imported, your game will exit immediately. -classic.export = Export Classic Data -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? +classic.export = Exporteer Classic-Data +classic.export.text = [accent]Mindustry[] heeft een grote update gehad.\nClassic (v3.5 build 40) save of map data is teruggevonden. Wil je deze data exporteren naar je de home-folder van je telefoon voor gebruik in de Mindustry-Classic app? quit.confirm = Weet je zeker dat je wilt stoppen? -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.[] +quit.confirm.tutorial = Ben je zeker dat je nu weet wat je doet?\nDe tutorial kan opnieuw gestart worden via[accent] Instellingen->Spel->Herneem Tutorial.[] loading = [accent]Aan het laden... -reloading = [accent]Reloading Mods... +reloading = [accent]Mods Herladen... saving = [accent]Aan het opslaan... -cancelbuilding = [accent][[{0}][] to clear plan -selectschematic = [accent][[{0}][] to select+copy -pausebuilding = [accent][[{0}][] to pause building -resumebuilding = [scarlet][[{0}][] to resume building +cancelbuilding = [accent][[{0}][] om het plan te annuleren +selectschematic = [accent][[{0}][] om te selecter+kopieren +pausebuilding = [accent][[{0}][] om het bouwen te pauseren +resumebuilding = [scarlet][[{0}][] om verder te gaan met bouwen wave = [accent]Golf {0} wave.waiting = [LIGHT_GRAY]Golf in {0} -wave.waveInProgress = [LIGHT_GRAY]Wave in progress -waiting = [LIGHT_GRAY]Waiting... -waiting.players = Aan het wachten voor spelers... +wave.waveInProgress = [LIGHT_GRAY]Golf bezig +waiting = [LIGHT_GRAY]Wachten... +waiting.players = Aan het wachten op spelers... wave.enemies = [LIGHT_GRAY]{0} Vijanden Over wave.enemy = [LIGHT_GRAY]{0} Vijand Over loadimage = Laad Afbeelding saveimage = Sla Afbeelding Op unknown = Onbekend -custom = Custom -builtin = Built-In +custom = Aangepast +builtin = Ingebouwd map.delete.confirm = Weet je zeker dat je deze kaart wilt verwijderen? Deze actie kan niet ongedaan gemaakt worden! -map.random = [accent]Random Map -map.nospawn = This map does not have any cores for the player to spawn in! Add a[ROYAL] blue[] core to this map in the editor. -map.nospawn.pvp = This map does not have any enemy cores for player to spawn into! Add[SCARLET] non-blue[] cores to this map in the editor. -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.random = [accent]Willekeurige Map +map.nospawn = Deze map heeft geen cores voor spelers om te spawnen! Voeg een[ROYAL] blauwe[] core toe in de mapbewerker. +map.nospawn.pvp = This map does not have any enemy cores for player to spawn into! Voeg een[SCARLET] niet-blauwe[] core toe in de mapbewerker. +map.nospawn.attack = This map does not have any enemy cores for player to attack! Voeg een[SCARLET] rode[] core toe in de mapbewerker. +map.invalid = Fout tijdens het laden van de map: Corrupt of ongeldig mapbestand. workshop.update = Update Item workshop.error = Error fetching workshop details: {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! diff --git a/core/assets/bundles/bundle_pl.properties b/core/assets/bundles/bundle_pl.properties index 95914d3862..7e8ddd3812 100644 --- a/core/assets/bundles/bundle_pl.properties +++ b/core/assets/bundles/bundle_pl.properties @@ -1,4 +1,4 @@ -credits.text = Created by [ROYAL]Anuken[] - [SKY]anukendev@gmail.com[]\n\n[GRAY](In case you can't tell, this text is currently unfinished.\nTranslators, don't edit it yet!) +credits.text = Stworzone przez [ROYAL]Anuken[] - [SKY]anukendev@gmail.com[] credits = Zasłużeni contributors = Tłumacze i pomocnicy discord = Odwiedź nasz serwer Discord! @@ -10,6 +10,7 @@ link.dev-builds.description = Niestabilne wersje gry link.trello.description = Oficjalna tablica Trello z planowanym funkcjami link.itch.io.description = Strona itch.io z oficjanymi wersjami do pobrania link.google-play.description = Strona na sklepie Google Play +link.f-droid.description = F-Droid catalogue listing link.wiki.description = Oficjana Wiki Mindustry linkfail = Nie udało się otworzyć linku!\nURL został skopiowany. screenshot = Zapisano zdjęcie w {0} @@ -18,12 +19,14 @@ gameover = Koniec Gry gameover.pvp = Zwyciężyła drużyna [accent]{0}[]! highscore = [YELLOW] Nowy rekord! copied = Copied. + load.sound = Dźwięki load.map = Mapy load.image = Obrazy load.content = Treść load.system = System load.mod = Mody + schematic = Schemat schematic.add = Zapisz schemat... schematics = Schematy @@ -40,6 +43,7 @@ schematic.saved = Schemat zapisany. schematic.delete.confirm = Ten schemat zostanie kompletnie wyeliminowany. schematic.rename = Zmień nazwę schematu schematic.info = {0}x{1}, {2} bloków + stat.wave = Fale powstrzymane:[accent] {0} stat.enemiesDestroyed = Przeciwnicy zniszczeni:[accent] {0} stat.built = Budynki zbudowane:[accent] {0} @@ -47,8 +51,9 @@ stat.destroyed = Budynki zniszczone:[accent] {0} stat.deconstructed = Budynki zrekonstruowane:[accent] {0} stat.delivered = Surowce wystrzelone: stat.rank = Ocena: [accent]{0} + launcheditems = [accent]Wystrzelone przedmioty -launchinfo = [unlaunched][[LAUNCH] rdzeń aby uzyskać przedmioty oznaczone na niebiesko. +launchinfo = [unlaunched][[WYSTRZEL] rdzeń aby uzyskać przedmioty oznaczone na niebiesko. map.delete = Jesteś pewny, że chcesz usunąć "[accent]{0}[]"? level.highscore = Rekord: [accent]{0} level.select = Wybrany poziom @@ -72,8 +77,10 @@ save.quit = Zapisz & Wyjdź maps = Mapy maps.browse = Przeglądaj Mapy continue = Kontynuuj -maps.none = [LIGHT_GRAY]Nie znaleziono żadnych map! +maps.none = [lightgray]Nie znaleziono żadnych map! invalid = Nieprawidłowy +pickcolor = Wybierz kolor + preparingconfig = Przygotowywanie Konfiguracji preparingcontent = Przygotowywanie Zawartości uploadingcontent = Przesyłanie Zawartości @@ -81,6 +88,7 @@ uploadingpreviewfile = Przesyłanie Pliku Podglądu committingchanges = Zatwierdzanie Zmian done = Gotowe feature.unsupported = Twoje urządzenie nie wspiera tej funkcji. + mods.alphainfo = Pamiętaj, że mody są wersji alpha, i[scarlet] mogą być pełne błędów[].\nZgłaszaj wszystkie znalezione problemy na Mindustry GitHub lub Discord. mods.alpha = [scarlet](Alpha) mods = Mody @@ -104,16 +112,17 @@ mod.author = [LIGHT_GRAY]Autor:[] {0} mod.missing = Ten zapis zawiera mody, które zostały niedawno zaktualizowane, bądź nie są już zainstalowane. Zapis może zostać uszkodzony. Czy jesteś pewien, że chcesz go załadować?\n[lightgray]Mody:\n{0} mod.preview.missing = Przed opublikowaniem tego moda na Warsztacie musisz dodać zdjęcie podglądowe.\nDodaj zdjęcie o nazwie[accent] preview.png[] do folderu moda i spróbuj jeszcze raz. mod.folder.missing = Jedynie mody w formie folderów mogą się znaleźć na Warsztacie.\nBy zamienić moda w folder, wyciągnij go z archiwum, umieść w folderze i usuń archiwum. Później uruchom ponownie grę bądź załaduj ponownie mody. + about.button = O Grze name = Nazwa: -noname = Najpierw wybierz [accent]nazwę gracza[] +noname = Najpierw wybierz[accent] nazwę gracza[] filename = Nazwa Pliku: -unlocked = Odblokowano nowy blok! +unlocked = Odblokowano nową zawartość! completed = [accent]Ukończony techtree = Drzewo Technologiczne -research.list = [LIGHT_GRAY]Badania: +research.list = [lightgray]Badania: research = Badaj -researched = [LIGHT_GRAY]{0} zbadane. +researched = [lightgray]{0} zbadane. players = {0} graczy online players.single = {0} gracz online server.closing = [accent] Zamykanie serwera... @@ -129,23 +138,23 @@ server.kicked.playerLimit = Serwer pełny. Poczekaj na wolne miejsce. server.kicked.recentKick = Zostałeś niedawno wyrzucony.\nPoczekaj chwilę przed ponownym połączniem. server.kicked.nameInUse = Ta nazwa jest już zajęta na tym serwerze. server.kicked.nameEmpty = Wybrana przez Ciebie nazwa jest nieprawidłowa. -server.kicked.idInUse = Jesteś już na serwerze! Używanie tego samego konta na 2 urządzeniach jest zabronione. +server.kicked.idInUse = Jesteś już na serwerze! Łączenie się z dwóch kont nie jest dozwolone. server.kicked.customClient = Ten serwer nie wspomaga wersji deweloperskich. Pobierz oficjalną wersję. server.kicked.gameover = Koniec gry! server.versions = Twoja wersja gry:[accent] {0}[]\nWersja gry serwera:[accent] {1}[] -host.info = Przycisk [accent]host[] hostuje serwer na porcie [scarlet]6567[] i [scarlet]6568.[]\nKażdy w tej samej sieci [LIGHT_GRAY]wifi lub hotspocie[] powinien zobaczyć twój serwer.\n\nJeśli chcesz, aby każdy z twoim IP mógł dołączyć, musisz wykonać [accent]przekierowywanie portów[].\n\n[LIGHT_GRAY]Notka:Jeśli ktokolwiek ma problem z dołączeniem do gry, upewnij się, że udostępniłeś Mindustry dostęp do sieci. -join.info = Tutaj możesz wpisać [accent]adres IP serwera[], aby dołączyć lub wyszukać [accent]serwerów w lokalnej sieci[], do których możesz dołączyć .\nGra wieloosobowa na LAN i WAN jest wspomagana.\n\n[LIGHT_GRAY]Notka: Nie ma automatycznej listy wszystkich serwerów; jeśli chcesz dołączyć przez IP, musisz zapytać hosta o IP. +host.info = Przycisk [accent]host[] hostuje serwer na porcie [scarlet]6567[]. \nKażdy w tej samej sieci [lightgray]wifi lub hotspocie[] powinien zobaczyć twój serwer.\n\nJeśli chcesz, aby każdy z twoim IP mógł dołączyć, musisz wykonać [accent]przekierowywanie portów[].\n\n[lightgray]Notka: Jeśli ktokolwiek ma problem z dołączeniem do gry lokalnej, upewnij się, że udostępniłeś Mindustry dostęp do sieci w ustawieniach zapory (firewall). Zauważ, że niektóre sieci publiczne mogą nie zezwalać na wykrycie serwerów. +join.info = Tutaj możesz wpisać [accent]adres IP serwera[], aby dołączyć lub wyszukać [accent]serwerów w lokalnej sieci[], do których możesz dołączyć .\nGra wieloosobowa na LAN i WAN jest wspomagana.\n\n[lightgray]Notka: Nie ma automatycznej listy wszystkich serwerów; jeśli chcesz dołączyć przez IP, musisz zapytać hosta o IP. hostserver = Stwórz Serwer invitefriends = Zaproś Znajomych hostserver.mobile = Hostuj\nGrę host = Hostuj -hosting = [accent] Otwieranie serwera... +hosting = [accent]Otwieranie serwera... hosts.refresh = Odśwież hosts.discovering = Wyszukiwanie gier w sieci LAN hosts.discovering.any = Wyszukiwanie gier server.refreshing = Odświeżanie serwera -hosts.none = [lightgray] Brak serwerów w sieci LAN! -host.invalid = [scarlet] Nie można połączyć się z hostem. +hosts.none = [lightgray]Brak serwerów w sieci LAN! +host.invalid = [scarlet]Nie można połączyć się z hostem. trace = Zlokalizuj Gracza trace.playername = Nazwa gracza: [accent]{0} trace.ip = IP: [accent]{0} @@ -162,8 +171,8 @@ server.delete = Czy na pewno chcesz usunąć ten serwer? server.edit = Edytuj Serwer server.outdated = [crimson]Przestarzały serwer![] server.outdated.client = [crimson]Przestarzały klient![] -server.version = [lightgray]Wersja: {0} -server.custombuild = [yellow]Zmodowany klient +server.version = [gray]Wersja: {0} +server.custombuild = [accent]Zmodowany klient confirmban = Jesteś pewny, że chcesz zbanować tego gracza? confirmkick = Jesteś pewny, że chcesz wyrzucić tego gracza? confirmvotekick = Jesteś pewny, że chcesz głosować za wyrzuceniem tego gracza? @@ -188,14 +197,14 @@ save.new = Nowy zapis save.overwrite = Czy na pewno chcesz nadpisać zapis gry? overwrite = Nadpisz save.none = Nie znaleziono zapisów gry! -saveload = [accent]Zapisywanie... +saveload = Zapisywanie... savefail = Nie udało się zapisać gry! save.delete.confirm = Czy na pewno chcesz usunąć ten zapis gry? save.delete = Usuń save.export = Eksportuj save.import.invalid = [accent]Zapis gry jest niepoprawny! -save.import.fail = [crimson]Nie udało się zaimportować zapisu: [accent] {0} -save.export.fail = [crimson]Nie można wyeksportować zapisu: [accent] {0} +save.import.fail = [crimson]Nie udało się zaimportować zapisu: [accent]{0} +save.export.fail = [crimson]Nie można wyeksportować zapisu: [accent]{0} save.import = Importuj Zapis save.newslot = Zapisz nazwę: save.rename = Zmień Nazwę @@ -203,7 +212,7 @@ save.rename.text = Nowa nazwa: selectslot = Wybierz zapis. slot = [accent]Slot {0} editmessage = Edytuj Wiadomość -save.corrupted = [accent]Zapis gry jest uszkodzony lub nieprawidłowy! Jeżeli aktualizowałeś grę, najprawdopodobniej jest to zmiana w formacie zapisu i [scarlet]nie jest[] to błąd. +save.corrupted = Zapis gry jest uszkodzony lub nieprawidłowy! empty = on = Włączone off = Wyłączone @@ -231,11 +240,11 @@ data.exported = Dane wyeksportowane. data.invalid = Nieprawidłowe dane gry. data.import.confirm = Zaimportowanie zewnętrznych danych usunie[scarlet] wszystkie[] obecne dane gry.\n[accent]Nie można tego cofnąć![]\n\nGdy dane zostaną zimportowane, gra automatycznie się wyłączy. classic.export = Eksportuj Dane Wersji Klasycznej -classic.export.text = [accent]Mindustry[] otrzymało ostatnio ważną aktualizację.\nClassic (v3.5 build 40) zapis albo mapa zostały wykryte. Czy chciałbyś eksportować te zapisy do katalogu domowego swojego telefonu, do użycia w aplikacji Mindustry Classic? +classic.export.text = [accent]Mindustry[] otrzymało ostatnio ważną aktualizację.\nWykryto zapis lub mapę z wersji classic (v3.5 build 40) - czy chciałbyś eksportować te zapisy do katalogu domowego swojego telefonu, do użycia w aplikacji Mindustry Classic? quit.confirm = Czy na pewno chcesz wyjść? -quit.confirm.tutorial = Czy jesteś pewien tego co robisz?\nSamouczek może zostać powtórzony w[accent] Opcje->Gra->Powtórz samouczek.[] +quit.confirm.tutorial = Czy jesteś pewien tego co robisz?\nSamouczek może zostać powtórzony w[accent] Ustawienia->Gra->Ponów samouczek.[] loading = [accent]Ładowanie... -reloading = [accent]Reloading Mods... +reloading = [accent]Przeładowywanie Modów... saving = [accent]Zapisywanie... cancelbuilding = [accent][[{0}][] by wyczyścić plan selectschematic = [accent][[{0}][] by wybrać+skopiować @@ -243,11 +252,11 @@ pausebuilding = [accent][[{0}][] by wtrzymać budowę resumebuilding = [scarlet][[{0}][] by kontynuować budowę wave = [accent]Fala {0} wave.waiting = Fala za {0} -wave.waveInProgress = [LIGHT_GRAY]Fala w trakcie -waiting = [LIGHT_GRAY]Oczekiwanie... +wave.waveInProgress = [lightgray]Fala w trakcie +waiting = [lightgray]Oczekiwanie... waiting.players = Oczekiwanie na graczy... -wave.enemies = Pozostało [LIGHT_GRAY]{0} wrogów -wave.enemy = Pozostał [LIGHT_GRAY]{0} wróg +wave.enemies = Pozostało [lightgray]{0} wrogów +wave.enemy = Pozostał [lightgray]{0} wróg loadimage = Załaduj Obraz saveimage = Zapisz Obraz unknown = Nieznane @@ -255,8 +264,8 @@ custom = Własne builtin = Wbudowane map.delete.confirm = Jesteś pewny, że chcesz usunąć tę mapę? Nie będzie można jej przywrócić. map.random = [accent]Losowa Mapa -map.nospawn = Ta mapa nie zawiera żadnego rdzenia! Dodaj [ROYAL]niebieski[] rdzeń do tej mapy w edytorze. -map.nospawn.pvp = Ta mapa nie ma żadnego rdzenia przeciwnika, aby mogli się zrespić przeciwnicy! Dodaj[SCARLET] inny niż niebieski[] rdzeń do mapy w edytorze. +map.nospawn = Ta mapa nie zawiera żadnego rdzenia! Dodaj [accent]pomarańczowy[] rdzeń do tej mapy w edytorze. +map.nospawn.pvp = Ta mapa nie ma żadnego rdzenia przeciwnika, aby mogli się zrespić przeciwnicy! Dodaj[SCARLET] inny niż pomarańczowy[] rdzeń do mapy w edytorze. map.nospawn.attack = Ta mapa nie ma żadnego rdzenia przeciwnika, aby można było go zaatakować! Dodaj[SCARLET] czerwony[] rdzeń do mapy w edytorze. map.invalid = Błąd podczas ładowania mapy: uszkodzony lub niepoprawny plik mapy. workshop.update = Aktualizuj pozycję @@ -265,12 +274,13 @@ map.publish.confirm = Czy jesteś pewien, że chcesz opublikować tę mapę?\n\n workshop.menu = Wybierz co chcesz zrobić z tą pozycją. workshop.info = Informacja o pozycji changelog = Historia aktualizacji (opcjonalna): -eula = Umowa EULA Steam +eula = Umowa Użytkownika Końcowego (EULA) Steam missing = Ta pozycja została przeniesiona bądź usunięta.\n[lightgray]Pozycja na Warsztacie została automatycznie odłączona. publishing = [accent]Trwa publikowanie... publish.confirm = Czy jesteś pewien, że chcesz to opublikować?\n\n[lightgray]Najpierw upewnij się, że zgadzasz się z umową EULA Warsztatu, w przeciwnym razie twoje pozycje nie będą widoczne! publish.error = Błąd podczas publikowania pozycji: {0} steam.error = Nie udało się zainicjować serwisów Steam.\nBłąd: {0} + editor.brush = Pędzel editor.openin = Otwórz w Edytorze editor.oregen = Generacja Złóż @@ -301,7 +311,7 @@ waves.load = Załaduj Ze Schowka waves.invalid = Nieprawidłowe fale w schowku. waves.copied = Fale zostały skopiowane. waves.none = Brak zdefiniowanych wrogów.\nPamiętaj, że puste układy fal zostaną automatycznie zastąpione układem domyślnym. -editor.default = [LIGHT_GRAY] +editor.default = [lightgray] details = Detale... edit = Edytuj... editor.name = Nazwa: @@ -310,11 +320,11 @@ editor.removeunit = Usuń Jednostkę editor.teams = Drużyny editor.errorload = Błąd podczas ładowania pliku:\n[accent]{0} editor.errorsave = Błąd podczas zapisywania pliku:\n[accent]{0} -editor.errorimage = To obraz, nie mapa. Nie zmieniaj rozszerzenia, spodziewając się, że to coś zmieni.\n\nJeśli chcesz zaimportować starszą mapę, użyj przycisku „importuj starszą mapę” w edytorze. +editor.errorimage = To obraz, nie mapa.\n\nJeśli chcesz zaimportować mapę z wersji 3.5/build 40, użyj przycisku "Importuj starszą mapę" w edytorze. editor.errorlegacy = Ta mapa jest zbyt stara i używa starszego formatu mapy, który nie jest już obsługiwany. editor.errornot = To nie jest plik mapy. editor.errorheader = Ten plik mapy jest nieprawidłowy lub uszkodzony. -editor.errorname = Mapa nie zawiera nazwy. +editor.errorname = Mapa nie zawiera nazwy. Czy próbujesz załadować zapis gry? editor.update = Aktualizuj editor.randomize = Losuj editor.apply = Zastosuj @@ -347,6 +357,7 @@ editor.overwrite = [accent]Uwaga!\nSpowoduje to nadpisanie istniejącej mapy. editor.overwrite.confirm = [scarlet]Uwaga![] Mapa o tej nazwie już istnieje. Jesteś pewny, że chcesz ją nadpisać? editor.exists = Mapa o tej nazwie już istnieje. editor.selectmap = Wybierz mapę do załadowania: + toolmode.replace = Zastąp toolmode.replace.description = Rysuje tylko na stałych blokach. toolmode.replaceall = Zastąp Wszystko @@ -361,7 +372,8 @@ toolmode.fillteams = Wypełnij Drużyny toolmode.fillteams.description = Wypełniaj drużyny zamiast bloków. toolmode.drawteams = Rysuj Drużyny toolmode.drawteams.description = Rysuj drużyny zamiast bloków. -filters.empty = [LIGHT_GRAY]Brak filtrów! Dodaj jeden za pomocą przycisku poniżej. + +filters.empty = [lightgray]Brak filtrów! Dodaj jeden za pomocą przycisku poniżej. filter.distort = Zniekształcanie filter.noise = Szum filter.median = Mediana @@ -391,7 +403,8 @@ filter.option.ore = Ruda filter.option.floor2 = Druga Podłoga filter.option.threshold2 = Drugi Próg filter.option.radius = Zasięg -filter.option.percentile = Percentyl +filter.option.percentile = Procent + width = Szerokość: height = Wysokość: menu = Menu @@ -401,52 +414,56 @@ load = Wczytaj save = Zapisz fps = FPS: {0} ping = Ping: {0}ms + language.restart = Uruchom grę ponownie, aby ustawiony język zaczął funkcjonować. settings = Ustawienia tutorial = Poradnik tutorial.retake = Ponów Samouczek editor = Edytor mapeditor = Edytor Map + abandon = Opuść abandon.text = Ta strefa i wszystkie jej surowce będą przejęte przez przeciwników. locked = Zablokowane -complete = [LIGHT_GRAY]Ukończone: +complete = [lightgray]Ukończone: requirement.wave = Osiągnij falę {0} w {1} requirement.core = Zniszcz Rdzeń wroga w {0} requirement.unlock = Odblokuj {0} -resume = Kontynuuj Strefę:\n[LIGHT_GRAY]{0} -bestwave = [LIGHT_GRAY]Najwyższa fala: {0} +resume = Kontynuuj Strefę:\n[lightgray]{0} +bestwave = [lightgray]Najwyższa fala: {0} launch = < WYSTRZEL > launch.title = Wystrzelenie Udane -launch.next = [LIGHT_GRAY]Następna okazja przy fali {0} +launch.next = [lightgray]Następna okazja przy fali {0} launch.unable2 = [scarlet]WYSTZRZELENIE niedostępne.[] launch.confirm = Spowoduje to wystrzelenie wszystkich surowców w rdzeniu.\nNie będziesz mógł wrócić do tej bazy. -launch.skip.confirm = Jeśli teraz przejdziesz do kolejnej fali, Nie biędziesz miał możliwości wystrzelenia do czasu pokonania dalszych fal. +launch.skip.confirm = Jeśli teraz przejdziesz do kolejnej fali, nie biędziesz miał możliwości wystrzelenia do czasu pokonania dalszych fal. uncover = Odkryj configure = Skonfiguruj Ładunek bannedblocks = Zabronione bloki addall = Dodaj wszystkie -configure.locked = [LIGHT_GRAY]Dotrzyj do fali {0}\nAby skonfigurować ładunek. +configure.locked = [lightgray]Dotrzyj do fali {0},\naby skonfigurować ładunek. configure.invalid = Ilość musi być liczbą pomiędzy 0 a {0}. -zone.unlocked = [LIGHT_GRAY]Strefa {0} odblokowana. +zone.unlocked = [lightgray]Strefa {0} odblokowana. zone.requirement.complete = Fala {0} osiągnięta:\n{1} Wymagania strefy zostały spełnione. zone.config.unlocked = Ładunek odblokowany:[lightgray]\n{0} -zone.resources = Wykryte Zasoby: +zone.resources = [lightgray]Wykryte Zasoby: zone.objective = [lightgray]Cel: [accent]{0} zone.objective.survival = Przeżyj zone.objective.attack = Zniszcz Rdzeń Wroga add = Dodaj... boss.health = Zdrowie Bossa + connectfail = [crimson]Nie można połączyć się z serwerem:\n\n[accent]{0} error.unreachable = Serwer niedostępny.\nCzy adres jest wpisany poprawnie? error.invalidaddress = Niepoprawny adres. -error.timedout = Przekroczono limit czasu!/nUpewnij się, że host ma ustawione przekierowanie portu oraz, czy adres jest poprawny! +error.timedout = Przekroczono limit czasu!/nUpewnij się, że host ma ustawione przekierowanie portu oraz poprawność wpisanego adresu! error.mismatch = Błąd pakietu:\nprawdopodobne niedopasowanie klienta/serwera.\nUpewnij się, że ty i host macie najnowszą wersję Mindustry! error.alreadyconnected = Jesteś już połączony. error.mapnotfound = Plik mapy nie został znaleziony! error.io = Błąd siecowy I/O. error.any = Nieznany błąd sieci. error.bloom = Nie udało się załadować bloom.\nTwoje urządzenie może nie wspierać tej funkcji. + zone.groundZero.name = Wybuch Lądowy zone.desertWastes.name = Pustynne Pustkowia zone.craters.name = Kratery @@ -461,6 +478,7 @@ zone.saltFlats.name = Solne Równiny zone.impact0078.name = Uderzenie 0078 zone.crags.name = Urwisko zone.fungalPass.name = Grzybowa Przełęcz + zone.groundZero.description = Optymalna lokalizacja, aby rozpocząć jeszcze raz. Niskie zagrożenie. Niewiele zasobów.\nZbierz jak najwięcej miedzi i ołowiu, tyle ile jest możliwe.\nPrzejdź do następnej strefy jak najszybciej. zone.frozenForest.description = Nawet tutaj, bliżej gór, zarodniki rozprzestrzeniły się. Niskie temperatury nie mogą ich zatrzymać na zawsze.\n\nRozpocznij przedsięwzięcie od władzy. Buduj generatory spalinowe. Naucz się korzystać z naprawiaczy. zone.desertWastes.description = Te pustkowia są rozległe, nieprzewidywalne, i znajdują się na nich opuszczone struktury.\nWęgiel jest obecny w tym regionie. Użyj go do produkcji energii, lub do stworzenia grafitu.\n\n[lightgray]Miejsce lądowania nie jest pewne. @@ -472,7 +490,7 @@ zone.overgrowth.description = Obszar ten jest zarośnięty, bliżej źródła za zone.tarFields.description = Obrzeża strefy produkcji ropy, między górami a pustynią. Jeden z niewielu obszarów z rezerwami użytecznej smoły.\nMimo że ta strefa jest opuszczona, w pobliżu znajdują się niebezpieczne siły wroga. Nie lekceważ ich.\n\n[lightgray]Jeśli to możliwe, zbadaj technologię przetwarzania oleju. zone.desolateRift.description = Strefa wyjątkowo niebezpieczna. Obfita w zasoby ale mało miejsca. Wysokie ryzyko zniszczenia. Opuść tę strefe jak najszybciej. Nie daj się zwieść długiemu odstępowi między atakami wroga. zone.nuclearComplex.description = Dawny zakład produkcji i przetwarzania toru, zredukowny do ruin.\n[lightgray]Zbadaj tor i jego zastosowania.\n\nWróg jest tutaj obecny w dużej ilości, nieustannie poszukuje napastników. -zone.fungalPass.description = Przejściowy obszar pomiędzy wysokimi górami a nisko znajdującymi się, ogarniętymi przez zarodniki równinami. Znajduje się tu mała postawiona przez wrogów baza zwiadowcza.\nZniszcz ją.\nUżyj jednostek Nóż i Pełzak. Zniszcz oba rdżenie. +zone.fungalPass.description = Przejściowy obszar pomiędzy wysokimi górami a nisko znajdującymi się, ogarniętymi przez zarodniki równinami. Znajduje się tu mała postawiona przez wrogów baza zwiadowcza.\nZniszcz ją.\nUżyj jednostek Nóż i Pełzak. Zniszcz oba rdzenie. zone.impact0078.description = zone.crags.description = settings.language = Język @@ -497,7 +515,7 @@ error.crashtitle = Wystąpił błąd blocks.input = Wejście blocks.output = Wyjście blocks.booster = Wzmacniacz -block.unknown = [LIGHT_GRAY]??? +block.unknown = [lightgray]??? blocks.powercapacity = Pojemność mocy blocks.powershot = moc/strzał blocks.damage = Obrażenia @@ -509,7 +527,7 @@ blocks.shootrange = Zasięg blocks.size = Rozmiar blocks.liquidcapacity = Pojemność cieczy blocks.powerrange = Zakres mocy -blocks.powerconnections = Max Connections +blocks.powerconnections = Maksymalna ilość połączeń blocks.poweruse = Zużycie prądu blocks.powerdamage = Moc/Zniszczenia blocks.itemcapacity = Pojemność przedmiotów @@ -529,9 +547,10 @@ blocks.inaccuracy = Niedokładność blocks.shots = Strzały blocks.reload = Strzałów/sekundę blocks.ammo = Amunicja + bar.drilltierreq = Wymagane Lepsze Wiertło bar.drillspeed = Prędkość wiertła: {0}/s -bar.pumpspeed = Pump Speed: {0}/s +bar.pumpspeed = Prędkość pompy: {0}/s bar.efficiency = Efektywność: {0}% bar.powerbalance = Moc: {0} bar.powerstored = Zmagazynowano: {0}/{1} @@ -544,6 +563,9 @@ bar.heat = Ciepło bar.power = Prąd bar.progress = Postęp Budowy bar.spawned = Jednostki: {0}/{1} +bar.input = Input +bar.output = Output + bullet.damage = [stat]{0}[lightgray] Obrażenia bullet.splashdamage = [stat]{0}[lightgray] Obrażenia obszarowe ~[stat] {1}[lightgray] kratki bullet.incendiary = [stat]zapalający @@ -555,6 +577,7 @@ bullet.freezing = [stat]zamrażający bullet.tarred = [stat]smolny bullet.multiplier = [stat]{0}[lightgray]x mnożnik amunicji bullet.reload = [stat]{0}[lightgray]x szybkość ataku + unit.blocks = bloki unit.powersecond = jednostek prądu na sekundę unit.liquidsecond = jednostek płynów na sekundę @@ -576,12 +599,13 @@ category.shooting = Strzelanie category.optional = Dodatkowe ulepszenia setting.landscape.name = Zablokuj tryb panoramiczny setting.shadows.name = Cienie -setting.blockreplace.name = Automatic Block Suggestions +setting.blockreplace.name = Automatyczne sugestie bloków setting.linear.name = Filtrowanie Liniowe -setting.hints.name = Hints +setting.hints.name = Podpowiedzi +setting.buildautopause.name = Automatycznie zatrzymaj budowanie setting.animatedwater.name = Animowana woda setting.animatedshields.name = Animowana Tarcza -setting.antialias.name = Antyaliasing[LIGHT_GRAY] (wymaga restartu)[] +setting.antialias.name = Antyaliasing[lightgray] (wymaga restartu)[] setting.indicators.name = Wskaźniki Przyjaciół setting.autotarget.name = Automatyczne Celowanie setting.keyboard.name = Sterowanie - Myszka+Klawiatura @@ -599,18 +623,21 @@ setting.difficulty.insane = Szalony setting.difficulty.name = Poziom trudności setting.screenshake.name = Wstrząsy ekranu setting.effects.name = Wyświetlanie efektów -setting.destroyedblocks.name = Display Destroyed Blocks +setting.destroyedblocks.name = Wyświetl zniszczone bloki setting.conveyorpathfinding.name = Conveyor Placement Pathfinding setting.sensitivity.name = Czułość kontrolera setting.saveinterval.name = Interwał automatycznego zapisywania -setting.seconds = {0} Sekundy +setting.seconds = {0} sekund +setting.blockselecttimeout.name = Block Select Timeout +setting.milliseconds = {0} millisekund setting.fullscreen.name = Pełny ekran -setting.borderlesswindow.name = Bezramkowe okno[LIGHT_GRAY] (może wymagać restartu) -setting.fps.name = Pokazuj FPS +setting.borderlesswindow.name = Bezramkowe okno[lightgray] (może wymagać restartu) +setting.fps.name = Pokazuj FPS oraz ping +setting.blockselectkeys.name = Show Block Select Keys setting.vsync.name = Synchronizacja pionowa -setting.pixelate.name = Pikselacja [LIGHT_GRAY](wyłącza animacje) +setting.pixelate.name = Pikselacja [lightgray](wyłącza animacje) setting.minimap.name = Pokaż Minimapę -setting.position.name = Show Player Position +setting.position.name = Pokazuj położenie gracza setting.musicvol.name = Głośność muzyki setting.ambientvol.name = Głośność otoczenia setting.mutemusic.name = Wycisz muzykę @@ -622,7 +649,7 @@ setting.publichost.name = Widoczność Gry Publicznej setting.chatopacity.name = Przezroczystość czatu setting.lasersopacity.name = Przezroczystość laserów zasilających setting.playerchat.name = Wyświetlaj czat w grze -public.confirm = Czy chcesz ustawić swoją grę jako publiczną?\n[lightgray]Można to później zmienić w Ustawienia->Gra->Widoczność Gry Publicznej. +public.confirm = Czy chcesz ustawić swoją grę jako publiczną?\n[accent]Każdy będzie mógł dołączyć do twojej gry.\n[lightgray]Można to później zmienić w Ustawienia->Gra->Widoczność Gry Publicznej. public.beta = Wersje beta gry nie mogą tworzyć publicznych pokoi. uiscale.reset = Skala interfejsu uległa zmianie.\nNaciśnij "OK" by potwierdzić zmiany.\n[scarlet]Cofanie zmian i wyjście z gry za[accent] {0}[] uiscale.cancel = Anuluj i Wyjdź @@ -635,16 +662,36 @@ category.multiplayer.name = Wielu graczy command.attack = Atakuj command.rally = Zbierz command.retreat = Wycofaj +placement.blockselectkeys = \n[lightgray]Key: [{0}, keybind.clear_building.name = Wyczyść budynek keybind.press = Naciśnij wybrany klawisz... keybind.press.axis = Naciśnij oś lub klawisz... keybind.screenshot.name = Zrzut ekranu mapy +keybind.toggle_power_lines.name = Toggle Power Lines keybind.move_x.name = Poruszanie w poziomie keybind.move_y.name = Poruszanie w pionie +keybind.mouse_move.name = Follow Mouse +keybind.dash.name = Dash keybind.schematic_select.name = Wybierz region keybind.schematic_menu.name = Menu schematów keybind.schematic_flip_x.name = Obróć schemat horyzontalnie keybind.schematic_flip_y.name = Obróć schemat wertykalnie +keybind.category_prev.name = Poprzednia kategoria +keybind.category_next.name = Następna kategoria +keybind.block_select_left.name = Block Select Left +keybind.block_select_right.name = Block Select Right +keybind.block_select_up.name = Block Select Up +keybind.block_select_down.name = Block Select Down +keybind.block_select_01.name = Category/Block Select 1 +keybind.block_select_02.name = Category/Block Select 2 +keybind.block_select_03.name = Category/Block Select 3 +keybind.block_select_04.name = Category/Block Select 4 +keybind.block_select_05.name = Category/Block Select 5 +keybind.block_select_06.name = Category/Block Select 6 +keybind.block_select_07.name = Category/Block Select 7 +keybind.block_select_08.name = Category/Block Select 8 +keybind.block_select_09.name = Category/Block Select 9 +keybind.block_select_10.name = Category/Block Select 10 keybind.fullscreen.name = Przełącz Pełny Ekran keybind.select.name = Zaznacz keybind.diagonal_placement.name = Budowa po skosie @@ -658,7 +705,6 @@ keybind.menu.name = Menu keybind.pause.name = Pauza keybind.pause_building.name = Wstrzymaj/kontynuuj budowę keybind.minimap.name = Minimapa -keybind.dash.name = Przyspieszenie keybind.chat.name = Czat keybind.player_list.name = Lista graczy keybind.console.name = Konsola @@ -672,16 +718,18 @@ keybind.drop_unit.name = Wyrzucanie przedmiot keybind.zoom_minimap.name = Powiększenie mapy mode.help.title = Opis trybów mode.survival.name = Przeżycie -mode.survival.description = Zwykły tryb. Limitowane surowce i fale przeciwników. +mode.survival.description = Zwykły tryb. Limitowane surowce i fale przeciwników.\n[gray]Wymaga spawnów wroga na mapie, aby móc grać na tym trybie. mode.sandbox.name = Piaskownica mode.sandbox.description = Nieskończone surowce i fale bez odliczania. mode.editor.name = Edytor mode.pvp.name = PvP -mode.pvp.description = Walcz przeciwko innym graczom. +mode.pvp.description = Walcz przeciwko innym graczom.\n[gray]Wymaga co najmniej dwóch rdzeniów o róźnych kolorach na mapie, aby móc grać na tym trybie mode.attack.name = Atak -mode.attack.description = Brak fal. Celem jest zniszczenie bazy przeciwnika. +mode.attack.description = Brak fal. Celem jest zniszczenie bazy przeciwnika.\n[gray]Wymaga czerwonego rdzenia na mapie, aby móc grać na tym trybie. mode.custom = Własny tryb + rules.infiniteresources = Nieskończone zasoby +rules.reactorexplosions = Eksplozje reaktorów rules.wavetimer = Zegar fal rules.waves = Fale rules.attack = Tryb ataku @@ -692,13 +740,13 @@ rules.unithealthmultiplier = Mnożnik życia jednostek rules.playerhealthmultiplier = Mnożnik życia gracza rules.playerdamagemultiplier = Mnożnik obrażeń gracza rules.unitdamagemultiplier = Mnożnik obrażeń jednostek -rules.enemycorebuildradius = Zasięg blokady budowy przy rdżeniu wroga:[LIGHT_GRAY] (kratki) -rules.respawntime = Czas odrodzenia:[LIGHT_GRAY] (sek) -rules.wavespacing = Odstępy między falami:[LIGHT_GRAY] (sek) +rules.enemycorebuildradius = Zasięg blokady budowy przy rdzeniu wroga:[lightgray] (kratki) +rules.respawntime = Czas odrodzenia:[lightgray] (sek) +rules.wavespacing = Odstępy między falami:[lightgray] (sek) rules.buildcostmultiplier = Mnożnik kosztów budowania rules.buildspeedmultiplier = Mnożnik prędkości budowania rules.waitForWaveToEnd = Fale czekają na przeciwników -rules.dropzoneradius = Zasięg strefy zrzutu:[LIGHT_GRAY] (kratki) +rules.dropzoneradius = Zasięg strefy zrzutu:[lightgray] (kratki) rules.respawns = Maksymalna ilośc odrodzeń na falę rules.limitedRespawns = Ogranicz Odrodzenia rules.title.waves = Fale @@ -707,6 +755,10 @@ rules.title.resourcesbuilding = Zasoby i Budowanie rules.title.player = Gracze rules.title.enemy = Przeciwnicy rules.title.unit = Jednostki +rules.title.experimental = Eksperymentalne +rules.lighting = Oświetlenie +rules.ambientlight = Światła otoczenia + content.item.name = Przedmioty content.liquid.name = Płyny content.unit.name = Jednostki @@ -753,21 +805,22 @@ mech.trident-ship.name = Trójząb mech.trident-ship.weapon = Wnęka bombowa mech.glaive-ship.name = Glewia mech.glaive-ship.weapon = Zapalający Karabin -item.explosiveness = [LIGHT_GRAY]Wybuchowość: {0} -item.flammability = [LIGHT_GRAY]Palność: {0} -item.radioactivity = [LIGHT_GRAY]Promieniotwórczość: {0} -unit.health = [LIGHT_GRAY]Zdrowie: {0} -unit.speed = [LIGHT_GRAY]Prędkość: {0} -mech.weapon = [LIGHT_GRAY]Broń: {0} -mech.health = [LIGHT_GRAY]Zdrowie: {0} -mech.itemcapacity = [LIGHT_GRAY]Pojemność przedmiotów: {0} -mech.minespeed = [LIGHT_GRAY]Prędkość kopania: {0} -mech.minepower = [LIGHT_GRAY]Moc kopania: {0} -mech.ability = [LIGHT_GRAY]Umiejętność: {0} -mech.buildspeed = [LIGHT_GRAY]Szybkość Budowy: {0}% -liquid.heatcapacity = [LIGHT_GRAY]Wytrzymałość na przegrzewanie: {0} -liquid.viscosity = [LIGHT_GRAY]Lepkość: {0} -liquid.temperature = [LIGHT_GRAY]Temperatura: {0} +item.explosiveness = [lightgray]Wybuchowość: {0} +item.flammability = [lightgray]Palność: {0} +item.radioactivity = [lightgray]Promieniotwórczość: {0} +unit.health = [lightgray]Zdrowie: {0} +unit.speed = [lightgray]Prędkość: {0} +mech.weapon = [lightgray]Broń: {0} +mech.health = [lightgray]Zdrowie: {0} +mech.itemcapacity = [lightgray]Pojemność przedmiotów: {0} +mech.minespeed = [lightgray]Prędkość kopania: {0} +mech.minepower = [lightgray]Moc kopania: {0} +mech.ability = [lightgray]Umiejętność: {0} +mech.buildspeed = [lightgray]Szybkość Budowy: {0}% +liquid.heatcapacity = [lightgray]Wytrzymałość na przegrzewanie: {0} +liquid.viscosity = [lightgray]Lepkość: {0} +liquid.temperature = [lightgray]Temperatura: {0} + block.sand-boulder.name = Piaskowy Głaz block.grass.name = Trawa block.salt.name = Sól @@ -794,7 +847,7 @@ block.thruster.name = Silnik block.kiln.name = Wypalarka block.graphite-press.name = Grafitowa Prasa block.multi-press.name = Multi-Prasa -block.constructing = {0} [LIGHT_GRAY](Budowa) +block.constructing = {0} [lightgray](Budowa) block.spawn.name = Spawn wrogów block.core-shard.name = Rdzeń: Odłamek block.core-foundation.name = Rdzeń: Podstawa @@ -843,8 +896,8 @@ block.copper-wall.name = Miedziana Ściana block.copper-wall-large.name = Duża Miedziana Ściana block.titanium-wall.name = Tytanowa Ściana block.titanium-wall-large.name = Duża Tytanowa Ściana -block.plastanium-wall.name = Plastanium Wall -block.plastanium-wall-large.name = Large Plastanium Wall +block.plastanium-wall.name = Ściana z Plastanu +block.plastanium-wall-large.name = Duża Ściana z Plastanu block.phase-wall.name = Fazowa Ściana block.phase-wall-large.name = Duża Fazowa Ściana block.thorium-wall.name = Torowa Ściana @@ -866,6 +919,8 @@ block.distributor.name = Dystrybutor block.sorter.name = Sortownik block.inverted-sorter.name = Odwrotny Sortownik block.message.name = Wiadomość +block.illuminator.name = Illuminator +block.illuminator.description = Małe, kompaktowe i konfigurowane źródło światła. Wymaga energii do funkcjonowania. block.overflow-gate.name = Brama Przepełnieniowa block.silicon-smelter.name = Huta Krzemu block.phase-weaver.name = Fazowa Fabryka @@ -879,6 +934,7 @@ block.coal-centrifuge.name = Wirówka węglowa block.power-node.name = Węzeł Prądu block.power-node-large.name = Duży Węzeł Prądu block.surge-tower.name = Wieża Energetyczna +block.diode.name = Dioda baterii block.battery.name = Bateria block.battery-large.name = Duża Bateria block.combustion-generator.name = Generator Spalinowy @@ -931,6 +987,7 @@ block.fortress-factory.name = Fabryka Mechów Forteca block.revenant-factory.name = Fabryka Krążowników Zjawa block.repair-point.name = Punkt Napraw block.pulse-conduit.name = Rura Pulsacyjna +block.plated-conduit.name = Opancerzona rura block.phase-conduit.name = Rura Fazowa block.liquid-router.name = Rozdzielacz Płynów block.liquid-tank.name = Zbiornik Płynów @@ -982,8 +1039,8 @@ unit.eradicator.name = Niszczyciel unit.lich.name = Obudzony unit.reaper.name = Żniwiarz tutorial.next = [lightgray] -tutorial.intro = Wszedłeś do[scarlet] Samouczka Mindustry.[]\nZacznij od[accent] wydobycia miedzi[]. Aby to zrobić, dotknij żyły rudy miedzi w pobliżu rdzenia.\n\n[accent]{0}/{1} miedź -tutorial.intro.mobile = You have entered the[scarlet] Mindustry Tutorial.[]\nSwipe the screen to move.\n[accent]Pinch with 2 fingers [] 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.intro = Wszedłeś do[scarlet] Samouczka Mindustry.[]\nUżyj [accent][[WASD][], aby poruszyć się.\n[accent]Przytrzymaj [[Ctrl] podczas przewijania[], aby przybliżyć i oddalić widok.\nZacznij od[accent] wydobycia miedzi[]. W tym celu przybliż się, a następnie dotknij żyły rudy miedzi w pobliżu rdzenia.\n\n[accent]{0}/{1} miedź +tutorial.intro.mobile = Wszedłeś do[scarlet] Samouczka Mindustry.[]\nPrzesuń palcem po ekranie, aby poruszyć się.\n[accent]Użyj dwóch palcy[], aby przybliżyć i oddalić widok.\nZacznij od[accent] wydobycia miedzi[]. W tym celu przybliż się, a następnie dotknij żyły rudy miedzi w pobliżu rdzenia.\n\n[accent]{0}/{1} miedź tutorial.drill = Wydobywanie ręczne nie jest efektywne.\n[accent]Wiertła []mogą kopać automatycznie.\nKliknij zakładkę wiertła w prawym dolnym rogu.\nWybierz[accent] wiertło mechaniczne[]. Umieść go na złożu miedzi, klikając.\n[accent]Kliknij prawym przyciskiem myszy[], aby przestać budować. tutorial.drill.mobile = Wydobywanie ręczne jest nieefektywne.\n[accent]Wiertła []mogą kopać automatycznie.\nDotknij zakładkę wiertła w prawym dolnym rogu.\nWybierz[accent] wiertło mechaniczne[].\nUmieść go na złożu miedzi poprzez Stuknięcie, potem wciśnij[accent] ptaszek[] na dole by potwierdzić wybór.\nNaciśnij przycisk[accent] X[] by anulować budowe. tutorial.blockinfo = Każdy blok ma inne statystyki. Każde wiertło może kopać tylko wybrane rudy.\nBy sprawdzić informacje i statystyki bloku,[accent] kliknij przycisk "?" podczas jego wyboru w menu budowy.[]\n\n[accent]Sprawdź teraz statystyki mechanicznego wiertła.[] @@ -1002,12 +1059,13 @@ tutorial.deposit = Włóż przedmioty do bloków poprzez przeciągnięcie z twoj tutorial.waves = [lightgray] Wrogowie[] nadchodzą.\n\nBroń swój rdżeń przez 2 fale.[accent] Kliknij[] by strzelać.\nZbuduj wiecej działek i wierteł. Wydobądź więcej miedzi. tutorial.waves.mobile = [lightgray] Wrogowie[] nadchodzą.\n\nBroń swój rdzeń przez 2 fale. Twój statek będzie automatycznie atakował wrogów.\nZbuduj wiecej działek i wierteł. Wydobądź więcej miedzi. tutorial.launch = Kiedy dotrzesz do określonej fali, masz możliwość[accent] wystrzelenia rdzenia[], pozostawiając struktury obronne za sobą i[accent] otrzymując wszystkie surowce znajdujące się w rdzeniu.[]\nSurowce te mogą potem zostać użyte do odkrywania nowych technologii.\n\n[accent]Naciśnij przycisk Wystrzału. + item.copper.description = Przydatny materiał budowlany. Szeroko używany w prawie każdej konstrukcji. -item.lead.description = Podstawowy matriał. Używany w przesyle przemiotów i płynów. Nie jest on przypadkiem szkodliwy? +item.lead.description = Podstawowy materiał. Używany w przesyle przemiotów i płynów. Nie jest on przypadkiem szkodliwy? item.metaglass.description = Wyjątkowo wytrzymały stop szkła. Szeroko używany w transporcie i przechowywaniu płynów. item.graphite.description = Zmineralizowany węgiel, wykorzystywany do amunicji i izolacji elektrycznej. -item.sand.description = Zwykły materiał używany pospolicie w przepalaniu, stopach i jako topnik. Dostanie piaskiem po oczach nie jest przyjemne. -item.coal.description = Zwykły i łatwo dostępny materiał energetyczny. +item.sand.description = Zwykły materiał używany pospolicie w przepalaniu, stopach i jako topnik. Dostanie piaskiem po oczach nie jest przyjemne. +item.coal.description = Zwykły i łatwo dostępny materiał energetyczny. Używany powszechnie jako paliwo oraz w produkcji surowców. item.titanium.description = Rzadki i bardzo lekki materiał. Używany w bardzo zaawansowanym przewodnictwie, wiertłach i samolotach. Poczuj się jak Tytan! item.thorium.description = Zwarty i radioaktywny materiał używany w strukturach i paliwie nuklearnym. Nie trzymaj go w rękach! item.scrap.description = Pozostałości starych budynków i jednostek. Składa się z małej ilości wszystkiego. @@ -1021,7 +1079,7 @@ item.pyratite.description = Niesamowicie palny związek używany w zbrojeniu. Ni liquid.water.description = Powszechnie używana do schładzania budowli i przetwarzania odpadów. liquid.slag.description = Wiele różnych metali stopionych i zmieszanych razem. Może zostać rozdzielony na jego metale składowe, albo wystrzelony w wrogie jednostki i użyty jako broń. liquid.oil.description = Używany w do produkcji złożonych materiałów. Może zostać przetworzony na węgiel, lub wystrzelony w wrogów przez wieżyczke. -liquid.cryofluid.description = Najefektywniejsza ciecz do schładzania budowli. +liquid.cryofluid.description = Obojętna, niekorozyjna ciecz utworzona z wody i tytanu mech.alpha-mech.description = Standardowy mech. Bazuje na jednostce Nóż, z ulepszonym pancerzem i zdolnością budowania. Zadaje więcej obrażeń niż Strzałka. mech.delta-mech.description = Szybki, lekko opancerzony mech stworzony do ataków typu uderz i uciekaj. Zadaje niewielkie obrażenia strukturom, lecz może bardzo szybko niszczyć spore grupy jednostek wroga przy pomocy jego działek tesli. mech.tau-mech.description = Mech wsparcia. Naprawia budynki drużyny, strzelając w nie. Potrafi wygasić niedalekie pożary i uleczyć bliskich przyjaciół. @@ -1038,7 +1096,7 @@ unit.crawler.description = Jednostka naziemna składająca się z rozebranej ram unit.titan.description = Zaawansowana, opancerzona jednostka naziemna. Atakuje zarówno cele naziemne, jak i powietrzne. Wyposażony w dwa miniaturowe miotacze ognia typu Płomień. unit.fortress.description = Ciężki mech artyleryjski. Wyposażony w dwa zmodyfikowane działa typu gradowego do ataku na dalekie odległości na konstrukcje i jednostki wroga. unit.eruptor.description = Ciężki mech stworzony do niszczenia struktur. Strzela wiązką żużlu w kierunku fortyfikacji wroga, Topiąc je oraz podpalając łatwopalne przedmioty. -unit.wraith.description = Szybka jednostka, stosuje taktyke uderz-uciekaj Namierza jakiekolwiek źródło prądu. +unit.wraith.description = Szybka jednostka, stosuje taktykę uderz-uciekaj. Namierza jakiekolwiek źródło prądu. unit.ghoul.description = Ciężki bombowiec dywanowy. Rozdziera struktury wroga, atakując krytyczną infrastrukturę. unit.revenant.description = Ciężka, unosząca sie platforma z rakietami. block.message.description = Przechowuje wiadomość. Wykorzystywane do komunikacji pomiędzy sojusznikami. @@ -1078,8 +1136,8 @@ block.surge-wall-large.description = Ekstremalnie wytrzymały blok obronny.\nMa block.door.description = Małe drzwi, które można otwierać i zamykać, klikając na nie.\nJeśli są otwarte, wrogowie mogą strzelać i się przemieszczać przez nie. block.door-large.description = Duże drzwi, które można otwierać i zamykać, klikając na nie.\nJeśli są otwarte, wrogowie mogą strzelać i się przemieszczać przez nie.\nObejmuje wiele kratek. block.mender.description = Co jakiś czas naprawia bloki w zasięgu. Utrzymuje struktury obronne w dobrym stanie.\nOpcjonalnie używa silikonu do zwiększenia zasięgu i szybkości naprawy. -block.mend-projector.description = Co jakiś czas naprawia bloki w zasięgu. Lepsza wersja naprawiacza. -block.overdrive-projector.description = Zwiększa szybkość budynków w zasięgu takich jak wiertła czy przenośniki. +block.mend-projector.description = Ulepszona wersja Naprawiacza. Naprawia bloki w jego otoczeniu.\nMoże wykorzystywać włókno fazowe, aby zwiększyć efektywność budowli. +block.overdrive-projector.description = Zwiększa szybkość budynków w zasięgu takich jak wiertła czy przenośniki. Może wykorzystywać włókno fazowe, aby zwiększyć zasięg i efektywność budowli. block.force-projector.description = Wytwarza pole siłowe w kształcie sześciokąta wokół siebie, chroniąc budynki i jednostki wewnątrz od obrażeń zadanych przez pociski. block.shock-mine.description = Zadaje obrażenia jednostkom wroga którzy na nią wejdą. Ledwo widoczne dla wrogów. block.conveyor.description = Podstawowy blok transportowy dla przedmiotów. Automatycznie przesyła przedmioty naprzód do działek oraz maszyn. Można obrócić. @@ -1088,7 +1146,7 @@ block.junction.description = Używany jako most dla dwóch krzyżujących się p block.bridge-conveyor.description = Zaawansowany blok transportujący. Pozwala na przenoszenie przedmiotów nawet do 3 bloków na każdym terenie, przez każdy budynek. block.phase-conveyor.description = Zaawansowany blok transportowy dla przedmiotów. Używa energii do teleportacji przedmiotów do połączonego transportera fazowego na spore odległości. block.sorter.description = Sortuje przedmioty. Jeśli przedmiot pasuje to przechodzi dalej, jeśli nie - to przechodzi na boki. -block.inverted-sorter.description = Processes items like a standard sorter, but outputs selected items to the sides instead. +block.inverted-sorter.description = Sortuje przedmioty jak zwykły sortownik, ale odpowiednie surowce wyciągane są na boki. block.router.description = Akceptuje przedmioty z jednego miejsca i rozdziela je do trzech innych kierunków. Przydatne w rozdzielaniu materiałów z jednego źródła do wielu celów. block.distributor.description = Zaawansowany rozdzielacz, rozdzielający przedmioty do 7 innych kierunków. block.overflow-gate.description = Rozdzielacz, który przerzuca przedmioty, kiedy główna droga jest przepełniona @@ -1098,6 +1156,7 @@ block.rotary-pump.description = Zaawansowana pompa. Pompuje więcej cieczy, ale block.thermal-pump.description = Najlepsza pompa. Trzy razy szybsza od mechanicznej pompy i jedyna, która może wypompować lawę. block.conduit.description = Podstawowy blok do transportowania cieczy. Używany w połączeniu z pompami i innymi rurami. block.pulse-conduit.description = Zaawansowany blok do transportowania cieczy. Transportuje je szybciej i magazynuje więcej niż standardowe rury. +block.plated-conduit.description = Przesyła ciecze z taką samą szybkością co rura tytanowa, ale jest bardziej odporna. Wejściami bocznymi mogą być tylko inne rury.\nWycieka z niej mniej cieczy. block.liquid-router.description = Akceptuje płyny z jednego kierunku i wyprowadza je po równo do trzech innych kierunków. Może również przechowywać pewną ilość płynu. Przydatne do dzielenia płynów z jednego źródła do wielu celów. block.liquid-tank.description = Magazynuje duże ilości cieczy. Użyj go do stworzenia buforu, gdy występuje różne zapotrzebowanie na materiały lub jako zabezpieczenie dla chłodzenia ważnych bloków. block.liquid-junction.description = Działa jak most dla dwóch krzyżujących się rur. Przydatne w sytuacjach, kiedy dwie rury mają różne ciecze do różnych lokacji. @@ -1106,6 +1165,7 @@ block.phase-conduit.description = Zaawansowany blok do przenoszenia cieczy. Uży block.power-node.description = Przesyła moc do połączonych węzłów. Można podłączyć do czterech źródeł zasilania, zlewów lub węzłów. Zasila też bloki które go dotykają. block.power-node-large.description = Posiada większy zasięg niż zwykły węzeł prądu. Można podłączyć do sześciu źródeł zasilania, zlewów lub węzłów. block.surge-tower.description = Węzęł prądu z bardzo dużym zasięgiem, posiadający mniej możliwych podłączeń. +block.diode.description = Battery power can flow through this block in only one direction, but only if the other side has less power stored. block.battery.description = Przechowuje energię przy nadwyżce produkcji oraz dostarcza energię kiedy jest jej brak, dopóki jest w niej miejsce. block.battery-large.description = Przechowuje o wiele wiecej prądu niż standardowa bateria. block.combustion-generator.description = Wytwarza energię poprzez spalanie łatwopalnych materiałów. @@ -1121,14 +1181,14 @@ block.mechanical-drill.description = Tanie wiertło. Kiedy zostanie zbudowane na block.pneumatic-drill.description = Ulepszone wiertło, które jest szybsze i może wykopywać twardsze surowce przy użyciu ciśnienia. block.laser-drill.description = Pozwala kopać jeszcze szybciej poprzez technologię laserową, ale wymaga energii. Zdolne do wydobywania toru. block.blast-drill.description = Najlepsze wiertło. Wymaga dużych ilości energii. -block.water-extractor.description = Wydobywa wodę z ziemi. Użyj go, gdy w pobliżu nie ma jeziora. +block.water-extractor.description = Wydobywa wodę z ziemi. Użyj go, gdy w pobliżu brakuje wody. block.cultivator.description = Uprawia małe skupiska zarodników i umieszcza je w gotowych do dalszego przetwarzania kapsułach. block.oil-extractor.description = Używa bardzo dużych ilości energii do ekstrakcji ropy z piasku. Używaj go w sytuacji kiedy nie ma bezpośredniego źródła ropy w okolicy. block.core-shard.description = Pierwsza wersja rdzenia. Gdy zostaje zniszczony, wszelki kontakt do regionu zostaje utracony. Nie pozwól na to. block.core-foundation.description = Druga wersja rdzenia. Lepiej opancerzony. Przechowuje więcej surowców. block.core-nucleus.description = Trzecia i ostatnia wersja rdzenia. Bardzo dobrze opanczerzony. Przechowuje ogromne ilości surowców. -block.vault.description = Przechowuje duże ilości przedmiotów każdego rodzaju. [LIGHT_GRAY] Ekstraktor[] może zostać użyty do rozładowania magazynu. -block.container.description = Przechowuje małe ilości przedmiotów każdego rodzaju. [LIGHT_GRAY] ekstraktor[] może zostać użyty do rozładowania kontenera. +block.vault.description = Przechowuje duże ilości przedmiotów każdego rodzaju. Użyj ekstraktora, aby rozładować magazyn. +block.container.description = Przechowuje małe ilości przedmiotów każdego rodzaju. Użyj ekstraktora, aby rozładować kontener. block.unloader.description = Wyciąga przedmioty z kontenera, magazynu oraz rdżenia na przenośniki lub bezpośrednio na przyległe bloki. Typ przedmiotu jaki zostanie wyciągniety może zostać zmieniony poprzez kliknięcie. block.launch-pad.description = Wysyła pakiety przedmiotów bez potrzeby wystrzeliwania rdżenia. Niedokończona. block.launch-pad-large.description = Ulepszona wersja wyrzutni. Magazynuje więcej przedmiotów. Wysyła częściej. diff --git a/core/assets/bundles/bundle_pt_BR.properties b/core/assets/bundles/bundle_pt_BR.properties index ea74cce62e..e2d775ff53 100644 --- a/core/assets/bundles/bundle_pt_BR.properties +++ b/core/assets/bundles/bundle_pt_BR.properties @@ -10,20 +10,23 @@ link.dev-builds.description = Desenvolvimentos instáveis link.trello.description = Trello oficial para atualizações planejadas link.itch.io.description = Página da Itch.io com os downloads link.google-play.description = Página da google play store +link.f-droid.description = F-Droid catalogue listing link.wiki.description = Wiki oficial do Mindustry -linkfail = Falha ao abrir o link\nO Url foi copiado +linkfail = Falha ao abrir o link\nO Url foi copiado para a área de transferência. screenshot = Screenshot salvo para {0} screenshot.invalid = Mapa grande demais, Potencialmente sem memória suficiente para captura de tela. gameover = O núcleo foi destruído. gameover.pvp = O time[accent] {0}[] ganhou! highscore = [YELLOW]Novo recorde! copied = Copiado + load.sound = Sons load.map = Mapas load.image = Imagens load.content = Conteúdo load.system = Sistema load.mod = Mods + schematic = Esquema schematic.add = Salvar Esquema... schematics = Esquemas @@ -40,6 +43,7 @@ schematic.saved = Esquema salvo. schematic.delete.confirm = Esse Esquema será totalmente erradicado. schematic.rename = Rename Schematic schematic.info = {0}x{1}, {2} blocks + stat.wave = Hordas derrotadas:[accent] {0} stat.enemiesDestroyed = Inimigos Destruídos:[accent] {0} stat.built = Construções construídas:[accent] {0} @@ -47,6 +51,7 @@ stat.destroyed = Construções destruídas:[accent] {0} stat.deconstructed = Construções desconstruídas:[accent] {0} stat.delivered = Recursos lançados: stat.rank = Classificação Final: [accent]{0} + launcheditems = [accent]Itens lançados launchinfo = [unlaunched][[LANCE] seu núcleo para obter os itens indicados em azul. map.delete = Certeza que quer deletar o mapa "[accent]{0}[]"? @@ -74,6 +79,7 @@ maps.browse = Pesquisar mapas continue = Continuar maps.none = [LIGHT_GRAY]Nenhum Mapa Encontrado! invalid = Inválido +pickcolor = Escolher Cor preparingconfig = Preparando configuração preparingcontent = Preparando conteúdo uploadingcontent = Fazendo upload do conteúdo @@ -81,6 +87,7 @@ uploadingpreviewfile = Fazendo upload do arquivo de pré-visualização committingchanges = Enviando mudanças done = Feito feature.unsupported = Seu dispositivo não suporta essa função. + mods.alphainfo = Mantenha em mente que os mods estão em Alpha, e[scarlet] talvez sejam bem bugados[].\nReporte quaisquer problemas no Discord ou GitHub do Mindustry. mods.alpha = [accent](Alpha) mods = Mods @@ -90,10 +97,11 @@ mods.report = Reportar um Bug mods.openfolder = Abrir pasta de Mods mod.enabled = [lightgray]Ativado mod.disabled = [scarlet]Desativado -mod.disable = Desativar +mod.disable = Desati-\nvar mod.delete.error = Incapaz de deletar o Mod. O arquivo talvez esteja em uso. +mod.requiresversion = [scarlet]Requer versão [accent]{0} [scarlet]do jogo. mod.missingdependencies = [scarlet]Dependências ausentes: {0} -mod.nowdisabled = [scarlet]O Mod '{0}' está com dependências ausentes :[accent] {1}\n[lightgray]Esses Mods precisam ser baixados primeiro.\nEsse Mod será desativado automaticamente. +mod.nowdisabled = [scarlet]O Mod '{0}' está com dependências ausentes:[accent] {1}\n[lightgray]Esses Mods precisam ser baixados primeiro.\nEsse Mod será desativado automaticamente. mod.enable = Ativar mod.requiresrestart = O jogo irá fechar para aplicar as mudanças do Mod. mod.reloadrequired = [scarlet]Recarregamento necessário @@ -104,6 +112,7 @@ mod.author = [LIGHT_GRAY]Author:[] {0} mod.missing = Esse jogo salvo foi criado antes de você atualizar ou desinstalar um mod. O jogo salvo pode se corromper. Você tem certeza que quer carregar?\n[lightgray]Mods:\n{0} mod.preview.missing = Antes de publicar esse mod na Oficina, você deve adicionar uma imagem de pré-visualização.\nColoque uma imagem com o nome[accent] preview.png[] na pasta do Mod e tente novamente. mod.folder.missing = Somente Mods no formato de pasta serão publicados na Oficina.\nPara converter qualquer Mod em uma pasta, Simplesmente descompacte seu arquivo numa pasta e delete a compactação antiga, então reinicie seu jogo ou recarregue os Mods. + about.button = Sobre name = Nome: noname = Escolha[accent] um nome[] primeiro. @@ -271,6 +280,7 @@ publishing = [accent]Publishing... publish.confirm = você tem certeza de que quer publicar isso?\n\n[lightgray]Primeiramente tenha certeza de que você concorda com o EULA da Oficina, ou seus itens não irão aparecer! publish.error = Erro publicando o Item: {0} steam.error = Falha em iniciar os serviços da Steam.\nError: {0} + editor.brush = Pincel editor.openin = Abrir no Editor editor.oregen = Geração de minério @@ -347,6 +357,7 @@ 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 = Já existe um mapa com este nome. editor.selectmap = Selecione uma mapa para carregar: + toolmode.replace = Substituir toolmode.replace.description = Desenha apenas em blocos sólidos. toolmode.replaceall = Substituir tudo @@ -361,6 +372,7 @@ 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 = Geração aleatória @@ -392,6 +404,7 @@ filter.option.floor2 = Chão secundário filter.option.threshold2 = Margem secundária filter.option.radius = Raio filter.option.percentile = Percentual + width = Largura: height = Altura: menu = Menu @@ -407,6 +420,7 @@ tutorial = Tutorial tutorial.retake = Refazer Tutorial editor = Editor mapeditor = Editor de mapa + abandon = Abandonar abandon.text = Esta zona e todos os seus recursos serão perdidos para o inimigo. locked = Trancado @@ -437,6 +451,7 @@ zone.objective.survival = Sobreviver zone.objective.attack = Destruir o núcleo inimigo add = Adicionar... boss.health = Vida do chefe + connectfail = [crimson]Falha ao entrar no servidor: [accent]{0} error.unreachable = Servidor inalcançável. error.invalidaddress = Endereço inválido. @@ -447,6 +462,7 @@ error.mapnotfound = Arquivo de mapa não encontrado! error.io = Erro I/O de internet. error.any = Erro de rede desconhecido. error.bloom = Falha ao inicializar bloom.\nSeu dispositivo talvez não o suporte. + zone.groundZero.name = Marco zero zone.desertWastes.name = Ruínas do Deserto zone.craters.name = As crateras @@ -461,6 +477,7 @@ zone.saltFlats.name = Planícies de sal zone.impact0078.name = Impacto 0078 zone.crags.name = Penhascos 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 = 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. @@ -475,17 +492,19 @@ zone.nuclearComplex.description = Uma antiga instalação para produção e proc zone.fungalPass.description = Uma area de transição entre montanhas altas e baixas, terras cheias de esporos. Uma pequena base de reconhecimento inimiga está localizada aqui.\nDestrua-a.\nUse as unidades crawler e dagger. Destrua os dois núcleos. zone.impact0078.description = zone.crags.description = + settings.language = Idioma settings.data = Dados do jogo settings.reset = Restaurar Padrões settings.rebind = Religar +settings.resetKey = Resetar settings.controls = Controles settings.game = Jogo settings.sound = Som settings.graphics = Gráficos settings.cleardata = Apagar dados... settings.clear.confirm = Certeza que quer limpar a os dados?\nOque é feito não pode ser desfeito! -settings.clearall.confirm = [scarlet]Aviso![]\nIsso vai limpar todo os arquivos, Incluindo jogos salvos, mapas, Keybinds e desbloqueados.\nQuando apertar 'ok' todos os arquivos serão apagados e o jogo irá sair automaticamente. +settings.clearall.confirm = [scarlet]Aviso![]\nIsso vai limpar todo os arquivos, incluindo jogos salvos, mapas, teclas personalizadas e desbloqueados.\nQuando apertar 'ok' todos os arquivos serão apagados e o jogo irá sair automaticamente. paused = Pausado clear = Clear banned = [scarlet]Banido @@ -529,6 +548,7 @@ blocks.inaccuracy = Imprecisão blocks.shots = Tiros blocks.reload = Tiros por segundo blocks.ammo = Munição + bar.drilltierreq = Broca melhor necessária. bar.drillspeed = Velocidade da Broca: {0}/s bar.pumpspeed = Velocidade da Bomna: {0}/s @@ -544,8 +564,11 @@ 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 área ~[stat] {1}[lightgray] Blocos +bar.input = Entrando +bar.output = Saindo + +bullet.damage = [stat]{0}[lightgray] de dano +bullet.splashdamage = [stat]{0}[lightgray] de dano em área ~[stat] {1}[lightgray] bloco(s) bullet.incendiary = [stat]Incendiário bullet.homing = [stat]Guiado bullet.shock = [stat]Choque @@ -555,6 +578,7 @@ bullet.freezing = [stat]Congelamento 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 @@ -576,13 +600,14 @@ category.shooting = Atirando category.optional = Melhoras opcionais setting.landscape.name = Travar panorama setting.shadows.name = Sombras -setting.blockreplace.name = Automatic Block Suggestions +setting.blockreplace.name = Sugestões automáticas de blocos setting.linear.name = Filtragem linear setting.hints.name = Dicas +setting.buildautopause.name = Pausar construções automaticamente setting.animatedwater.name = Água animada setting.animatedshields.name = Escudos animados setting.antialias.name = Filtro suavizante[LIGHT_GRAY] (reinicialização requerida)[] -setting.indicators.name = Indicador de aliados +setting.indicators.name = Indicador de aliados/inimigos setting.autotarget.name = Alvo automatico setting.keyboard.name = Controles de mouse e teclado setting.touchscreen.name = Controles de Touchscreen @@ -600,13 +625,16 @@ setting.difficulty.name = Dificuldade setting.screenshake.name = Balanço da Tela setting.effects.name = Efeitos setting.destroyedblocks.name = Mostrar Blocos Destruídos -setting.conveyorpathfinding.name = Posicionamento do localizador do Transportador +setting.conveyorpathfinding.name = Esteiras Encontram Caminho setting.sensitivity.name = Sensibilidade do Controle setting.saveinterval.name = Intervalo de Auto Salvamento -setting.seconds = {0} Segundos +setting.seconds = {0} segundos +setting.blockselecttimeout.name = Tempo limite de seleção de blocos +setting.milliseconds = {0} milissegundos setting.fullscreen.name = Tela Cheia setting.borderlesswindow.name = Janela sem borda[LIGHT_GRAY] (Pode precisar reiniciar) -setting.fps.name = Mostrar FPS +setting.fps.name = Mostrar FPS e Ping +setting.blockselectkeys.name = Mostrar teclas de seleção de blocos setting.vsync.name = VSync setting.pixelate.name = Pixelizado [LIGHT_GRAY](Pode diminuir a performace) setting.minimap.name = Mostrar minimapa @@ -635,16 +663,36 @@ category.multiplayer.name = Multijogador command.attack = Atacar command.rally = Reunir command.retreat = Recuar -keybind.clear_building.name = Clear Building +placement.blockselectkeys = \n[lightgray]Tecla: [{0}, +keybind.clear_building.name = Limpar construção keybind.press = Pressione uma tecla... 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.toggle_power_lines.name = Mudar lasers +keybind.move_x.name = Mover no eixo x +keybind.move_y.name = Mover no eixo Y +keybind.mouse_move.name = Seguir Mouse +keybind.dash.name = Arrancada keybind.schematic_select.name = Selecionar região keybind.schematic_menu.name = Menu de Esquemas -keybind.schematic_flip_x.name = girar o Esquema X -keybind.schematic_flip_y.name = girar o Esquema Y +keybind.schematic_flip_x.name = Girar o Esquema no eixo X +keybind.schematic_flip_y.name = Girar o Esquema no eixo Y +keybind.category_prev.name = Categoria anterior +keybind.category_next.name = Próxima categoria +keybind.block_select_left.name = Selecionar bloco à esquerda +keybind.block_select_right.name = Selecionar bloco à direita +keybind.block_select_up.name = Selecionar bloco acima +keybind.block_select_down.name = Selecionar bloco abaixo +keybind.block_select_01.name = Categoria/Selecionar bloco 1 +keybind.block_select_02.name = Categoria/Selecionar bloco 2 +keybind.block_select_03.name = Categoria/Selecionar bloco 3 +keybind.block_select_04.name = Categoria/Selecionar bloco 4 +keybind.block_select_05.name = Categoria/Selecionar bloco 5 +keybind.block_select_06.name = Categoria/Selecionar bloco 6 +keybind.block_select_07.name = Categoria/Selecionar bloco 7 +keybind.block_select_08.name = Categoria/Selecionar bloco 8 +keybind.block_select_09.name = Categoria/Selecionar bloco 9 +keybind.block_select_10.name = Categoria/Selecionar bloco 10 keybind.fullscreen.name = Alterar tela cheia keybind.select.name = selecionar keybind.diagonal_placement.name = Colocação diagonal @@ -658,7 +706,6 @@ keybind.menu.name = Menu keybind.pause.name = Pausar keybind.pause_building.name = Parar/Resumir a construção keybind.minimap.name = Minimapa -keybind.dash.name = Correr keybind.chat.name = Conversa keybind.player_list.name = Lista_de_jogadores keybind.console.name = Console @@ -666,7 +713,7 @@ keybind.rotate.name = Girar keybind.rotateplaced.name = Girar (Segure) keybind.toggle_menus.name = Ativar menus keybind.chat_history_prev.name = Historico do chat anterior -keybind.chat_history_next.name = Historico do proximo chat +keybind.chat_history_next.name = Historico do próximo chat keybind.chat_scroll.name = Rolar chat keybind.drop_unit.name = Soltar unidade keybind.zoom_minimap.name = Zoom do minimapa @@ -681,12 +728,14 @@ 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.custom = Regras personalizadas + rules.infiniteresources = Recursos infinitos +rules.reactorexplosions = Reatores explodem rules.wavetimer = Tempo de horda rules.waves = Hordas rules.attack = Modo de ataque rules.enemyCheat = Recursos de IA Infinitos -rules.unitdrops = Unidade solta +rules.unitdrops = Inimigos dropam itens rules.unitbuildspeedmultiplier = Multiplicador de velocidade de criação de unidade rules.unithealthmultiplier = Multiplicador de vida de unidade rules.playerhealthmultiplier = Multiplicador da vida de jogador @@ -694,10 +743,10 @@ rules.playerdamagemultiplier = Multiplicador do dano de jogador rules.unitdamagemultiplier = Multiplicador de dano de Unidade rules.enemycorebuildradius = Raio de "Não-criação" de core inimigo:[LIGHT_GRAY] (blocos) rules.respawntime = Tempo de renascimento:[LIGHT_GRAY] (seg) -rules.wavespacing = Espaço entre hordas:[LIGHT_GRAY] (seg) +rules.wavespacing = Espaço de tempo entre hordas:[LIGHT_GRAY] (seg) rules.buildcostmultiplier = Multiplicador de custo de construção rules.buildspeedmultiplier = Multiplicador de velocidade de construção -rules.waitForWaveToEnd = hordas esperam inimigos +rules.waitForWaveToEnd = Hordas esperam inimigos rules.dropzoneradius = Raio da zona de spawn:[LIGHT_GRAY] (blocos) rules.respawns = Respawn maximos por horda rules.limitedRespawns = Respawn limitados @@ -707,6 +756,10 @@ rules.title.resourcesbuilding = Recursos e Construções rules.title.player = Jogadores rules.title.enemy = Inimigos rules.title.unit = Unidades +rules.title.experimental = Experimental +rules.lighting = Iluminação +rules.ambientlight = Luz ambiente + content.item.name = Itens content.liquid.name = Líquidos content.unit.name = Unidades @@ -768,6 +821,7 @@ mech.buildspeed = [LIGHT_GRAY]Velocidade de construção: {0}% liquid.heatcapacity = [LIGHT_GRAY]Capacidade de aquecimento: {0} liquid.viscosity = [LIGHT_GRAY]Viscosidade: {0} liquid.temperature = [LIGHT_GRAY]Temperatura: {0} + block.sand-boulder.name = Pedregulho de areia block.grass.name = Grama block.salt.name = Sal @@ -843,7 +897,7 @@ block.copper-wall.name = Muro de Cobre block.copper-wall-large.name = Muro de Cobre Grande block.titanium-wall.name = Muro de Titânio block.titanium-wall-large.name = Muro de Titânio grande -block.plastanium-wall.name = Muro de Plastânio Grande +block.plastanium-wall.name = Muro de Plastânio block.plastanium-wall-large.name = Muro de Plastânio Grande block.phase-wall.name = Muro de Fase block.phase-wall-large.name = Muro de Fase Grande @@ -866,6 +920,8 @@ block.distributor.name = Distribuidor block.sorter.name = Ordenador block.inverted-sorter.name = Ordenador Invertido block.message.name = Mensagem +block.illuminator.name = Iluminador +block.illuminator.description = Uma pequena, compacta e configurável fonte de luz. Precisa de energia para funcionar. block.overflow-gate.name = Portão Sobrecarregado block.silicon-smelter.name = Fundidora de silicio block.phase-weaver.name = Palheta de fase @@ -875,14 +931,15 @@ block.melter.name = Aparelho de fusão block.incinerator.name = Incinerador block.spore-press.name = Prensa de Esporo block.separator.name = Separador -block.coal-centrifuge.name = Centrifuga de carvão -block.power-node.name = Célula de energia -block.power-node-large.name = Célula de energia Grande +block.coal-centrifuge.name = Centrífuga de carvão +block.power-node.name = Célula de Energia +block.power-node-large.name = Célula de Energia Grande block.surge-tower.name = Torre de surto +block.diode.name = Bateria de Diodo block.battery.name = Bateria block.battery-large.name = Bateria Grande -block.combustion-generator.name = Gerador a combustão -block.turbine-generator.name = Gerador de Turbina +block.combustion-generator.name = Gerador à combustão +block.turbine-generator.name = Gerador à vapor block.differential-generator.name = Gerador diferencial block.impact-reactor.name = Reator De Impacto block.mechanical-drill.name = Broca Mecânica @@ -931,6 +988,7 @@ 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 = Cano de Pulso +block.plated-conduit.name = Cano Chapeado block.phase-conduit.name = Cano de Fase block.liquid-router.name = Roteador de Líquido block.liquid-tank.name = Tanque de Líquido @@ -939,12 +997,12 @@ 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 = Catapulta Eletromagnética -block.blast-drill.name = Broca de Explosão +block.blast-drill.name = Broca de Jato de Ar 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 de reparo +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 @@ -960,10 +1018,10 @@ 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 = Vermelha -team.sharded.name = Estilhaçada -team.orange.name = Laranja -team.derelict.name = Abandonada +team.crux.name = Vermelho +team.sharded.name = Fragmentado +team.orange.name = Alaranjado +team.derelict.name = Abandonado team.green.name = Verde team.purple.name = Roxa unit.spirit.name = Drone Spirit @@ -1002,6 +1060,7 @@ tutorial.deposit = Deposite itens em blocos arrastando da sua nave até o bloco. 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. @@ -1051,7 +1110,7 @@ block.phase-weaver.description = Produz tecido de fase usando tório radioativo 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.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. @@ -1067,10 +1126,10 @@ block.copper-wall.description = Um bloco defensivo e barato.\nUtil para proteger block.copper-wall-large.description = Um bloco defensivo e barato.\nUtil para proteger o núcleo e torretas no começo.\nOcupa múltiplos blocos. block.titanium-wall.description = Um bloco defensivo moderadamente forte.\nProvidencia defesa moderada contra inimigos. block.titanium-wall-large.description = Um bloco defensivo moderadamente forte.\nProvidencia defesa moderada contra inimigos.\nOcupa múltiplos blocos. -block.plastanium-wall.description = A special type of wall that absorbs electric arcs and blocks automatic power node connections. -block.plastanium-wall-large.description = A special type of wall that absorbs electric arcs and blocks automatic power node connections.\nSpans multiple tiles. +block.plastanium-wall.description = Um tipo especial de muro que absorve arcos elétricos e bloqueia conexões automáticas de células de energia. +block.plastanium-wall-large.description = Um tipo especial de muro que absorve arcos elétricos e bloqueia conexões automáticas de células de energia.\nOcupa múltiplos blocos. 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 blocos. +block.thorium-wall-large.description = Um bloco defensivo forte.\nBoa proteção contra inimigos.\nOcupa múltiplos blocos. block.phase-wall.description = Um muro revestido com um composto especial baseado em tecido de fase. Desvia a maioria das balas no impacto. block.phase-wall-large.description = Um muro revestido com um composto especial baseado em tecido de fase. Desvia a maioria das balas no impacto.\nSOcupa múltiplos blocos. block.surge-wall.description = Um bloco defensivo extremamente durável.\nSe carrega com eletricidade no contato com as balas, soltando-s aleatoriamente. @@ -1098,7 +1157,8 @@ block.rotary-pump.description = Uma bomba avançada. Bombeia mais líquido, mas 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.plated-conduit.description = Move líquidos na mesma velocidade que canos de pulso, mas possui mais blindagem. Não aceita fluidos dos lados de nada além de outros canos.\nVaza menos. +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. Útil para espalhar líquidos de uma fonte para múltiplos 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. Ú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 @@ -1106,15 +1166,16 @@ block.phase-conduit.description = Bloco avancado de transporte de liquido. Usa e 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.diode.description = A energia de baterias pode fluir através desse bloco em apenas uma direção, mas apenas se o outro lado possuir menos energia armazenada. 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 = Gera grandes quantidades de Energia. Utiliza a diferença de temperatura entre o Fluído Criogênico e a Piratita. +block.battery-large.description = Guarda muito mais energia que uma bateria comum. +block.combustion-generator.description = Gera energia queimando materiais inflamáveis, como carvão. +block.thermal-generator.description = Gera energia quando colocado em lugares quentes. +block.turbine-generator.description = Mais eficiente que o gerador à combustão, mas requer água adicional para a geração de vapor. +block.differential-generator.description = Gera grandes quantidades de energia. Utiliza a diferença de temperatura entre o Fluido Criogênico e a Piratita. block.rtg-generator.description = Um Gerador termoelétrico de radioisótopos que não precisa de refriamento mas dá muito menos energia que o reator de tório. block.solar-panel.description = Gera pequenas quantidades de energia do sol. -block.solar-panel-large.description = Dá muito mais energia que o painel solar comum, Mas sua produção é mais cara. +block.solar-panel-large.description = Uma versão significantemente mais eficiente que o painel solar padrão. block.thorium-reactor.description = Gera altas quantidades de energia do torio radioativo. Requer resfriamento constante. Vai explodir violentamente Se resfriamento insuficiente for fornecido. block.impact-reactor.description = An advanced generator, capable of creating massive amounts of power at peak efficiency. Requires a significant power input to kickstart the process. block.mechanical-drill.description = Uma broca barata. Quando colocado em blocos apropriados, retira itens em um ritmo lento e indefinitavamente. @@ -1123,9 +1184,9 @@ block.laser-drill.description = Possibilita a mineração ainda mais rapida usan block.blast-drill.description = A melhor mineradora. Requer muita energia. block.water-extractor.description = Extrai água do chão. Use quando não tive nenhum lago proximo block.cultivator.description = Cultiva o solo com agua para pegar bio materia. -block.oil-extractor.description = Usa altas quantidades de energia Para extrair oleo da areia. Use quando não tiver fontes de oleo por perto -block.core-shard.description = Primeira iteração da cápsula do núcleo. Uma vez destruida, o controle da região inteira é perdido. Não deixe isso acontecer. -block.core-foundation.description = A segunda versão do núcleo. Melhor armadura. Guarda mais recursos. +block.water-extractor.description = Extrai água subterrânea. Usado em locais sem água superficial disponível. +block.cultivator.description = Cultiva pequenas concentrações de esporos na atmosfera em cápsulas prontas. +block.oil-extractor.description = Usa altas quantidades de energia para extrair petróleo da areia. Use quando não tiver fontes de petróleo por perto. block.core-nucleus.description = A terceira e ultima iteração do núcleo. Extremamente bem armadurada. Guarda quantidades massivas de recursos. block.vault.description = Carrega uma alta quantidade de itens. Usado para criar fontes Quando não tem uma necessidade constante de materiais. Um[LIGHT_GRAY] Descarregador[] pode ser usado para recuperar esses itens do container. block.container.description = Carrega uma baixa quantidade de itens. Usado para criar fontes Quando não tem uma necessidade constante de materiais. Um[LIGHT_GRAY] Descarregador[] pode ser usado para recuperar esses itens do container. diff --git a/core/assets/bundles/bundle_ru.properties b/core/assets/bundles/bundle_ru.properties index befe38c17e..8a7f6b3481 100644 --- a/core/assets/bundles/bundle_ru.properties +++ b/core/assets/bundles/bundle_ru.properties @@ -6,10 +6,11 @@ link.discord.description = Официальный Discord-сервер Mindustry link.reddit.description = Сабреддит Mindustry link.github.description = Исходный код игры link.changelog.description = Список изменений -link.dev-builds.description = Нестабильные версии +link.dev-builds.description = Нестабильные разрабатываемые версии link.trello.description = Официальная доска Trello для запланированных функций link.itch.io.description = Страница itch.io с загрузками игры link.google-play.description = Скачать для Android с Google Play +link.f-droid.description = Скачать для Android с F-Droid link.wiki.description = Официальная вики linkfail = Не удалось открыть ссылку!\nURL-адрес был скопирован в буфер обмена. screenshot = Cкриншот сохранён в {0} @@ -18,12 +19,14 @@ gameover = Игра окончена gameover.pvp = [accent]{0}[] команда победила! highscore = [accent]Новый рекорд! copied = Скопировано. + load.sound = Звуки load.map = Карты load.image = Изображения load.content = Содержимое load.system = Система load.mod = Модификации + schematic = Схема schematic.add = Сохранить схему... schematics = Схемы @@ -40,6 +43,7 @@ schematic.saved = Схема сохранена. schematic.delete.confirm = Эта схема будет поджарена Испепелителем. schematic.rename = Переименовать схему schematic.info = {0}x{1}, {2} блоков + stat.wave = Волн отражено:[accent] {0} stat.enemiesDestroyed = Врагов уничтожено:[accent] {0} stat.built = Строений построено:[accent] {0} @@ -47,6 +51,7 @@ stat.destroyed = Строений уничтожено:[accent] {0} stat.deconstructed = Строений деконструировано:[accent] {0} stat.delivered = Ресурсов запущено: stat.rank = Финальный ранг: [accent]{0} + launcheditems = [accent]Запущенные предметы launchinfo = [unlaunched]Нажмите на кнопку [ЗАПУСК], чтобы получить предметы, которые отмечены синим цветом. map.delete = Вы действительно хотите удалить карту «[accent]{0}[]»? @@ -55,7 +60,7 @@ level.select = Выбор карты level.mode = Режим игры: showagain = Не показывать снова до следующей сессии coreattack = < Ядро находится под атакой! > -nearpoint = [[ [scarlet]ПОКИНЬТЕ ТОЧКУ ВЫСАДКИ НЕМЕДЛЕННО[] ]\nАннигиляция неизбежна +nearpoint = [[ [scarlet]ПОКИНЬТЕ ТОЧКУ ВЫСАДКИ НЕМЕДЛЕННО[] ]\nаннигиляция неизбежна database = База данных ядра savegame = Сохранить игру loadgame = Загрузить игру @@ -64,7 +69,7 @@ customgame = Пользовательская игра newgame = Новая игра none = <ничего> minimap = Мини-карта -position = Позиция +position = Координаты close = Закрыть website = Веб-сайт quit = Выход @@ -74,36 +79,41 @@ maps.browse = Просмотр карт continue = Продолжить maps.none = [lightgray]Карты не найдены! invalid = Недопустимый +pickcolor = Выбрать цвет preparingconfig = Подготовка конфигурации preparingcontent = Подготовка содержимого uploadingcontent = Выгрузка содержимого uploadingpreviewfile = Выгрузка файла предпросмотра committingchanges = Внесение изменений done = Готово -feature.unsupported = Your device does not support this feature. -mods.alphainfo = Имейте в виду, что модификации находятся в альфа-версии и могут содержать много ошибок[]. Докладывайте о любых проблемах, которые Вы найдете в Mindustry GitHub или Discord. +feature.unsupported = Ваше устройство не поддерживает эту возможность. + +mods.alphainfo = Имейте в виду, что модификации находятся в альфа-версии и [scarlet]могут содержать много ошибок[]. Докладывайте о любых проблемах, которые Вы найдете в Mindustry Github или Discord. mods.alpha = [accent](Альфа) mods = Модификации mods.none = [LIGHT_GRAY]Модификации не найдены! mods.guide = Руководство по созданию модификаций mods.report = Доложить об ошибке -mods.openfolder = Open Mod Folder +mods.openfolder = Открыть папку с модификациями mod.enabled = [lightgray]Включён mod.disabled = [scarlet]Выключен -mod.disable = Выключить -mod.delete.error = Unable to delete mod. File may be in use. +mod.disable = Выкл. +mod.delete.error = Невозможно удалить модификацию. Возможно, файл используется. +mod.requiresversion = [scarlet]Требуемая версия игры: [accent]{0} mod.missingdependencies = [scarlet]Не найдены родительские модификации: {0} mod.nowdisabled = [scarlet]Модификации '{0}' требуются родительские модификации:[accent] {1}\n[lightgray]Сначала нужно загрузить их.\nЭта модификация будет автоматически отключена. -mod.enable = Включить +mod.enable = Вкл. mod.requiresrestart = Теперь игра закроется, чтобы применить изменения в модификациях. mod.reloadrequired = [scarlet]Необходим перезапуск mod.import = Импортировать модификацию mod.import.github = Импортировать модификацию с GitHub +mod.item.remove = Этот предмет является частью модификации [accent]«{0}»[]. Чтобы удалить его, удалите саму модификацию. mod.remove.confirm = Этот мод будет удалён. mod.author = [LIGHT_GRAY]Автор:[] {0} mod.missing = Это сохранение содержит модификацию, которое Вы недавно обновили или оно больше не установлено. Может случиться повреждение сохранения. Вы уверены, что хотите загрузить его?\n[lightgray]Модификации:\n{0} mod.preview.missing = Перед публикацией этой модификации в Мастерской, Вы должны добавить изображение предпросмотра.\nРазместите изображение с именем[accent] preview.png[] в папке модификации и попробуйте снова. mod.folder.missing = Модификации могут быть опубликованы в Мастерской только в виде папки.\nЧтобы конвертировать любой мод в папку, просто извлеките его из архива и удалите старый архив .zip, затем перезапустите игру или перезагрузите модификации. + about.button = Об игре name = Имя: noname = Для начала, придумайте[accent] себе имя[]. @@ -111,8 +121,8 @@ filename = Имя файла: unlocked = Новый контент разблокирован! completed = [accent]Завершено techtree = Дерево технологий -research.list = [lightgray]Исследование: -research = Исследование +research.list = [lightgray]Исследуйте: +research = Исследовать researched = [lightgray]{0} исследовано. players = Игроков: {0} players.single = {0} игрок @@ -133,7 +143,7 @@ server.kicked.idInUse = Вы уже на этом сервере! Соедине server.kicked.customClient = Этот сервер не поддерживает пользовательские сборки. Загрузите официальную версию. server.kicked.gameover = Игра окончена! server.versions = Ваша версия:[accent] {0}[]\nВерсия сервера:[accent] {1}[] -host.info = Кнопка [accent]Сервер[] запускает сервер на порте [scarlet]6567[]. \nЛюбой пользователь в той же [lightgray]локальной сети или WiFi[] должен увидеть ваш сервер в своём списке серверов.\n\nЕсли Вы хотите, чтобы люди могли подключаться откуда угодно по IP, то требуется [accent]переадресация (проброс) портов[] и наличие [red]ВНЕШНЕГО[] WAN адреса (WAN адрес [red]НЕ должен[] начинаться с [red]10[][lightgray].x.x.x[], [red]100.64[][lightgray].x.x[], [red]172.16[][lightgray].x.x[], [red]192.168[][lightgray].x.x[], [red]127[][lightgray].x.x.x[])!\nКлиентам мобильных операторов нужно уточнять информацию в личном кабинете на сайте вашего оператора!\n\n[lightgray]Примечание: Если у кого-то возникают проблемы с подключением к вашей игре по локальной сети, убедитесь, что Вы разрешили доступ Mindustry к вашей локальной сети в настройках брандмауэра. Обратите внимание, что публичные сети иногда не позволяют обнаружение сервера. +host.info = Кнопка [accent]Открыть сервер[] запускает сервер на порте [scarlet]6567[].\nЛюбой пользователь в той же [lightgray]локальной сети или WiFi[] должен увидеть ваш сервер в своём списке серверов.\n\nЕсли Вы хотите, чтобы люди могли подключаться откуда угодно по IP, то требуется [accent]переадресация (проброс) портов[] и наличие [red]ВНЕШНЕГО[] WAN адреса (WAN адрес [red]НЕ должен[] начинаться с [red]10[][lightgray].x.x.x[], [red]100.64[][lightgray].x.x[], [red]172.16[][lightgray].x.x[], [red]192.168[][lightgray].x.x[], [red]127[][lightgray].x.x.x[])!\nКлиентам мобильных операторов нужно уточнять информацию в личном кабинете на сайте вашего оператора!\n\n[lightgray]Примечание: Если у кого-то возникают проблемы с подключением к вашей игре по локальной сети, убедитесь, что Вы разрешили доступ Mindustry к вашей локальной сети в настройках брандмауэра. Обратите внимание, что публичные сети иногда не позволяют обнаружение сервера. join.info = Здесь Вы можете ввести [accent]IP-адрес сервера[] для подключения или открыть [accent]локальную сеть[] для подключения к другим серверам.\nПоддерживаются оба многопользовательских режима: LAN и WAN.\n\n[lightgray]Примечание: это НЕ автоматический глобальный список серверов; если Вы хотите подключиться к кому-то по IP, вам нужно спросить у хоста его IP-адрес. hostserver = Запустить многопользовательский сервер invitefriends = Пригласить друзей @@ -152,7 +162,7 @@ trace.ip = IP: [accent]{0} trace.id = ID: [accent]{0} trace.mobile = Мобильный клиент: [accent]{0} trace.modclient = Пользовательский клиент: [accent]{0} -invalidid = Недопустимый уникальный идентификатор клиента! Отправьте отчёт об ошибке. +invalidid = Недопустимый ID клиента! Отправьте отчёт об ошибке. server.bans = Блокировки server.bans.none = Заблокированных игроков нет! server.admins = Администраторы @@ -175,7 +185,7 @@ joingame.ip = Адрес: disconnect = Отключено. disconnect.error = Ошибка соединения. disconnect.closed = Соединение закрыто. -disconnect.timeout = Время истекло. +disconnect.timeout = Время ожидания истекло. disconnect.data = Ошибка при загрузке данных мира! cantconnect = Не удаётся присоединиться к игре ([accent]{0}[]). connecting = [accent]Подключение… @@ -229,7 +239,7 @@ data.export = Экспортировать данные data.import = Импортировать данные data.exported = Данные экспортированы. data.invalid = Эти игровые данные являются недействительными. -data.import.confirm = Импорт внешних данных сотрёт[scarlet] все[] ваши игровые данные.\n[accent]Это не может быть отменено![]\n\nКак только данные импортированы, ваша игра немедленно закроется. +data.import.confirm = Импорт внешних данных сотрёт[scarlet] все[] Ваши игровые данные.\n[accent]Это не может быть отменено![]\n\nКак только данные импортированы, Ваша игра немедленно закроется. classic.export = Экспортировать данные классической версии classic.export.text = [accent]Mindustry[] получил глобальное обновление.\nБыло обнаружено Классическое (версия 3.5 сборка 40) сохранение или карта. Вы хотите экспортировать эти сохранения в домашнюю папку вашего телефона, для использования в приложении Mindustry Classic? quit.confirm = Вы уверены, что хотите выйти? @@ -247,7 +257,7 @@ wave.waveInProgress = [lightgray]Волна продолжается waiting = [lightgray]Ожидание… waiting.players = Ожидание игроков… wave.enemies = Враги: [lightgray]{0} -wave.enemy = Остался [lightgray]{0} враг +wave.enemy = Остался {0} [lightgray]враг[] loadimage = Загрузить изображение saveimage = Сохранить изображение unknown = Неизвестно @@ -270,12 +280,13 @@ missing = Этот предмет был удалён или перемещён. publishing = [accent]Отправка... publish.confirm = Вы уверены, что хотите опубликовать этот предмет?\n\n[lightgray]Убедитесь, что Вы согласны с EULA Мастерской, иначе ваши предметы не будут отображаться! publish.error = Ошибка отправки предмета: {0} -steam.error = Failed to initialize Steam services.\nError: {0} +steam.error = Не удалось инициализировать сервисы Steam.\nОшибка: {0} + editor.brush = Кисть editor.openin = Открыть в редакторе editor.oregen = Генерация руд editor.oregen.info = Генерация руд: -editor.mapinfo = Параметры карты +editor.mapinfo = Информация о карте editor.author = Автор: editor.description = Описание: editor.nodescription = Чтобы опубликовать карту, она должна содержать по крайней мере 4 символа в описании. @@ -340,13 +351,14 @@ editor.exportimage = Экспортировать изображение лан editor.exportimage.description = Экспортировать файл с изображением карты editor.loadimage = Импортировать\nизображение editor.saveimage = Экспортировать\nизображение -editor.unsaved = [scarlet]У вас есть несохранённые изменения![]\nВы уверены, что хотите выйти? +editor.unsaved = [scarlet]У Вас есть несохранённые изменения![]\nВы уверены, что хотите выйти? editor.resizemap = Изменить размер карты editor.mapname = Название карты: -editor.overwrite = [accent]Внимание! \nЭто перезапишет уже существующую карту. +editor.overwrite = [accent]Внимание!\nЭто перезапишет уже существующую карту. editor.overwrite.confirm = [scarlet]Осторожно![] Карта с таким названием уже существует. Вы действительно хотите её перезаписать? editor.exists = Карта с таким именем уже существует. editor.selectmap = Выберите карту для загрузки: + toolmode.replace = Заменить toolmode.replace.description = Рисует только\nна сплошных блоках. toolmode.replaceall = Заменить всё @@ -361,6 +373,7 @@ toolmode.fillteams = Изменить команду блоков toolmode.fillteams.description = Изменяет принадлежность\nблоков к команде. toolmode.drawteams = Изменить команду блока toolmode.drawteams.description = Изменяет принадлежность\nблока к команде. + filters.empty = [lightgray]Нет фильтров! Добавьте один при помощи кнопки ниже. filter.distort = Искажение filter.noise = Шум @@ -392,6 +405,7 @@ filter.option.floor2 = Вторая поверхность filter.option.threshold2 = Вторичный предельный порог filter.option.radius = Радиус filter.option.percentile = Процентиль + width = Ширина: height = Высота: menu = Меню @@ -407,10 +421,11 @@ tutorial = Обучение tutorial.retake = Перепройти обучение editor = Редактор mapeditor = Редактор карт + abandon = Покинуть abandon.text = Эта зона и все её ресурсы будут отданы противнику. locked = Заблокировано -complete = [lightgray]Достигнута: +complete = [lightgray]Выполнить: requirement.wave = Достигните {0} волны в зоне {1} requirement.core = Уничтожьте вражеское ядро в зоне {0} requirement.unlock = Разблокируйте {0} @@ -429,14 +444,15 @@ addall = Добавить всё configure.locked = [lightgray]Разблокировка выгрузки ресурсов: {0}. configure.invalid = Количество должно быть числом между 0 и {0}. zone.unlocked = Зона «[lightgray]{0}» теперь разблокирована. -zone.requirement.complete = Вы достигли {0}-ой волны,\nУсловия для зоны «{1}» выполнены. -zone.config.unlocked = Loadout unlocked:[lightgray]\n{0} +zone.requirement.complete = Условия для зоны «{0}» выполнены:[lightgray]\n{1} +zone.config.unlocked = Выгрузка ресурсов разблокирована:[lightgray]\n{0} zone.resources = [lightgray]Обнаруженные ресурсы: zone.objective = [lightgray]Цель: [accent]{0} zone.objective.survival = Выжить zone.objective.attack = Уничтожить вражеское ядро add = Добавить… boss.health = Здоровье босса + connectfail = [crimson]Ошибка подключения:\n\n[accent]{0} error.unreachable = Сервер недоступен.\nВы уверены, что адрес введён корректно? error.invalidaddress = Некорректный адрес. @@ -446,11 +462,12 @@ error.alreadyconnected = Вы уже подключены. error.mapnotfound = Файл карты не найден! error.io = Сетевая ошибка ввода-вывода. error.any = Неизвестная сетевая ошибка. -error.bloom = Не удалось инициализировать свечение (Bloom).\nВозможно, ваше устройство не поддерживает его. +error.bloom = Не удалось инициализировать свечение (Bloom).\nВозможно, Ваше устройство не поддерживает его. + zone.groundZero.name = Отправная точка zone.desertWastes.name = Покинутые пустоши zone.craters.name = Кратеры -zone.frozenForest.name = Ледяной Лес +zone.frozenForest.name = Ледяной лес zone.ruinousShores.name = Разрушенные берега zone.stainedMountains.name = Окрашенные горы zone.desolateRift.name = Пустынный разлом @@ -461,24 +478,27 @@ zone.saltFlats.name = Соляные равнины zone.impact0078.name = Воздействие 0078 zone.crags.name = Скалы zone.fungalPass.name = Грибной перевал + zone.groundZero.description = Оптимальная локация для повторных игр. Низкая вражеская угроза. Немного ресурсов.\nСоберите как можно больше свинца и меди.\nДвигайтесь дальше. zone.frozenForest.description = Даже здесь, ближе к горам, споры распространились. Холодные температуры не могут сдерживать их вечно.\n\nНачните вкладываться в энергию. Постройте генераторы внутреннего сгорания. Научитесь пользоваться регенератором. zone.desertWastes.description = Эти пустоши огромны, непредсказуемы и пронизаны заброшенными секторальными структурами.\nВ регионе присутствует уголь. Сожгите его для получения энергии, или синтезируйте графит.\n\n[lightgray]Место посадки здесь может не быть гарантировано. zone.saltFlats.description = На окраине пустыни лежат соляные равнины. В этой местности можно найти немного ресурсов.\n\nВраги возвели здесь комплекс хранения ресурсов. Искорените их ядро. Не оставьте камня на камне. -zone.craters.description = Вода скопилась в этом кратере, реликвии времён старых войн. Восстановите область. Соберите песок. Выплавите метастекло. Качайте воду для охлаждения турелей и буров. +zone.craters.description = Вода скопилась в этом кратере, реликвии времён старых войн. Восстановите область. Соберите песок. Выплавьте метастекло. Качайте воду для охлаждения турелей и буров. zone.ruinousShores.description = Мимо пустошей проходит береговая линия. Когда-то здесь располагался массив береговой обороны. Не так много от него осталось. Только самые базовые оборонительные сооружения остались невредимыми, всё остальное превратилось в металлолом.\nПродолжайте экспансию вовне. Переоткройте для себя технологии. -zone.stainedMountains.description = Дальше, вглубь местности, лежат горы, еще не запятнанные спорами.\nИзвлеките изобилие титана в этой области. Узнайте, как его использовать.\n\nВражеское присутствие здесь сильнее. Не дайте им времени для отправки своих сильнейших боевых единиц. +zone.stainedMountains.description = Дальше, вглубь местности, лежат горы, еще не запятнанные спорами.\nИзвлеките изобилие титана в этой области. Научитесь им пользоваться.\n\nВражеское присутствие здесь сильнее. Не дайте им времени для отправки своих сильнейших боевых единиц. zone.overgrowth.description = Эта заросшая область находится ближе к источнику спор.\nВраг организовал здесь форпост. Постройте боевые единицы «Титан». Уничтожьте его. Верните то, что было потеряно. -zone.tarFields.description = Окраина зоны нефтедобычи, между горами и пустыней. Один из немногих районов с полезными запасами дёгтя.\nХотя область заброшенна, в этой области присутствуют поблизости некоторые опасные вражеские силы. Не стоит их недооценивать.\n\n[lightgray]Исследуйте технологию переработки нефти, если возможно. +zone.tarFields.description = Окраина зоны нефтедобычи, между горами и пустыней. Один из немногих районов с полезными запасами дёгтя.\nХотя эта область заброшенна, в ней поблизости присутствуют некоторые опасные вражеские силы. Не стоит их недооценивать.\n\n[lightgray]Исследуйте технологию переработки нефти, если возможно. zone.desolateRift.description = Чрезвычайно опасная зона. Обилие ресурсов, но мало места. Высокий риск разрушения. Эвакуироваться нужно как можно скорее. Не расслабляйтесь во время больших перерывов между вражескими атаками. zone.nuclearComplex.description = Бывший завод по производству и переработке тория, превращенный в руины.\n[lightgray]Исследуйте торий и варианты его многочисленного применения.\n\nВраг присутствует здесь в большом числе, постоянно разведывая нападающих. zone.fungalPass.description = Переходная область между высокими горами и более низкими, покрытыми спорами землями. Здесь расположена небольшая разведывательная база противника.\nУничтожьте ее.\nИспользуйте единицы «Кинжал» и «Камикадзе». Достаньте до обоих ядер. zone.impact0078.description = <вставить описание здесь> zone.crags.description = <вставить описание здесь> + settings.language = Язык settings.data = Игровые данные settings.reset = Сбросить по умолчанию settings.rebind = Сменить +settings.resetKey = Сбросить settings.controls = Управление settings.game = Игра settings.sound = Звук @@ -508,8 +528,8 @@ blocks.launchtime = Интервал запусков blocks.shootrange = Радиус действия blocks.size = Размер blocks.liquidcapacity = Вместимость жидкости -blocks.powerrange = Диапазон передачи энергии -blocks.powerconnections = Max Connections +blocks.powerrange = Дальность передачи энергии +blocks.powerconnections = Количество соединений blocks.poweruse = Потребляет энергии blocks.powerdamage = Энергия/урон blocks.itemcapacity = Вместимость предметов @@ -529,9 +549,10 @@ blocks.inaccuracy = Разброс blocks.shots = Выстрелы blocks.reload = Выстрелы/секунду blocks.ammo = Боеприпасы -bar.drilltierreq = Требуется лучший бур -bar.drillspeed = Скорость бурения: {0}/s -bar.pumpspeed = Pump Speed: {0}/s + +bar.drilltierreq = Требуется бур получше +bar.drillspeed = Скорость бурения: {0}/с +bar.pumpspeed = Скорость выкачивания: {0}/с bar.efficiency = Эффективность: {0}% bar.powerbalance = Энергия: {0}/с bar.powerstored = Накоплено: {0}/{1} @@ -544,6 +565,9 @@ bar.heat = Нагрев bar.power = Энергия bar.progress = Прогресс строительства bar.spawned = Единицы: {0}/{1} +bar.input = Вход +bar.output = Выход + bullet.damage = [stat]{0}[lightgray] урона bullet.splashdamage = [stat]{0}[lightgray] урона в радиусе ~[stat] {1}[lightgray] блоков bullet.incendiary = [stat]зажигательный @@ -555,6 +579,7 @@ bullet.freezing = [stat]замораживающий bullet.tarred = [stat]замедляющий, горючий bullet.multiplier = [stat]{0}[lightgray]x множитель боеприпасов bullet.reload = [stat]{0}[lightgray]x скорость стрельбы + unit.blocks = блоки unit.powersecond = единиц энергии/секунду unit.liquidsecond = жидкостных единиц/секунду @@ -567,6 +592,8 @@ unit.persecond = /сек unit.timesspeed = x скорость unit.percent = % unit.items = предметов +unit.thousands = тыс +unit.millions = мил category.general = Основные category.power = Энергия category.liquids = Жидкости @@ -576,9 +603,10 @@ category.shooting = Стрельба category.optional = Дополнительные улучшения setting.landscape.name = Только альбомный (горизонтальный) режим setting.shadows.name = Тени -setting.blockreplace.name = Automatic Block Suggestions +setting.blockreplace.name = Автоматическая замена блоков setting.linear.name = Линейная фильтрация setting.hints.name = Подсказки +setting.buildautopause.name = Автоматическая приостановка строительства setting.animatedwater.name = Анимированная вода setting.animatedshields.name = Анимированные щиты setting.antialias.name = Сглаживание[lightgray] (требует перезапуска)[] @@ -599,14 +627,17 @@ setting.difficulty.insane = Безумная setting.difficulty.name = Сложность: setting.screenshake.name = Тряска экрана setting.effects.name = Эффекты -setting.destroyedblocks.name = Display Destroyed Blocks -setting.conveyorpathfinding.name = Conveyor Placement Pathfinding +setting.destroyedblocks.name = Отображать уничтоженные блоки +setting.conveyorpathfinding.name = Поиск пути для установки конвейеров setting.sensitivity.name = Чувствительность контроллера setting.saveinterval.name = Интервал сохранения setting.seconds = {0} секунд +setting.blockselecttimeout.name = Тайм-аут выбора блока +setting.milliseconds = {0} миллисекунд setting.fullscreen.name = Полноэкранный режим setting.borderlesswindow.name = Безрамочное окно[lightgray] (может потребоваться перезапуск) -setting.fps.name = Показывать FPS +setting.fps.name = Показывать FPS и пинг +setting.blockselectkeys.name = Показать клавиши выбора блока setting.vsync.name = Вертикальная синхронизация setting.pixelate.name = Пикселизация[lightgray] (отключает анимации) setting.minimap.name = Отображать мини-карту @@ -614,7 +645,7 @@ setting.position.name = Отображать координаты игрока setting.musicvol.name = Громкость музыки setting.ambientvol.name = Громкость окружения setting.mutemusic.name = Заглушить музыку -setting.sfxvol.name = Громкость звуковых эффектов +setting.sfxvol.name = Громкость эффектов setting.mutesound.name = Заглушить звук setting.crashreport.name = Отправлять анонимные отчёты о вылетах setting.savecreate.name = Автоматическое создание сохранений @@ -635,17 +666,36 @@ category.multiplayer.name = Сетевая игра command.attack = Атаковать command.rally = Точка сбора command.retreat = Отступить +placement.blockselectkeys = \n[lightgray]Клавиша: [{0}, keybind.clear_building.name = Очистить план строительства keybind.press = Нажмите клавишу… keybind.press.axis = Нажмите оси или клавишу… keybind.screenshot.name = Скриншот карты -keybind.move_x.name = Движение по оси x -keybind.move_y.name = Движение по оси y +keybind.toggle_power_lines.name = Отображение лазеров энергоснабжения +keybind.move_x.name = Движение по оси X +keybind.move_y.name = Движение по оси Y +keybind.category_prev.name = Предыдущая категория +keybind.category_next.name = Следующая категория +keybind.block_select_left.name = Выбор левого блока +keybind.block_select_right.name = Выбор правого блока +keybind.block_select_up.name = Выбор верхнего блока +keybind.block_select_down.name = Выбор нижнего блока +keybind.block_select_01.name = Категория/Выбор блока 1 +keybind.block_select_02.name = Категория/Выбор блока 2 +keybind.block_select_03.name = Категория/Выбор блока 3 +keybind.block_select_04.name = Категория/Выбор блока 4 +keybind.block_select_05.name = Категория/Выбор блока 5 +keybind.block_select_06.name = Категория/Выбор блока 6 +keybind.block_select_07.name = Категория/Выбор блока 7 +keybind.block_select_08.name = Категория/Выбор блока 8 +keybind.block_select_09.name = Категория/Выбор блока 9 +keybind.block_select_10.name = Категория/Выбор блока 10 +keybind.mouse_move.name = Следовать за курсором keybind.schematic_select.name = Выбрать область keybind.schematic_menu.name = Меню схем keybind.schematic_flip_x.name = Отразить схему по оси X keybind.schematic_flip_y.name = Отразить схему по оси Y -keybind.fullscreen.name = Полноэкранный режим +keybind.fullscreen.name = Переключение полноэкранного режима keybind.select.name = Выбор/Выстрел keybind.diagonal_placement.name = Диагональное размещение keybind.pick.name = Выбрать блок @@ -679,10 +729,11 @@ mode.editor.name = Редактор mode.pvp.name = PvP mode.pvp.description = Боритесь против других игроков.\n[gray]Для игры требуется как минимум 2 ядра разного цвета на карте. mode.attack.name = Атака -mode.attack.description = Уничтожьте вражескую базу. Никаких волн.\n[gray]Для игры требуется красное ядро на карте. +mode.attack.description = Уничтожьте вражескую базу.\n[gray]Для игры требуется красное ядро на карте. mode.custom = Пользовательские правила + rules.infiniteresources = Бесконечные ресурсы (Игрок) -rules.reactorexplosions = Взрывы реактора +rules.reactorexplosions = Взрывы реакторов rules.wavetimer = Интервал волн rules.waves = Волны rules.attack = Режим атаки @@ -708,6 +759,10 @@ rules.title.resourcesbuilding = Ресурсы & строительство rules.title.player = Игроки rules.title.enemy = Враги rules.title.unit = Боев. ед. +rules.title.experimental = Эксперементально +rules.lighting = Освещение +rules.ambientlight = Окружающий свет + content.item.name = Предметы content.liquid.name = Жидкости content.unit.name = Боевые единицы @@ -754,6 +809,7 @@ mech.trident-ship.name = Трезубец mech.trident-ship.weapon = Бомбовый отсек mech.glaive-ship.name = Копьё mech.glaive-ship.weapon = Огненный бластер +item.corestorable = [lightgray]Можно хранить в ядре: {0} item.explosiveness = [lightgray]Взрывоопасность: {0}% item.flammability = [lightgray]Воспламеняемость: {0}% item.radioactivity = [lightgray]Радиоактивность: {0}% @@ -769,6 +825,7 @@ mech.buildspeed = [lightgray]Скорость строительства: {0}% liquid.heatcapacity = [lightgray]Теплоёмкость: {0} liquid.viscosity = [lightgray]Вязкость: {0} liquid.temperature = [lightgray]Температура: {0} + block.sand-boulder.name = Песчаный валун block.grass.name = Трава block.salt.name = Соль @@ -796,6 +853,8 @@ block.kiln.name = Печь block.graphite-press.name = Графитный пресс block.multi-press.name = Мульти-пресс block.constructing = {0} [lightgray](Строится) +block.signal = [lightgray]Сигнал: {0} +block.editsignal = Сигнал block.spawn.name = Точка появления врагов block.core-shard.name = Ядро: «Осколок» block.core-foundation.name = Ядро: «Штаб» @@ -867,6 +926,8 @@ block.distributor.name = Распределитель block.sorter.name = Сортировщик block.inverted-sorter.name = Инвертированный сортировщик block.message.name = Сообщение +block.illuminator.name = Осветитель +block.illuminator.description = Маленький, компактный, настраиваемый источник света. Требуется энергия для работы. block.overflow-gate.name = Избыточный затвор block.silicon-smelter.name = Кремниевый плавильный завод block.phase-weaver.name = Фазовый ткач @@ -880,6 +941,7 @@ block.coal-centrifuge.name = Угольная центрифуга block.power-node.name = Силовой узел block.power-node-large.name = Большой силовой узел block.surge-tower.name = Кинетическая вышка +block.diode.name = Диод block.battery.name = Аккумулятор block.battery-large.name = Большой аккумулятор block.combustion-generator.name = Генератор внутреннего сгорания @@ -932,6 +994,7 @@ block.fortress-factory.name = Завод мехов «Крепость» block.revenant-factory.name = Завод крейсеров «Мститель» block.repair-point.name = Ремонтный пункт block.pulse-conduit.name = Импульсный трубопровод +block.plated-conduit.name = Укреплённый трубопровод block.phase-conduit.name = Фазовый трубопровод block.liquid-router.name = Жидкостный маршрутизатор block.liquid-tank.name = Жидкостный бак @@ -983,37 +1046,38 @@ 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.mobile = Вы начали[scarlet] обучение по Mindustry.[]\nПроведите по экрану, чтобы двигаться.\n[accent] Сведите или разведите 2 пальца для []изменения масштаба.\nНачните с [accent]добычи меди[]. Приблизьтесь к ней, затем нажмите на медную жилу возле Вашего ядра, чтобы сделать это.\n\n[accent]{0}/{1} меди -tutorial.drill = Ручная добыча не является эффективной.\n[accent]Буры []могут добывать автоматически.\nНажмите на вкладку с изображением сверла снизу справа.\nВыберите[accent] механический бур[]. Разместите его на медной жиле нажатием.\n[accent]Нажатие по правой кнопке[] прервёт строительство. [accent]Зажмите Ctrl и покрутите колесо мыши[]для приближения или отдаления камеры. -tutorial.drill.mobile = Ручная добыча не является эффективной.\n[accent]Буры []могут добывать автоматически.\nНажмите на вкладку с изображением сверла снизу справа.\nВыберите[accent] механический бур[]. \nРазместите его на медной жиле нажатием, затемм нажмите [accent] белую галку[] ниже, чтобы подтвердить построение выделенного.\nНажмите [accent] кнопку X[], чтобы отменить размещение. +tutorial.intro = Вы начали[scarlet] обучение по Mindustry.[]\nИспользуйте кнопки [accent][[WASD][] для передвижения.\n[accent]Зажмите [[Ctrl] и покрутите колесо мыши[]для приближения или отдаления камеры.\nНачните с [accent]добычи меди[]. Приблизьтесь к ней, затем нажмите на медную жилу возле Вашего ядра, чтобы сделать это.\n\n[accent]{0}/{1} меди +tutorial.intro.mobile = Вы начали[scarlet] обучение по Mindustry.[]\nПроведите по экрану, чтобы двигаться.\n[accent]Сведите или разведите 2 пальца[] для изменения масштаба.\nНачните с [accent]добычи меди[]. Приблизьтесь к ней, затем нажмите на медную жилу возле Вашего ядра, чтобы сделать это.\n\n[accent]{0}/{1} меди +tutorial.drill = Ручная добыча не является эффективной.\n[accent]Буры[] могут добывать автоматически.\nНажмите на вкладку с изображением сверла снизу справа.\nВыберите[accent] механический бур[]. Разместите его на медной жиле нажатием.\n[accent]Нажатие по правой кнопке[] прервёт строительство. +tutorial.drill.mobile = Ручная добыча не является эффективной.\n[accent]Буры []могут добывать автоматически.\nНажмите на вкладку с изображением сверла снизу справа.\nВыберите[accent] механический бур[].\nРазместите его на медной жиле нажатием, затем нажмите [accent] белую галку[] ниже, чтобы подтвердить построение выделенного.\nНажмите [accent] кнопку X[], чтобы отменить размещение. tutorial.blockinfo = Каждый блок имеет разные характеристики. Каждая дрель может добывать определенные руды.\nЧтобы узнать информацию о блоке и о его характеристиках,[accent] нажмите на «?», когда он выбран в меню строительства.[]\n\n[accent]Сейчас, узнайте характеристики механического бура.[] tutorial.conveyor = [accent]Конвейеры[] используются для транспортировки ресуров в ядро.\nСделайте линию конвейеров от бура к ядру\n[accent]Удерживайте левую кнопку мыши, чтобы разместить в линию.[]\nУдерживайте[accent] CTRL[] при постройке линии блоков, чтобы сделать её диагональной\n\n[accent]Разместите 2 конвейера в линию и доставьте предметы в ядро. tutorial.conveyor.mobile = [accent]Конвейеры[] используются для транспортировки ресурсов в ядро\nСделайте линию конвейеров от бура к ядру\n[accent]Сделайте линию, удерживая палец несколько секунд в том месте, в котором Вы хотите начать линию,[] и перетяните его в нужном направлении.[accent]Разместите 2 конвейера в линию и доставьте предметы в ядро. tutorial.turret = Как только предмет попадает в ядро, его можно использовать в строительстве.\nИмейте в виду, что не все предметы могут быть использованы в строительстве.\nПредметы, которые нелья использовать для стоительства, такие как[accent] уголь[] или[accent] металлолом[], не могут быть транспортированы в ядро.\nЗащитные структуры нужно строить для отражения[lightgray] противников[].\nПостройте[accent] двойную турель[] возле Вашей базы. -tutorial.drillturret = Двойным турелям нужна [accent]медь []в качестве боеприпасов.\nРазместите бур рядом с турелью.\nПроведите конвейеры к турели, чтобы снабдить её медью.\n\n[accent]Боеприпасов доставлено: 0/1 -tutorial.pause = Во время битвы Вы можете[accent] приостановить игру.[]\nВы можете планировать строительство, когда игра стоит на паузе.\n\n[accent]Нажмите ПРОБЕЛ для приостановки игры. +tutorial.drillturret = Двойным турелям нужна [accent]медные боеприпасы[] для стрельбы.\nРазместите бур рядом с турелью.\nПроведите конвейеры к турели, чтобы снабдить её медью.\n\n[accent]Боеприпасов доставлено: 0/1 +tutorial.pause = Во время битвы, Вы можете[accent] приостановить игру.[]\nВы можете планировать строительство, когда игра стоит на паузе.\n\n[accent]Нажмите ПРОБЕЛ для приостановки игры. tutorial.pause.mobile = Во время битвы, Вы можете[accent] приостановить игру.[]\nВы можеть планировать строительство, когда игра стоит на паузе.\n\n[accent]Нажмите кнопку вверху слева, чтобы поставить игру на паузу. tutorial.unpause = Снова нажмите пробел для снятия паузы. tutorial.unpause.mobile = Снова нажмите туда для снятия паузы. tutorial.breaking = Зачастую, блоки приходится разрушать\n[accent]Зажмите ПКМ[], чтобы разрушить блоки в выбранной зоне.[]\n\n[accent]Разрушьте все стены из металлолома слева от Вашего ядра. -tutorial.breaking.mobile = Зачастую, блоки приходится разрушить.\n[accent]Выберите режим деконструкции[], после чего нажмите на нужный блок, чтобы разрушить его.\nРазрушьте блоки в выбранной зоне, зажав палец на несколько секунд[], и проведя его в нужном направлении.\nНажмите на галочку, чтобы подтвердить разрушение.\n\n[accent]Разрушьте все стены из металлолома слева от Вашего ядра. +tutorial.breaking.mobile = Зачастую, блоки приходится разрушать.\n[accent]Выберите режим деконструкции[], после чего нажмите на нужный блок, чтобы разрушить его.\nРазрушьте блоки в выбранной зоне, зажав палец на несколько секунд[], и проведя его в нужном направлении.\nНажмите на галочку, чтобы подтвердить разрушение.\n\n[accent]Разрушьте все стены из металлолома слева от Вашего ядра. tutorial.withdraw = В некоторых ситуациях, необходимо забрать предметы из блоков вручную.\nЧтобы сделать это, [accent]нажмите на блок[], в котором находятся предметы, затем [accent]нажмите на предмет[] в инвентаре.\nМожно забрать несколько предметов [accent]нажатием с зажимом[].\n\n[accent]Заберите немного меди из ядра[] -tutorial.deposit = Положить предметы в блоки можно перетащив от своего корабля к нужному блоку.\n\n[accent]Перенесите медь обратно в ядро[] +tutorial.deposit = Положите предметы в блок, перетащив их от своего корабля в нужный блок.\n\n[accent]Перенесите медь обратно в ядро[] tutorial.waves = [lightgray]Противники[] приближаются.\n\nЗащитите ядро от двух волн. Используйте[accent] левую кнопку мыши[] для стрельбы.\nПостройте больше турелей и буров. Добудьте больше меди. tutorial.waves.mobile = [lightgray]Противники[] приближаются.\n\nЗащитите ядро от двух волн. Ваш корабль будет автоматически атаковать противника.\nПостройте больше турелей и буров. Добудьте больше меди. tutorial.launch = Когда Вы достигаете определенной волны, Вы можете осуществить[accent] запуск ядра[], оставив базу и[accent] перенести ресурсы из ядра.[]\nЭти ресурсы могут быть использованы для изучения новых технологий.\n\n[accent]Нажмите кнопку запуска. + item.copper.description = Самый основной строительный материал. Широко используется во всех типах блоков. item.lead.description = Основной стартовый материал. Широко используется в электронике и блоках для транспортировки жидкостей. item.metaglass.description = Сверхпрочный сплав стекла. Широко используется для распределения и хранения жидкости. item.graphite.description = Минерализованный углерод, используемый для боеприпасов и электроизоляции. -item.sand.description = Обычный материал, который широко используется при выплавке, как при легировании, так и в качестве отходов. +item.sand.description = Обычный материал, который широко используется при выплавке, как при легировании, так и в качестве флюса. item.coal.description = Окаменелое растительное вещество, образовавшееся задолго до посева. Широко используется для производства топлива и ресурсов. item.titanium.description = Редкий сверхлёгкий металл, широко используемый для транспортировки жидкостей, буров и авиации. item.thorium.description = Плотный радиоактивный металл, используемый в качестве структурной опоры и ядерного топлива. item.scrap.description = Остатки старых сооружений и подразделений. Содержит небольшие количества многих различных металлов. item.silicon.description = Чрезвычайно полезный полупроводник. Применяется в солнечных панелях, сложной электронике и самонаводящихся боеприпасах. -item.plastanium.description = Лёгкий, пластичный материал, используемый в современных авиационных и осколочных боеприпасах. +item.plastanium.description = Лёгкий, пластичный материал, используемый в продвинутой авиации и осколочных боеприпасах. item.phase-fabric.description = Практически невесомое вещество, используемое в передовой электронике и технологиях самовосстановления. item.surge-alloy.description = Современный сплав с уникальными электрическими свойствами. item.spore-pod.description = Стручок синтетических спор, синтезированных из атмосферных концентраций для промышленных целей. Используется для превращения в нефть, взрывчатые вещества и топливо. @@ -1025,9 +1089,9 @@ liquid.oil.description = Жидкость, используемая в прои liquid.cryofluid.description = Инертная, неедкая жидкость, созданная из воды и титана. Обладает чрезвычайно высокой теплоёмкостью. Широко используется в качестве охлаждающей жидкости. mech.alpha-mech.description = Стандартный управляемый мех. Основан на «Кинжале», с улучшенной броней и строительными возможностями. Имеет больший урон, чем «Дротик». mech.delta-mech.description = Быстрый, легко бронированный мех, созданный для ударов «атакуй и беги». Наносит мало урона по строениям, но может очень быстро убить большие группы вражеских орудий с помощью дуговых молний. -mech.tau-mech.description = Мех поддержки. Ремонтирует союзные блоки просто стреляя в них. Может лечить союзников в радиусе его ремонтирующей способности. +mech.tau-mech.description = Мех поддержки. Ремонтирует союзные блоки, просто стреляя в них. Может лечить союзников в радиусе его ремонтирующей способности. mech.omega-mech.description = Громоздкий и хорошо бронированный мех, созданный для передовых атак. Его броня может блокировать до 90% входящего урона. -mech.dart-ship.description = Стандартный управляемый корабль. Достаточно быстрый и легкий, но мало атакующий и обладает низкой скоростью добычи. +mech.dart-ship.description = Стандартный управляемый корабль. Быстрая скорость добычи. Достаточно быстрый и легкий, но обладает слабым вооружением. mech.javelin-ship.description = Корабль для тактики «атакуй и беги». Сначала он медленный, но позже может разгоняться до огромных скоростей и летать над аванпостами противника, нанося большой урон молниями и ракетами. mech.trident-ship.description = Тяжёлый бомбардировщик, построенный для строительства и уничтожения вражеских укреплений. Достаточно хорошо бронированный. mech.glaive-ship.description = Большой хорошо бронированный боевой корабль. Оборудован зажигательным повторителем. Очень манёвренный. @@ -1046,14 +1110,14 @@ block.message.description = Сохраняет сообщение. Исполь block.graphite-press.description = Сжимает куски угля в чистые листы графита. block.multi-press.description = Обновлённая версия графитовой печати. Использует воду и энергию для быстрой и эффективной переработки угля. block.silicon-smelter.description = Соединяет песок с чистым углем. Производит кремний. -block.kiln.description = Выплавляет песок и свинец в соединение, известному как метастекло. Требуется небольшое количество энергии для запуска. +block.kiln.description = Выплавляет песок и свинец в соединение, известное как метастекло. Требуется небольшое количество энергии для работы. block.plastanium-compressor.description = Производит пластаний из нефти и титана. -block.phase-weaver.description = Синтезирует фазовую ткань из радиоактивного тория и песка. Требуется огромное количество энергии. +block.phase-weaver.description = Синтезирует фазовую ткань из радиоактивного тория и песка. Требуется огромное количество энергии для работы. block.alloy-smelter.description = Объединяет титан, свинец, кремний и медь для производства кинетического сплава. block.cryofluidmixer.description = Смешивает воду и мелкий титановый порошок титана в криогеннную жидкость. Неотъемлемая часть при использования ториевого реактора block.blast-mixer.description = Раздавливает и смешивает скопления спор с пиротитом для получения взрывчатого вещества. block.pyratite-mixer.description = Смешивает уголь, свинец и песок в легковоспламеняющийся пиротит. -block.melter.description = Плавит металлолом в шлак для дальнейшей обработки или использования в башнях «Волна». +block.melter.description = Плавит металлолом в шлак для дальнейшей обработки или использования в турелях «Волна». block.separator.description = Разделяет шлак на его минеральные компоненты. Выводит охлажденный результат. block.spore-press.description = Сжимает капсулы спор под сильным давлением для синтеза масла. block.pulverizer.description = Измельчает металлолом в мелкий песок. @@ -1064,12 +1128,12 @@ block.power-source.description = Бесконечно вводит энерги block.item-source.description = Бесконечно выводит элементы. Только песочница. block.item-void.description = Уничтожает любые предметы. Только песочница. block.liquid-source.description = Бесконечно выводит жидкости. Только песочница. -block.copper-wall.description = Дешёвый защитный блок.\nПолезно для защиты ядра и турелей в первые несколько волн. -block.copper-wall-large.description = Дешёвый защитный блок.\nПолезно для защиты ядра и турелей в первые несколько волн.\nРазмещается на нескольких плитках. +block.copper-wall.description = Дешёвый защитный блок.\nПолезен для защиты ядра и турелей в первые несколько волн. +block.copper-wall-large.description = Дешёвый защитный блок.\nПолезен для защиты ядра и турелей в первые несколько волн.\nРазмещается на нескольких плитках. block.titanium-wall.description = Умеренно сильный защитный блок.\nОбеспечивает умеренную защиту от врагов. block.titanium-wall-large.description = Умеренно сильный защитный блок.\nОбеспечивает умеренную защиту от врагов.\nРазмещается на нескольких плитках. -block.plastanium-wall.description = Специальный тип стены, который поглощает электрические разряды и блокирует автоматическое соединение между силовыми узлами.\nРазмещается на нескольких плитках. -block.plastanium-wall-large.description = A special type of wall that absorbs electric arcs and blocks automatic power node connections.\nSpans multiple tiles. +block.plastanium-wall.description = Специальный тип стены, который поглощает электрические разряды и блокирует автоматическое соединение между силовыми узлами. +block.plastanium-wall-large.description = Специальный тип стены, который поглощает электрические разряды и блокирует автоматическое соединение между силовыми узлами.\nРазмещается на нескольких плитках. block.thorium-wall.description = Сильный защитный блок.\nХорошая защита от врагов. block.thorium-wall-large.description = Сильный защитный блок.\nХорошая защита от врагов.\nРазмещается на нескольких плитках. block.phase-wall.description = Стена, покрытая специальным фазовым отражающим составом. Отражает большинство пуль при ударе. @@ -1078,38 +1142,39 @@ block.surge-wall.description = Очень прочный защитный бло block.surge-wall-large.description = Очень прочный защитный блок.\nНакапливает заряд при контакте с пулей, выпуская его случайным образом.\nРазмещается на нескольких плитках. block.door.description = Маленькая дверь. Можно открыть или закрыть нажатием. block.door-large.description = Большая дверь. Можно открыть и закрыть нажатием.\nРазмещается на нескольких плитках. -block.mender.description = Периодически ремонтирует блоки в непосредственной близости. Сохраняет средства защиты, восстановленные между волнами.\nОпционально использует кремний для увеличения дальности и эффективности. -block.mend-projector.description = Обновлённая версия Регенератора. Ремонт блоков в непосредственной близости.\nОпционально использует фазовую ткань для увеличения дальности и эффективности. +block.mender.description = Периодически ремонтирует блоки в непосредственной близости. Сохраняет средства защиты в целостности между волнами.\nОпционально использует кремний для увеличения дальности и эффективности. +block.mend-projector.description = Обновлённая версия Регенератора. Ремонтирует блоки в непосредственной близости.\nОпционально использует фазовую ткань для увеличения дальности и эффективности. block.overdrive-projector.description = Увеличивает скорость близлежащих зданий.\nОпционально использует фазовую ткань для увеличения дальности и эффективности. -block.force-projector.description = Создает вокруг себя шестиугольное силовое поле, защищая здания и подразделения внутри от повреждений.\nПерегревается, если нанесено слишком большое количество повреждений. Опционально требуется охлаждающая жидкость для предотвращения перегрева. Фазовая ткань может быть использована для увеличения размера щита. +block.force-projector.description = Создает вокруг себя шестиугольное силовое поле, защищая здания и подразделения внутри от повреждений.\nПерегревается, если нанесено слишком большое количество повреждений. Опционально использует охлаждающую жидкость для предотвращения перегрева. Фазовая ткань может быть использована для увеличения размера щита. block.shock-mine.description = Наносит урон врагам, наступающим на мину. Почти невидима для врага. block.conveyor.description = Базовый элемент транспортного блока. Перемещает предметы вперед и автоматически складывает их в блоки. Можно повернуть. -block.titanium-conveyor.description = Расширенный транспортный блок. Перемещает предметы быстрее, чем стандартные конвейеры. -block.junction.description = Действует как мост для двух пересекающихся конвейерных лент. Полезно в ситуациях, когда два разных конвейера перевозят разные материалы в разные места. -block.bridge-conveyor.description = Улучшенный транспортный блок. Позволяет транспортировать предметы по 3 плиткам любой местности или здания. -block.phase-conveyor.description = Улучшенный транспортный блок. Использует энергию для телепортации предметов на подключенный фазовый конвейер по нескольким плиткам. +block.titanium-conveyor.description = Улучшенный транспортный блок. Перемещает предметы быстрее, чем стандартные конвейеры. +block.junction.description = Действует как мост для двух пересекающихся конвейерных лент. Полезен в ситуациях, когда два разных конвейера перевозят разные материалы в разные места. +block.bridge-conveyor.description = Улучшенный транспортный блок. Позволяет транспортировать предметы над 3 плитками любой местности или здания. +block.phase-conveyor.description = Улучшенный транспортный блок. Использует энергию для телепортации предметов на подключенный фазовый конвейер над несколькими плитками. block.sorter.description = Сортирует предметы. Если предмет соответствует выбору, он может пройти. В противном случае предмет выводится слева и справа. block.inverted-sorter.description = Работает с предметами так же, как и стандартный сортировщик, но выводит выбранный предмет по бокам, а не прямо. -block.router.description = Принимает предмет в одном направлении и выводит их до 3 других направлений в равной степени. Полезно для разделения материалов из одного источника на несколько целей.\n\n[scarlet]Никогда не используйте рядом с заводами и т.п., так как маршрутизатор будет забит выходными предметами.[] -block.distributor.description = Расширенный маршрутизатор. Разделение элементов до 7 других направлений в равной степени. -block.overflow-gate.description = Выводит только влево и вправо, если передний путь заблокирован. -block.mass-driver.description = Конечный транспортный блок. Собирает несколько предметов и затем стреляет ими в другую катапульту на большом расстоянии. Требуется энергия для работы. +block.router.description = Принимает предмет в одном направлении и выводит их до 3 других направлений в равной степени. Полезен для разделения материалов из одного источника на несколько целей.\n\n[scarlet]Никогда не используйте рядом с заводами и т.п., так как маршрутизатор будет забит выходными предметами.[] +block.distributor.description = Расширенный маршрутизатор. Разделяет предметы до 7 других направлений в равной степени. +block.overflow-gate.description = Выводит предметы влево и вправо, только если передний путь заблокирован. +block.mass-driver.description = Самый продвинутый транспортного блока. Собирает несколько предметов и затем стреляет ими в другую катапульту на большом расстоянии. Требуется энергия для работы. block.mechanical-pump.description = Дешёвый насос с низкой производительностью, но без энергопотребления. block.rotary-pump.description = Продвинутый насос. Качает больше жидкости, но требуют энергию. block.thermal-pump.description = Наилучший насос. block.conduit.description = Основной блок транспортировки жидкости. Перемещает жидкости вперед. Используется совместно с насосами и другими трубопроводами. -block.pulse-conduit.description = Расширенный блок транспортировки жидкости. Транспортирует жидкости быстрее и хранит больше, чем стандартные трубопроводы. -block.liquid-router.description = Принимает жидкости из одного направления и выводит их до 3 других направлений в равной степени. Можно также хранить определенное количество жидкости. Полезно для разделения жидкостей из одного источника на несколько целей. +block.pulse-conduit.description = Улучшенный блок транспортировки жидкости. Транспортирует жидкости быстрее и хранит больше, чем стандартные трубопроводы. +block.plated-conduit.description = Перемещает жидкости с той же скоростью, что и импульсные трубопроводы, но обладает большей прочностью. Не принимает жидкости со сторон, кроме как от других трубопроводов.\nПротекает меньше. +block.liquid-router.description = Принимает жидкости из одного направления и выводит их до 3 других направлений в равной степени. Также может хранить определенное количество жидкости. Полезен для разделения жидкостей из одного источника на несколько целей. block.liquid-tank.description = Хранит большое количество жидкости. Используется для создания буферов в ситуациях с непостоянной потребностью в материалах или в качестве защиты для охлаждения жизненно важных блоков. -block.liquid-junction.description = Действует как мост для двух пересекающихся каналов. Полезно в ситуациях, когда два разных трубопровода переносят разные жидкости в разные места. +block.liquid-junction.description = Действует как мост для двух пересекающихся каналов. Полезен в ситуациях, когда два разных трубопровода переносят разные жидкости в разные места. block.bridge-conduit.description = Расширенный блок транспортировки жидкости. Позволяет транспортировать жидкости над 3 плитками любой местности или здания. block.phase-conduit.description = Расширенный блок транспортировки жидкости. Использует энергию для телепортации жидкостей в подключенный фазовый канал над несколькими плиткам. block.power-node.description = Передает питание на подключенные узлы. Узел будет получать питание или поставлять питание на любые соседние блоки. -block.power-node-large.description = Усовершенствованный силовой узел с большей дальностью и большим количеством соединений. +block.power-node-large.description = Усовершенствованный силовой узел с большей дальностью. block.surge-tower.description = Силовой узел с очень большим радиусом действия, но меньшим количеством доступных соединений. -block.diode.description = Питание от батареи может проходить через этот блок только в одном направлении, но только если на другой стороне накоплено меньше энергии. +block.diode.description = Энергия из аккумуляторов имеет возможность перемещаться через этот блок в одну сторону, если на выходе имеется меньше энергии в запасе, чем на входе. block.battery.description = Накапливает энергию как буфер во времена избытка энергии. Выводит энергию во времена дефицита. -block.battery-large.description = Хранит гораздо больше энергии, чем обычная батарея. +block.battery-large.description = Хранит гораздо больше энергии, чем обычный аккумулятор. block.combustion-generator.description = Вырабатывает энергию путём сжигания легковоспламеняющихся материалов, таких как уголь. block.thermal-generator.description = Генерирует энергию, когда находится в горячих местах. block.turbine-generator.description = Усовершенствованный генератор сгорания. Более эффективен, но дополнительно требует воду для выработки пара. @@ -1118,28 +1183,28 @@ block.rtg-generator.description = Простой, надежный генера block.solar-panel.description = Обеспечивает небольшое количество энергии от солнца. block.solar-panel-large.description = Значительно более эффективный вариант стандартной солнечной панели. block.thorium-reactor.description = Генерирует значительное количество энергии из тория. Требует постоянного охлаждения. Взорвётся с большой силой при недостаточном количестве охлаждающей жидкости. Выходная энергия зависит от наполненности, при этом базовая энергия генерируется на полную мощность. -block.impact-reactor.description = Усовершенствованный генератор, способный создавать огромное количество энергии с максимальной эффективностью. Требуется значительное количество энергии для запуска процесса. -block.mechanical-drill.description = Дешёвый бур. При размещении на соответствующих плитках, предметы бесконечно выводятся в медленном темпе. Способен добывать только медь, свинец и уголь. +block.impact-reactor.description = Усовершенствованный генератор, способный создавать огромное количество энергии на пике эффективности. Требуется значительное количество энергии для запуска процесса. +block.mechanical-drill.description = Дешёвый бур. При размещении на соответствующих плитках, предметы бесконечно выводятся в медленном темпе. Способен добывать только базовые ресурсы. block.pneumatic-drill.description = Улучшенный бур, способный добывать титан. Добывает быстрее, чем механический бур. block.laser-drill.description = Позволяет сверлить еще быстрее с помощью лазерной технологии, но требует энергии. Способен добывать торий. -block.blast-drill.description = Конечный бур. Требует большое количества энергии. +block.blast-drill.description = Самый продвинутый бура. Требует большое количества энергии. block.water-extractor.description = Выкачивает подземные воды. Используется в местах, где нет поверхностных вод. block.cultivator.description = Выращивает крошечные концентрации спор в атмосфере в готовые к использованию споры. block.oil-extractor.description = Использует большое количество энергии, песка и воды для бурения, добывая нефть. -block.core-shard.description = Первая итерация капсулы ядра. После уничтожения весь контакт с регионом теряется. Не позволяйте этому случиться. +block.core-shard.description = Первая итерация капсулы ядра. После уничтожения, весь контакт с регионом теряется. Не позволяйте этому случиться. 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 = Маленькая, дешёвая турель. Полезна против наземных юнитов. block.scatter.description = Основная противовоздушная турель. Распыляет куски свинца или металлолома на вражеские подразделения. -block.scorch.description = Сжигает любых наземных врагов рядом с ним. Высокоэффективна на близком расстоянии. +block.scorch.description = Сжигает любых наземных врагов рядом с ним. Высокоэффективен на близком расстоянии. block.hail.description = Маленькая дальнобойная артиллерийская турель. block.wave.description = Турель среднего размера. Стреляет потоками жидкости по врагам. Автоматически тушит пожары при подаче воды. -block.lancer.description = Лазерная турель среднего размера. Заряжает и стреляет мощными лучами энергии. +block.lancer.description = Лазерная турель среднего размера. Заряжает и стреляет мощными лучами энергии по наземным целям. block.arc.description = Небольшая электрическая турель ближнего радиуса действия. Выстреливает дуги электричества по врагам. block.swarmer.description = Ракетная турель среднего размера. Атакует как воздушных, так и наземных врагов. Запускает самонаводящиеся ракеты. block.salvo.description = Большая, более продвинутая версия двойной турели. Выпускает быстрые залпы из пуль по врагу. @@ -1149,21 +1214,21 @@ block.cyclone.description = Большая противовоздушная и block.spectre.description = Массивная двуствольная пушка. Стреляет крупными бронебойными пулями по воздушным и наземным целям. block.meltdown.description = Массивная лазерная пушка. Заряжает и стреляет постоянным лазерным лучом в ближайших врагов. Требуется охлаждающая жидкость для работы. block.command-center.description = Командует перемещениями боевых единиц по всей карте.\nУказывает подразделениям [accent]собираться[] вокруг командного центра, [accent]атаковать[] вражеское ядро или [accent]отступать[] к ядру/фабрике. Если вражеское ядро отсутствует, единицы будут патрулировать при команде [accent]атаки[]. -block.draug-factory.description = Производит добывающих дронов. -block.spirit-factory.description = Производит дронов, которые ремонтируют постройки. +block.draug-factory.description = Производит добывающих дронов «Драугр». +block.spirit-factory.description = Производит дронов «Дух», которые ремонтируют постройки. block.phantom-factory.description = Производит улучшенных дронов, которые помогают в строительстве. block.wraith-factory.description = Производит быстрые и летающие боевые единицы. -block.ghoul-factory.description = Производит тяжёлых ковровых бомбардировщиков. -block.revenant-factory.description = Производит тяжёлые летающие боевые единицы. -block.dagger-factory.description = Производит основных наземных боевые единиц. -block.crawler-factory.description = Производит быстрых саморозрушающихся боевые единиц. +block.ghoul-factory.description = Производит тяжёлые ковровые бомбардировщики. +block.revenant-factory.description = Производит тяжёлые летающие боевые единицы, вооружённые ракетами. +block.dagger-factory.description = Производит основные наземные боевые единицы. +block.crawler-factory.description = Производит быстрые саморазрушающиеся боевые единицы. block.titan-factory.description = Производит продвинутые бронированные боевые единицы. block.fortress-factory.description = Производит тяжёлые артиллерийские боевые единицы. -block.repair-point.description = Непрерывно лечит ближайший поврежденную боевую единицу или мех, находящийся рядом. -block.dart-mech-pad.description = Обеспечивает превращение в базовый атакующий мех. \nИспользуйте, нажав, стоя на нём. +block.repair-point.description = Непрерывно лечит ближайшую поврежденную боевую единицу или мех в своём радиусе. +block.dart-mech-pad.description = Обеспечивает превращение в базовый атакующий мех.\nИспользуйте, нажав, стоя на нём. block.delta-mech-pad.description = Обеспечивает превращение в легкобронированный атакующий мех.\nИспользуйте, нажав, стоя на нём. -block.tau-mech-pad.description = Обеспечивает превращение в улучшенный мех поддержки.\nИспользуйте, нажав, стоя на нём. +block.tau-mech-pad.description = Обеспечивает превращение в продвинутый мех поддержки.\nИспользуйте, нажав, стоя на нём. block.omega-mech-pad.description = Обеспечивает превращение в тяжелобронированный ракетный мех.\nИспользуйте, нажав, стоя на нём. block.javelin-ship-pad.description = Обеспечивает превращение в быстрый перехватчик в лёгкой броне.\nИспользуйте, нажав, стоя на нём. -block.trident-ship-pad.description = Обеспечивает превращение в тяжёлый бомбардировщик.\nИспользуйте, нажав, стоя на нём. +block.trident-ship-pad.description = Обеспечивает превращение в тяжёлый бомбардировщик поддержки.\nИспользуйте, нажав, стоя на нём. block.glaive-ship-pad.description = Обеспечивает превращение в большой, хорошо бронированный боевой корабль.\nИспользуйте, нажав, стоя на нём. diff --git a/core/assets/bundles/bundle_uk_UA.properties b/core/assets/bundles/bundle_uk_UA.properties index 660cf659dc..70f7985b78 100644 --- a/core/assets/bundles/bundle_uk_UA.properties +++ b/core/assets/bundles/bundle_uk_UA.properties @@ -10,6 +10,7 @@ link.dev-builds.description = Нестабільні версії link.trello.description = Офіційна дошка Trello для запланованих функцій link.itch.io.description = Itch.io сторінка, на якій можна завантажити гру link.google-play.description = Завантажити для Android з Google Play +link.f-droid.description = Перелік каталогу F-Droid link.wiki.description = Офіційна Mindustry wiki linkfail = Не вдалося відкрити посилання!\nURL-адреса скопійована в буфер обміну. screenshot = Зняток мапи збережено в {0} @@ -76,14 +77,23 @@ maps.browse = Перегляд мап continue = Продовжити maps.none = [lightgray]Мап не знайдено! invalid = Недійсне +pickcolor = Вибрати колір preparingconfig = Підготовка конфігурації preparingcontent = Підготовка вмісту uploadingcontent = Вивантаження вмісту uploadingpreviewfile = Вивантаження файлу передперегляду committingchanges = Здійснення змін done = Зроблено -feature.unsupported = Ваш пристрій не підтримує цю особливість. -mods.alphainfo = Майте на увазі, що модифікації знаходяться в альфі, і [scarlet]можуть бути дуже глючними[].\nПовідомте про будь-які проблеми, які ви знайдете до Mindustry GitHub або Discord. +mods = Модифікації +mods.alphainfo = Майте на увазі, що модифікації знаходяться в альфі, і [scarlet]може бути дуже глючними[].\nПовідомте про будь-які проблеми, які ви знайдете до Mindustry Github або Discord. +mods.alpha = [scarlet](Альфа) +mods.none = [LIGHT_GRAY]Модифікацій не знайдено! +mod.enabled = [lightgray]Увімкнено +mod.disabled = [scarlet]Вимкнено +mod.requiresrestart = А тепер гра закриється, щоб застосувати зміни модифікацій. +mod.import = Імпортувати модифікацію +mod.remove.confirm = Цю модифікацію буде видалено. +mod.author = [LIGHT_GRAY]Автор:[] {0} mods.alpha = [scarlet](Альфа) mods = Модифікації mods.none = [LIGHT_GRAY]Модифікацій не знайдено! @@ -94,6 +104,7 @@ mod.enabled = [lightgray]Увімкнено mod.disabled = [scarlet]Вимкнено mod.disable = Вимкнути mod.delete.error = Неможливо видалити модифікацію. Файл, можливо, використовується. +mod.requiresversion = [scarlet]Необхідна версія гри: [accent]{0} mod.missingdependencies = [scarlet]Відсутні залежності: {0} mod.nowdisabled = [scarlet]Модифікації «{0}» не вистачає залежних модифікацій:[accent] {1}\n[lightgray]Ці модифікації потрібно завантажити спочатку.\nЦя модифікація буде автоматично вимкнена. mod.enable = Увімкнути @@ -241,10 +252,10 @@ quit.confirm.tutorial = Ви впевнені, що хочете вийти з loading = [accent]Завантаження… reloading = [accent]Перезавантаження модифікацій… saving = [accent]Збереження… -cancelbuilding = [accent][[{0}][] to clear plan -selectschematic = [accent][[{0}][] to select+copy -pausebuilding = [accent][[{0}][] to pause building -resumebuilding = [scarlet][[{0}][] to resume building +cancelbuilding = [accent][[{0}][], щоб очистити план +selectschematic = [accent][[{0}][], щоб вибрати та скопіювати +pausebuilding = [accent][[{0}][], щоб призупинити будування +resumebuilding = [scarlet][[{0}][], щоб продовжити будування wave = [accent]Хвиля {0} wave.waiting = Хвиля через {0} wave.waveInProgress = [lightgray]Хвиля триває @@ -415,9 +426,9 @@ abandon = Покинути abandon.text = Ця зона і всі її ресурси будуть втрачені. locked = Заблоковано complete = [lightgray]Досягнута: -requirement.wave = Reach Wave {0} in {1} -requirement.core = Destroy Enemy Core in {0} -requirement.unlock = Unlock {0} +requirement.wave = Досягніть хвилі {0} у {1} +requirement.core = Знишьте вороже ядро у {0} +requirement.unlock = Розблокуйте {0} resume = Відновити зону:\n[lightgray]{0} bestwave = [lightgray]Найкраща хвиля: {0} launch = < ЗАПУСК > @@ -428,8 +439,8 @@ launch.confirm = Це видалить всі ресурси у Вашому я launch.skip.confirm = Якщо Ви пропустите зараз, Ви не зможете не запускати до більш пізніх хвиль. uncover = Розкрити configure = Вивантажити конфігурацію -bannedblocks = Banned Blocks -addall = Add All +bannedblocks = Заборонені блоки +addall = Додати все configure.locked = [lightgray]Можливість розблокувати вивантаження ресурсів буде доступна на {0}-тій хвилі. configure.invalid = Кількість повинна бути числом між 0 та {0}. zone.unlocked = Зона «[lightgray]{0}» тепер розблокована. @@ -483,6 +494,7 @@ settings.language = Мова settings.data = Ігрові дані settings.reset = Скинути за замовчуванням settings.rebind = Зміна +settings.resetKey = Скинути settings.controls = Керування settings.game = Гра settings.sound = Звук @@ -491,8 +503,8 @@ settings.cleardata = Очистити дані… settings.clear.confirm = Ви впевнені, що хочете очистити ці дані?\nЦя дія не може бути скасовано! settings.clearall.confirm = [scarlet]УВАГА![]\nЦе очистить всі дані, включаючи збереження, мапи, розблоковане та налаштування керування.\nПісля того, як ви натиснете ОК, гра видалить усі дані та автоматично закриється. paused = Пауза -clear = Clear -banned = [scarlet]Banned +clear = Очистити +banned = [scarlet]Заблоковано yes = Так no = Ні info.title = Інформація @@ -548,6 +560,8 @@ bar.heat = Нагрівання bar.power = Енергія bar.progress = Хід будування bar.spawned = Бойов. од.: {0}/{1} +bar.input = Ввід +bar.output = Вивід bullet.damage = [stat]{0}[lightgray] шкода bullet.splashdamage = [stat]{0}[lightgray] шкода по ділянці ~[stat] {1}[lightgray] блок. bullet.incendiary = [stat]запальний @@ -563,6 +577,8 @@ unit.blocks = блоки unit.powersecond = одиниць енергії за секунду unit.liquidsecond = одиниць рідини за секунду unit.itemssecond = предметів за секунду +unit.thousands = тис +unit.millions = млн unit.liquidunits = одиниць рідини unit.powerunits = одиниць енергії unit.degrees = град. @@ -582,7 +598,8 @@ setting.landscape.name = Тільки альбомний(гозинтальни setting.shadows.name = Тіні setting.blockreplace.name = Пропозиції щодо автоматичної заміни блоків setting.linear.name = Лінійна фільтрація -setting.hints.name = Hints +setting.hints.name = Підказки +setting.buildautopause.name = Автоматичне призупинення будування setting.animatedwater.name = Анімована вода setting.animatedshields.name = Анімовані щити setting.antialias.name = Згладжування[lightgray] (потребує перезапуску)[] @@ -604,16 +621,19 @@ setting.difficulty.name = Складність: setting.screenshake.name = Тряска екрану setting.effects.name = Ефекти setting.destroyedblocks.name = Показувати зруйновані блоки -setting.conveyorpathfinding.name = Пошук шляху для встановлення конвейерівConveyor Placement Pathfinding +setting.conveyorpathfinding.name = Пошук шляху для встановлення конвейерів setting.sensitivity.name = Чутливість контролера setting.saveinterval.name = Інтервал збереження setting.seconds = {0} с +setting.blockselecttimeout.name = Час вибору блока +setting.milliseconds = {0} мілісекунд setting.fullscreen.name = Повноекранний режим setting.borderlesswindow.name = Вікно без полів[lightgray] (може потребувати перезапуску) setting.fps.name = Показувати FPS і затримку до сервера +setting.blockselectkeys.name = Показувати клавіші вибору блока setting.vsync.name = Вертикальна синхронізація setting.pixelate.name = Пікселізація[lightgray] (вимикає анімації) -setting.minimap.name = Показувати міні-мапу +setting.minimap.name = Показувати мінімапу setting.position.name = Показувати координати гравця setting.musicvol.name = Гучність музики setting.ambientvol.name = Звуки навколишнього середовища @@ -624,10 +644,10 @@ setting.crashreport.name = Відсилати анонімні звіти про setting.savecreate.name = Автоматичне створення збережень setting.publichost.name = Загальнодоступність гри setting.chatopacity.name = Непрозорість чату -setting.lasersopacity.name = Power Laser Opacity +setting.lasersopacity.name = Непрозорість лазерів енергопостачання setting.playerchat.name = Відображати хмару чата над гравцями -public.confirm = Ви хочете зробити цю гру загальнодоступною?\n[lightgray]Це можна змінити у Налаштування->Гра->Public Game Visibility. -public.beta = Note that beta versions of the game cannot make public lobbies. +public.confirm = Ви хочете зробити цю гру загальнодоступною?\n[lightgray]Це можна змінити у Налаштування→Гра→Загальнодоступність гри +public.beta = Зауважте, що в бета-версії гри ви не можете робити публічні ігри. uiscale.reset = Масштаб користувальницького інтерфейсу було змінено.\nНатисніть «ОК» для підтверждення цього масшатабу.\n[scarlet]Повернення налаштувань і вихід через[accent] {0}[] … uiscale.cancel = Скасувати & Вийти setting.bloom.name = Світіння @@ -639,17 +659,37 @@ category.multiplayer.name = Мережева гра command.attack = Атакувати command.rally = Точка збору command.retreat = Відступити +placement.blockselectkeys = \n[lightgray]Ключ: [{0}, keybind.clear_building.name = Очистити план будування keybind.press = Натисніть клавішу… keybind.press.axis = Натисніть клавішу… keybind.screenshot.name = Зняток мапи +keybind.toggle_power_lines.name = Показувати лазери енергопостачання keybind.move_x.name = Рух по осі X keybind.move_y.name = Рух по осі Y +keybind.mouse_move.name = Слідкувати за мишею +keybind.dash.name = Прискорення keybind.schematic_select.name = Вибрати ділянку keybind.schematic_menu.name = Меню схем keybind.schematic_flip_x.name = Відобразити по осі X keybind.schematic_flip_y.name = Відобразити по осі Y -keybind.fullscreen.name = Повноекранний +keybind.category_prev.name = Попередня категорія +keybind.category_next.name = Наступна категорія +keybind.block_select_left.name = Вибрати блок ліворуч +keybind.block_select_right.name = Вибрати блок ліворуч праворуч +keybind.block_select_up.name = Вибрати блок зверху +keybind.block_select_down.name = Вибрати блок знизу +keybind.block_select_01.name = Категорія/Вибрати перший блок +keybind.block_select_02.name = Категорія/Вибрати другий блок +keybind.block_select_03.name = Категорія/Вибрати третій блок +keybind.block_select_04.name = Категорія/Вибрати четвертий блок +keybind.block_select_05.name = Категорія/Вибрати п’ятий блок +keybind.block_select_06.name = Категорія/Вибрати шостий блок +keybind.block_select_07.name = Категорія/Вибрати сьомий блок +keybind.block_select_08.name = Категорія/Вибрати восьмий блок +keybind.block_select_09.name = Категорія/Вибрати дев’ятий блок +keybind.block_select_10.name = Категорія/Вибрати десятий блок +keybind.fullscreen.name = Повноекранний режим keybind.select.name = Вибір/Постріл keybind.diagonal_placement.name = Діагональне розміщення keybind.pick.name = Вибрати блок @@ -662,7 +702,6 @@ keybind.menu.name = Меню keybind.pause.name = Пауза keybind.pause_building.name = Призупинити/Продовжити будування keybind.minimap.name = Мінімапа -keybind.dash.name = Прискоритися & летіітати keybind.chat.name = Чат keybind.player_list.name = Список гравців keybind.console.name = Консоль @@ -686,6 +725,7 @@ mode.attack.name = Атака mode.attack.description = Зруйнуйте ворожу базу.\n[gray]Потрібно червоне ядро на мапі для гри. mode.custom = Користувацькі правила rules.infiniteresources = Нескінченні ресурси +rules.reactorexplosions = Вибухи реактора rules.wavetimer = Таймер хвиль rules.waves = Хвилі rules.attack = Режим атаки @@ -711,6 +751,9 @@ rules.title.resourcesbuilding = Ресурси & будування rules.title.player = Гравці rules.title.enemy = Вороги rules.title.unit = Бойов. од. +rules.title.experimental = Есперементальне! +rules.lighting = Світлотінь +rules.ambientlight = Навколишнє світло content.item.name = Предмети content.liquid.name = Рідини content.unit.name = Бойові одиниці @@ -723,7 +766,7 @@ item.graphite.name = Графіт item.titanium.name = Титан item.thorium.name = Торій item.silicon.name = Кремній -item.plastanium.name = Пластиній +item.plastanium.name = Пластаній item.phase-fabric.name = Фазова тканина item.surge-alloy.name = Кінетичний сплав item.spore-pod.name = Споровий стручок @@ -757,6 +800,7 @@ mech.trident-ship.name = Тризубець mech.trident-ship.weapon = Бомби mech.glaive-ship.name = Спис mech.glaive-ship.weapon = Вогняний кулемет +item.corestorable = [lightgray]Зберігання в ядрі: {0} item.explosiveness = [lightgray]Вибухонебезпечність: {0}% item.flammability = [lightgray]Вогненебезпечність: {0}% item.radioactivity = [lightgray]Радіоактивність: {0}% @@ -868,8 +912,10 @@ block.junction.name = Перехрестя block.router.name = Маршрутизатор block.distributor.name = Розподілювач block.sorter.name = Сортувальник -block.inverted-sorter.name = Inverted Sorter +block.inverted-sorter.name = Зворотній сортувальник block.message.name = Повідомлення +block.illuminator.name = Освітлювач +block.illuminator.description = Невелике, компактне, джерело світла, яку можна налаштувати. Для функціонування потрібна енергія. block.overflow-gate.name = Надмірний затвор block.silicon-smelter.name = Кремнієвий плавильний завод block.phase-weaver.name = Фазовий ткач @@ -883,6 +929,7 @@ block.coal-centrifuge.name = Вугільна центрифуга block.power-node.name = Енергійний вузол block.power-node-large.name = Великий енергетичний вузол block.surge-tower.name = Кінетична вежа +block.diode.name = Діод block.battery.name = Акумулятор block.battery-large.name = Великий акумулятор block.combustion-generator.name = Генератор горіння @@ -935,6 +982,7 @@ block.fortress-factory.name = Завод мехів «Фортеця» block.revenant-factory.name = Завод бомбардувальників «Потойбічний вбивця» block.repair-point.name = Ремонтний пункт block.pulse-conduit.name = Імпульсний водопровід +block.plated-conduit.name = Зміцнений водопровід block.phase-conduit.name = Фазовий водопровід block.liquid-router.name = Рідкий маршрутизатор block.liquid-tank.name = Рідкий резервуар @@ -988,8 +1036,8 @@ unit.reaper.name = Жнець tutorial.next = [lightgray]<Натисніть для продовження> tutorial.intro = Ви розпочали[scarlet] навчання по Mindustry.[]\nРозпочніть з[accent] видобування міді[]. Використовуйте [[WASD] для руху.\n[accent] Утримуйте [[Ctrl] під час прокрутки миші[] для приближення і віддалення. Наблизьтесь, а потім натисність на мідну жилу біля вашого ядра, щоб зробити це.\n\n[accent]{0}/{1} міді tutorial.intro.mobile = Ви розпочали[scarlet] навчання по Mindustry.[]\nПроведіть екраном, щоб рухатися.\n[accent] Зведіть або розведіть 2 пальця [] для приближення і віддалення відповідно.\nз[accent] видобування міді.[] Наблизьтесь, а потім натисність на мідну жилу біля вашого ядра, щоб зробити це.\n\n[accent]{0}/{1} міді -tutorial.drill = Добування вручну неефективне.\n[accent]Бури []можуть добувати автоматично.\nНатисніть на вкладку свердла знизу зправа.\nВиберіть[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.drill = Добування вручну неефективне.\n[accent]Бури []можуть добувати автоматично.\nНатисніть на вкладку свердла знизу зправа.\nВиберіть[accent] механічний бур[]. Розмістіть його на мідній жилі натисканням.\nВи також можете вибрати бур, натиснувши [accent][[2][], а потім натиснути [accent][[1][] швидко, незалежно від того, яка вкладка відкрита.\n[accent]Натисніть ПКМ[], щоб зупинити будування.tutorial.drill.mobile = Добування вручну неефективне.\n[accent]Бури []можуть добувати автоматично.\nНатисність на вкладку сведла знизу зправа.\nВиберіть[accent] механічний бур[]. Розмістіть його на мідній жилі натисканням, потім натисність на [accent] галочку[] нижче, щоб підтвердити розміщення .\nНатисніть[accent] клавішу X[], щоб скасувати розміщення. +tutorial.drill.mobile = Добування вручну неефективне.\n[accent]Бури []можуть добувати автоматично.\nНатисність на вкладку сведла знизу зправа.\nВиберіть[accent] механічний бур[]. Розмістіть його на мідній жилі натисканням, потім натисність на [accent] галочку[] нижче, щоб підтвердити розміщення.\nPress the[accent] X button[] to cancel placement. tutorial.blockinfo = Кожен блок має різні характеристики. Кожний бур може видобувати тільки певні руди.\nЩоб переглянути інформацію та характеристики блока,[accent] натисність на кнопку «?», коли Ви вибрали блок у меню будування.[]\n\n[accent]Перегляньте характеристику Механічного бура прямо зараз.[] tutorial.conveyor = [accent]Конвеєри[] використовуються для транспортування предметів до ядра.\nЗробіть лінію конвеєрів від бура до ядра.\n[accent]Утримуйте миш, щоб розмістити у лінію.[]\nУтримуйте[accent] CTRL[] під час вибору лінії для розміщення по діагоналі.\n\n[accent]{0}/{1} конвеєрів, які розміщені в лінію\n[accent]0/1 предмет доставлено tutorial.conveyor.mobile = [accent]Конвеєри[] використовується для транспортування предметів до ядра.\nЗробіть лінію конвеєрів від бура до ядра.\n[accent] Розмістить у лінію, утримуючи палець кілька секунд[] і тягніть у напрямку, який Ви вибрали.\nВикористовуйте колесо прокрутки, щоб обертати блоки перед їх розміщенням\n[accent]{0}/{1} конвеєрів, які розміщені в лінію\n[accent]0/1 предмет доставлено @@ -1030,7 +1078,7 @@ mech.alpha-mech.description = Стандартний керований мех. mech.delta-mech.description = Швидкий, легкоброньований мех, зроблений для тактики «атакуй і біжи». Наносить мало шкоди будівлям, але може дуже швидко вбити великі групи підрозділів противника своєю дуговою блискавкою. mech.tau-mech.description = Мех підтримки. Ремонтує союзні блоки, стріляючи по них. Може зцілювати союзників у радіусі його ремонтної здатності. mech.omega-mech.description = Об’ємний і добре броньований мех, зроблений для фронтових штурмів. Його броня може перекрити до 90% пошкоджень, що надходять. -mech.dart-ship.description = Стандартний корабель управління. Розумно швидкий і легкий, але має мало наступальних можливостей і низьку швидкість видобутку. +mech.dart-ship.description = Стандартний корабель управління. Швидко видобуває ресурси. Достатньо швидкий і легкий, але має мало наступальних можливостей. mech.javelin-ship.description = Корабель для стратегії атакуй та біжи». Хоча спочатку він повільний, потім вже може розганятися до великих швидкостей і літати над ворожими форпостами, завдаючи великої кількості шкоди своїми блискавками та ракетами. mech.trident-ship.description = Важкий бомбардувальник, побудований для будування та знищення ворожих укріплень. Дуже добре броньований. mech.glaive-ship.description = Великий, добре броньований бойовий корабель. Оснащений запальним ретранслятором. Високо маневрений. @@ -1050,7 +1098,7 @@ block.graphite-press.description = Стискає шматки вугілля в block.multi-press.description = Модернізована версія графітового преса. Використовує воду та енергію для швидкої та ефективної переробки вугілля. block.silicon-smelter.description = Змішує пісок з чистим вугіллям. Виробляє кремній. block.kiln.description = Виплавляє пісок та свинець у сполуку, відому як метаскло. Для запуску потрібна невелика кількість енергії. -block.plastanium-compressor.description = Виробляє пластиній з нафти і титану. +block.plastanium-compressor.description = Виробляє пластаній з нафти і титану. block.phase-weaver.description = Синтезує фазову тканину з радіоактивного торію та піску. Для функціонування потрібна велика кількість енергії. block.alloy-smelter.description = Поєднує титан, свинець, кремній і мідь для отримання кінетичного сплаву. block.cryofluidmixer.description = Змішує воду і дрібний порошок титану титану в кріогенну рідину. Основне використання у торієвому реактору. @@ -1095,13 +1143,14 @@ block.sorter.description = Сортує предмети. Якщо елемен block.inverted-sorter.description = Обробляє елементи, як звичайний сортувальник, але виводить обрані елементи на сторони. block.router.description = Приймає елементи з одного напрямку та виводить їх до трьох інших напрямків порівну. Корисно для поділу матеріалів від одного джерела до кількох цілей.\n\n[scarlet]Ніколи не використовуйте поруч із входами до механізмів, оскільки вони будуть забиті вихідними предметами.[] block.distributor.description = Розширений маршрутизатор. Розділяє предмети до 7 інших напрямків порівну. -block.overflow-gate.description = Комбінований розгалужувач і маршрутизатор. Виходи лише вліво і вправо, якщо передній шлях заблокований. +block.overflow-gate.description = Виходи лише вліво і вправо, якщо передній шлях заблокований. block.mass-driver.description = Кінцевий елемент транспортного блоку. Збирає кілька предметів, а потім вистрілює їх до іншої електромагнитної катапульти на великій відстані. Для роботи потрібна енергія. block.mechanical-pump.description = Недорогий насос з повільним виходом, але без енергоспоживання. block.rotary-pump.description = Удосконалений насос. Насоси більше викачують, але потребують енергію. block.thermal-pump.description = Найкращий насос. block.conduit.description = Основний блок транспортування рідини. Пересуває рідини вперед. Застосовується спільно з насосами та іншими трубопроводами. block.pulse-conduit.description = Вдосконалений блок транспортування рідини. Транспортує рідини швидше і зберігає більше, ніж стандартні трубопроводи. +block.plated-conduit.description =Переміщує рідини з тією ж швидкістю, як і імпульсні трубопроводи, але має більше міцності. Не приймає рідин з боків окрім інших трубопроводів.\nПротікає менше. block.liquid-router.description = Приймає рідини з одного напрямку та виводить їх до трьох інших напрямків порівну. Також можна зберігати певну кількість рідини. Корисно для розщеплення рідин від одного джерела до кількох мішеней. block.liquid-tank.description = Зберігає велику кількість рідини. Використовуйте для створення буферів у ситуаціях з непостійним попитом на матеріали або як гарантію охолодження життєво важливих блоків. block.liquid-junction.description = Діє як міст для двох каналів перетину. Корисно в ситуаціях, коли два різні трубопроводи перевозять різні рідини в різні місця. @@ -1110,6 +1159,7 @@ block.phase-conduit.description = Розширений блок транспор block.power-node.description = Передає живлення на підключені вузли. Вузол буде отримувати живлення від будь-яких сусідніх блоків або подавати живлення до них. block.power-node-large.description = Удосконалений вузол живлення з більшим діапазоном. block.surge-tower.description = Надзвичайно дальний вузол живлення з меншою кількістю доступних з’єднань. +block.diode.description = Живлення акумулятора може протікати через цей блок лише в одному напрямку, але лише в тому випадку, якщо інша сторона має менше енергії. block.battery.description = Зберігає енергію як буфер в часи надлишкової енергії. Виводить енергію у періоди дефіциту. block.battery-large.description = Зберігає набагато більше енергії, ніж звичайний акумулятор. block.combustion-generator.description = Виробляє енергію, спалюючи легкозаймисті матеріали, такі як вугілля. diff --git a/core/assets/bundles/bundle_zh_CN.properties b/core/assets/bundles/bundle_zh_CN.properties index 25834625fa..b2ae9cdc24 100644 --- a/core/assets/bundles/bundle_zh_CN.properties +++ b/core/assets/bundles/bundle_zh_CN.properties @@ -10,6 +10,7 @@ link.dev-builds.description = 不稳定的开发版本 link.trello.description = 官方列于 Trello 的功能计划表 link.itch.io.description = itch.io 上的 PC 版下载 link.google-play.description = Google Play 页面 +link.f-droid.description = F-Droid 页面 link.wiki.description = Mindustry 官方 Wiki linkfail = 打开链接失败!\n网址已复制到您的剪贴板。 screenshot = 屏幕截图已保存到 {0} @@ -46,20 +47,20 @@ schematic.info = {0}x{1},{2} 个方块 stat.wave = 防守波数:[accent]{0} stat.enemiesDestroyed = 消灭敌人:[accent]{0} stat.built = 建造建筑:[accent]{0} -stat.destroyed = 摧毁建筑:[accent]{0} +stat.destroyed = 被毁建筑:[accent]{0} stat.deconstructed = 拆除建筑:[accent]{0} -stat.delivered = 运走资源: +stat.delivered = 装运资源: stat.rank = 最终评级:[accent]{0} launcheditems = [accent]装运的资源 -launchinfo = [unlaunched][[LAUNCH] 你的核心将获得用蓝色标识出的资源。 +launchinfo = [unlaunched]发射你的核心后,你将获得用蓝字标识的资源。 map.delete = 确定要删除“[accent]{0}[]”地图吗? level.highscore = 最高分:[accent]{0} level.select = 选择关卡 level.mode = 游戏模式: showagain = 下次不再显示 coreattack = < 核心正在受到攻击!> -nearpoint = [[ [scarlet]立即离开敌人出生点[] ]\n即将被摧毁 +nearpoint = [[ [scarlet]立即离开敌人出生点[] ]\n摧毁在即 database = 核心数据库 savegame = 保存游戏 loadgame = 载入游戏 @@ -98,6 +99,7 @@ mod.enabled = [lightgray]已启用 mod.disabled = [scarlet]已禁用 mod.disable = 禁用 mod.delete.error = 无法删除模组。可能文件被占用。 +mod.requiresversion = [scarlet]所需的游戏版本:[accent]{0} mod.missingdependencies = [scarlet]缺少依赖条件:{0} mod.nowdisabled = [scarlet]“{0}”模组缺少依赖条件:[accent] {1}\n[lightgray]需要先下载上述模组。\n此模组现在将自动禁用。 mod.enable = 启用 @@ -115,7 +117,7 @@ about.button = 关于 name = 名字: noname = 先取一个[accent]玩家名[]。 filename = 文件名: -unlocked = 新方块已解锁! +unlocked = 解锁了新内容! completed = [accent]己研究 techtree = 科技树 research.list = [lightgray]研究: @@ -263,8 +265,8 @@ builtin = 内建的 map.delete.confirm = 你确定你想要删除这张地图吗?这个操作无法撤销! map.random = [accent]随机地图 map.nospawn = 这个地图没有核心!请在编辑器中添加一个[ROYAL]己方[]的核心。 -map.nospawn.pvp = 这个地图没有敌人的核心!请在编辑器中添加一个[ROYAL]敌方[]的核心。 -map.nospawn.attack = 这个地图没有敌人的核心!请在编辑中向地图添加一个[SCARLET]敌方[]的核心。 +map.nospawn.pvp = 这个地图没有敌人的核心!请在编辑器中添加一个[ROYAL]敌人[]的核心。 +map.nospawn.attack = 这个地图没有敌人的核心!请在编辑中向地图添加一个[SCARLET]敌人[]的核心。 map.invalid = 地图载入错误:地图文件可能已经损坏。 workshop.update = 更新地图 workshop.error = 获取创意工坊详细信息时出错:{0} @@ -278,6 +280,7 @@ publishing = [accent]正在发布... publish.confirm = 确定发布?\n\n[lightgray]请确认您已经同意创意工坊的最终用户许可协议,否则您的项目不会展示! publish.error = 发布项目出错:{0} steam.error = 初始化 Steam 服务失败。\n错误:{0} + editor.brush = 笔刷 editor.openin = 在编辑器中打开 editor.oregen = 矿石的生成 @@ -440,7 +443,7 @@ addall = 添加所有 configure.locked = [lightgray]完成{0}\n解锁装运配置。 configure.invalid = 数量必须是0到{0}之间的数字。 zone.unlocked = [lightgray]{0} 已解锁。 -zone.requirement.complete = 完成{0}。\n达成解锁{1}的需求。 +zone.requirement.complete = 完成{0}。\n已达成解锁{1}的要求。 zone.config.unlocked = 资源装运已解锁:[lightgray]\n{0} zone.resources = 地图中的资源: zone.objective = [lightgray]目标:[accent]{0} @@ -448,6 +451,7 @@ zone.objective.survival = 生存 zone.objective.attack = 摧毁敌方核心 add = 添加… boss.health = BOSS 生命值 + connectfail = [crimson]服务器连接失败:[accent]{0} error.unreachable = 无法访问服务器。\n确定输对地址了吗? error.invalidaddress = 地址无效。 @@ -458,6 +462,7 @@ error.mapnotfound = 找不到地图文件! error.io = 网络 I/O 错误。 error.any = 未知网络错误。 error.bloom = 未能初始化特效。\n您的设备可能不支持。 + zone.groundZero.name = 零号地区 zone.desertWastes.name = 荒芜沙漠 zone.craters.name = 陨石带 @@ -467,22 +472,22 @@ zone.stainedMountains.name = 绵延群山 zone.desolateRift.name = 荒芜裂谷 zone.nuclearComplex.name = 核裂阵 zone.overgrowth.name = 增生区 -zone.tarFields.name = 石油田 +zone.tarFields.name = 油田 zone.saltFlats.name = 盐碱荒滩 zone.impact0078.name = 0078号冲击 zone.crags.name = 悬崖 zone.fungalPass.name = 真菌通道 zone.groundZero.description = 踏上旅程的最佳位置。这儿的敌人威胁很小,但资源也少。\n收集尽可能多的铅和铜。\n出发吧! -zone.frozenForest.description = 即使是靠近山脉的这里,孢子也已经扩散。他们不能长期停留在寒冷的温度中。\n\n开始运用电力。建造燃烧发电机并学会使用修理者。 -zone.desertWastes.description = 这里的废料规模庞大、难以预测,并与废弃的结构交织在一起。\n此地区有煤矿存在,燃烧它以获取动力或合成石墨。\n\n[lightgray]无法保证此着陆位置。 +zone.frozenForest.description = 即使是靠近山脉的这里,孢子也已经扩散。他们不能长期停留在寒冷的温度中。\n\n开始运用电力。建造火力发电机并学会使用修理者。 +zone.desertWastes.description = 这里的废料规模庞大、难以预测,并与废弃的结构交织在一起。\n此地区有煤矿存在,点燃它以获取动力,或者将其合成为石墨。\n\n[lightgray]无法保证此着陆位置。 zone.saltFlats.description = 在沙漠的郊区有盐滩。在这个地方几乎找不到资源。\n\n敌人在这里建立了一个资源存储区。摧毁他们的核心。不要留下任何东西。 zone.craters.description = 水在这个火山口积聚,这是旧战争的遗迹。夺下该区域。收集沙子来冶炼玻璃。用水泵抽水来加速炮塔和钻头。 zone.ruinousShores.description = 穿过荒地,就是海岸线。这个地方曾经建造了一个海岸防御线。但现在所剩无几,只有最基本的防御结构仍然毫发无损,其他一切都被摧毁了。\n继续向外扩展。继续研究科技。 -zone.stainedMountains.description = 在更远的内陆地区是山脉,但这里没有被孢子污染。\n在这一地区分布着丰富的钛,学习如何使用它。\n\n这里敌人的存在更大。不要给他们时间派出最强的部队。 +zone.stainedMountains.description = 在更远的内陆地区是山脉,但这里没有被孢子污染。\n这一地区分布着丰富的钛,学习如何使用它。\n\n这里的敌人势力更大,不要给他们时间派出最强的部队。 zone.overgrowth.description = 这个地区靠近孢子的来源,因此生长过度。\n敌人在这里建立了一个前哨站。建造尖刀单位来摧毁它并找回丢失的东西。 -zone.tarFields.description = 位于山脉和沙漠之间的产油区的郊区是少数几个有可用石油储量的地区之一。\n尽管被废弃,但附近仍有一些危险的敌军。不要低估他们。\n\n[lightgray]如果可能,研究石油加工技术。 -zone.desolateRift.description = 非常危险的区域。这儿资源丰富但空间小。敌人十分危险。尽快离开,不要被敌人的攻击间隔太长所愚弄。 +zone.tarFields.description = 产油区边缘,位于山脉和沙漠之间。它少数几个有石油储量的地区之一。\n尽管被废弃,这附近仍有一些危险的敌方单位。不要低估他们。\n\n[lightgray]如果可能,研究石油加工技术。 +zone.desolateRift.description = 非常危险的区域。这儿的资源丰富但空间很小。敌人十分危险。尽快离开,不要被敌人的攻击间隔太长所愚弄。 zone.nuclearComplex.description = 以前生产和加工钍的设施已变成废墟。\n[lightgray]研究钍及其多种用途。\n\n敌人在这里大量存在,不断消灭入侵者。 zone.fungalPass.description = 介于高山和低矮孢子丛生的土地之间的过渡地带。这里有一个小型的敌方侦察基地。\n侦察它。\n使用尖刀和爬行者单位来摧毁两个核心。 zone.impact0078.description = <描述空缺> @@ -523,7 +528,7 @@ blocks.size = 尺寸 blocks.liquidcapacity = 液体容量 blocks.powerrange = 能量范围 blocks.powerconnections = 最多连接 -blocks.poweruse = 能量使用 +blocks.poweruse = 使用能量 blocks.powerdamage = 功率/损伤 blocks.itemcapacity = 物品容量 blocks.basepowergeneration = 基础能源输出 @@ -542,6 +547,7 @@ blocks.inaccuracy = 误差 blocks.shots = 发射数 blocks.reload = 每秒发射数 blocks.ammo = 弹药 + bar.drilltierreq = 需要更好的钻头 bar.drillspeed = 挖掘速度:{0}/秒 bar.pumpspeed = 泵压速度:{0}/秒 @@ -550,7 +556,7 @@ bar.powerbalance = 能量:{0}/秒 bar.powerstored = 储能:{0}/{1} bar.poweramount = 能量:{0} bar.poweroutput = 能量输出:{0} -bar.items = 物体:{0} +bar.items = 物品:{0} bar.capacity = 容量:{0} bar.liquid = 液体 bar.heat = 热量 @@ -559,6 +565,7 @@ bar.progress = 制造进度 bar.spawned = 单位数量:{0}/{1} bar.input = 输入 bar.output = 输出 + bullet.damage = [stat]{0}[lightgray] 伤害 bullet.splashdamage = [stat]{0}[lightgray] 范围伤害 ~[stat] {1}[lightgray] 格 bullet.incendiary = [stat] 燃烧 @@ -570,16 +577,17 @@ bullet.freezing = [stat] 冰冻 bullet.tarred = [stat] 减速 bullet.multiplier = [stat]{0}[lightgray]x 弹药数量 bullet.reload = [stat]{0}[lightgray]x 装弹 + unit.blocks = 方块 -unit.powersecond = 能量单位/秒 -unit.liquidsecond = 液体单位/秒 +unit.powersecond = 能量/秒 +unit.liquidsecond = 液体/秒 unit.itemssecond = 物品/秒 -unit.liquidunits = 液体单位 -unit.powerunits = 能量单位 +unit.liquidunits = 液体 +unit.powerunits = 能量 unit.degrees = 度 unit.seconds = 秒 unit.persecond = /秒 -unit.timesspeed = x 速度 +unit.timesspeed = 倍 速度 unit.percent = % unit.items = 物品 category.general = 普通 @@ -620,9 +628,12 @@ setting.conveyorpathfinding.name = 传送带放置寻路 setting.sensitivity.name = 控制器灵敏度 setting.saveinterval.name = 自动保存间隔 setting.seconds = {0} 秒 +setting.blockselecttimeout.name = 块选择超时 +setting.milliseconds = {0} 毫秒 setting.fullscreen.name = 全屏 setting.borderlesswindow.name = 无边框窗口[lightgray](可能需要重启) -setting.fps.name = 显示 FPS +setting.fps.name = 显示 FPS 和网络延迟 +setting.blockselectkeys.name = 显示块选择按键 setting.vsync.name = 垂直同步 setting.pixelate.name = 像素画面 [lightgray](禁用动画) setting.minimap.name = 显示小地图 @@ -640,7 +651,7 @@ setting.lasersopacity.name = 能量激光不透明度 setting.playerchat.name = 显示玩家聊天气泡 public.confirm = 确定使您的游戏公开可见?\n[accent]其他人将可以加入到您的游戏。\n[lightgray]您之后可以在 设置->游戏->游戏公开可见 更改。 public.beta = 请注意,测试版的游戏不能公开可见。 -uiscale.reset = UI缩放比例已更改。\n按下“确定”来执行缩放比例的更改。\n[accent]{0}[]秒后[scarlet]将自动退出并还原设置。 +uiscale.reset = UI 缩放比例已更改。\n按下“确定”来执行缩放比例的更改。\n[accent]{0}[]秒后[scarlet]将自动退出并还原设置。 uiscale.cancel = 取消并退出 setting.bloom.name = 特效 keybind.title = 重新绑定按键 @@ -651,17 +662,36 @@ category.multiplayer.name = 多人 command.attack = 攻击 command.rally = 团体 command.retreat = 撤退 +placement.blockselectkeys = \n[lightgray]按键:[{0}, keybind.clear_building.name = 清除建筑 keybind.press = 请按一个键… keybind.press.axis = 请按一个轴或键… keybind.screenshot.name = 地图截图 +keybind.toggle_power_lines.name = 显隐能量标识线 keybind.move_x.name = 水平移动 keybind.move_y.name = 竖直移动 keybind.mouse_move.name = 跟随鼠标 +keybind.dash.name = 冲刺 keybind.schematic_select.name = 选择区域 keybind.schematic_menu.name = 蓝图目录 keybind.schematic_flip_x.name = 水平翻转 keybind.schematic_flip_y.name = 竖直翻转 +keybind.category_prev.name = 上一分类 +keybind.category_next.name = 下一分类 +keybind.block_select_left.name = 块选择向左 +keybind.block_select_right.name = 块选择向右 +keybind.block_select_up.name = 块选择向上 +keybind.block_select_down.name = 块选择向下 +keybind.block_select_01.name = 分类/块选择 1 +keybind.block_select_02.name = 分类/块选择 2 +keybind.block_select_03.name = 分类/块选择 3 +keybind.block_select_04.name = 分类/块选择 4 +keybind.block_select_05.name = 分类/块选择 5 +keybind.block_select_06.name = 分类/块选择 6 +keybind.block_select_07.name = 分类/块选择 7 +keybind.block_select_08.name = 分类/块选择 8 +keybind.block_select_09.name = 分类/块选择 9 +keybind.block_select_10.name = 分类/块选择 10 keybind.fullscreen.name = 切换全屏 keybind.select.name = 选择/射击 keybind.diagonal_placement.name = 自动铺设 @@ -675,7 +705,6 @@ keybind.menu.name = 菜单 keybind.pause.name = 暂停 keybind.pause_building.name = 暂停/继续建造 keybind.minimap.name = 小地图 -keybind.dash.name = 冲刺 keybind.chat.name = 聊天 keybind.player_list.name = 玩家列表 keybind.console.name = 控制台 @@ -689,12 +718,12 @@ keybind.drop_unit.name = 松开单位 keybind.zoom_minimap.name = 小地图缩放 mode.help.title = 模式说明 mode.survival.name = 生存 -mode.survival.description = 正常的游戏模式,有限的资源、自动的波次。\n[gray]需要击退周期性出现的敌人。 +mode.survival.description = 正常的游戏模式,有限的资源,自动的波次。\n[gray]需要击退周期性出现的敌人。 mode.sandbox.name = 沙盒 mode.sandbox.description = 无限的资源,不会自动生成敌人。 mode.editor.name = 编辑器 mode.pvp.name = PvP -mode.pvp.description = 和本地玩家对战。\n[gray]需要地图中有不同队伍(颜色)的核心。 +mode.pvp.description = 与本地玩家对战。\n[gray]需要地图中有不同队伍(颜色)的核心。 mode.attack.name = 攻击 mode.attack.description = 没有波次,但需要摧毁敌人的基地。\n[gray]需要地图中有红色的核心。 mode.custom = 自定义模式 @@ -717,7 +746,7 @@ rules.wavespacing = 波次间隔时间:[lightgray](秒) rules.buildcostmultiplier = 建设花费倍数 rules.buildspeedmultiplier = 建设时间倍数 rules.waitForWaveToEnd = 等待敌人时间 -rules.dropzoneradius = 敌人出生点毁灭大小:[lightgray](格) +rules.dropzoneradius = 敌人出生点禁区大小:[lightgray](格) rules.respawns = 每波最大重生次数 rules.limitedRespawns = 重生限制次数 rules.title.waves = 波次 @@ -726,6 +755,10 @@ rules.title.resourcesbuilding = 资源和建造 rules.title.player = 玩家 rules.title.enemy = 敌人 rules.title.unit = 单位 +rules.title.experimental = 实验性 +rules.lighting = 光照 +rules.ambientlight = 环境光 + content.item.name = 物品 content.liquid.name = 液体 content.unit.name = 部队 @@ -772,16 +805,16 @@ mech.trident-ship.name = Trident mech.trident-ship.weapon = 炸弹 mech.glaive-ship.name = Glaive mech.glaive-ship.weapon = 火焰机枪 -item.explosiveness = [lightgray]爆炸性:{0} -item.flammability = [lightgray]易燃性:{0} -item.radioactivity = [lightgray]放射性:{0} +item.explosiveness = [lightgray]爆炸性:{0}% +item.flammability = [lightgray]易燃性:{0}% +item.radioactivity = [lightgray]放射性:{0}% unit.health = [lightgray]生命值:{0} unit.speed = [lightgray]速度:{0} mech.weapon = [lightgray]武器:{0} mech.health = [lightgray]生命值:{0} mech.itemcapacity = [lightgray]物品容量:{0} -mech.minespeed = [lightgray]采矿速度:{0} -mech.minepower = [lightgray]采矿力量:{0} +mech.minespeed = [lightgray]采矿速度:{0}% +mech.minepower = [lightgray]采矿强度:{0} mech.ability = [lightgray]能力:{0} mech.buildspeed = [lightgray]建造速度:{0}% liquid.heatcapacity = [lightgray]热容量:{0} @@ -810,8 +843,8 @@ block.scrap-wall.name = 废墙 block.scrap-wall-large.name = 大型废墙 block.scrap-wall-huge.name = 巨型废墙 block.scrap-wall-gigantic.name = 超巨型废墙 -block.thruster.name = 助力器 -block.kiln.name = 熔炉 +block.thruster.name = 推进器残骸 +block.kiln.name = 窑炉 block.graphite-press.name = 石墨压缩机 block.multi-press.name = 多重压缩机 block.constructing = {0}\n[lightgray](建造中) @@ -873,20 +906,21 @@ block.door.name = 门 block.door-large.name = 大门 block.duo.name = 双管炮 block.scorch.name = 火焰炮 -block.scatter.name = 分裂炮 +block.scatter.name = 散射炮 block.hail.name = 冰雹炮 block.lancer.name = 蓝瑟炮 block.conveyor.name = 传送带 block.titanium-conveyor.name = 钛传送带 block.armored-conveyor.name = 装甲传送带 block.armored-conveyor.description = 运送物品,与钛传送带一样的速度,但有更强的装甲。除其他传送带,不接受任何边的输入。 -block.junction.name = 连接桥 +block.junction.name = 交叉器 block.router.name = 路由器 block.distributor.name = 分配器 block.sorter.name = 分类器 block.inverted-sorter.name = 反向分类器 block.message.name = 信息板 -block.illuminator.name = Illuminator +block.illuminator.name = 照明器 +block.illuminator.description = 小型、紧凑、可配置的光源。需要能量运行。 block.overflow-gate.name = 溢流门 block.silicon-smelter.name = 硅冶炼厂 block.phase-weaver.name = 相织布编织器 @@ -899,13 +933,13 @@ block.separator.name = 分离机 block.coal-centrifuge.name = 煤炭离心机 block.power-node.name = 能量节点 block.power-node-large.name = 大型能量节点 -block.surge-tower.name = 巨浪塔 -block.diode.name = Battery Diode +block.surge-tower.name = 大型能量塔 +block.diode.name = 二极管 block.battery.name = 电池 block.battery-large.name = 大型电池 -block.combustion-generator.name = 燃烧发电机 +block.combustion-generator.name = 火力发电机 block.turbine-generator.name = 涡轮发电机 -block.differential-generator.name = 差动发电机 +block.differential-generator.name = 温差发电机 block.impact-reactor.name = 冲击反应堆 block.mechanical-drill.name = 机械钻头 block.pneumatic-drill.name = 气动钻头 @@ -921,30 +955,30 @@ block.omega-mech-pad.name = Omega 机甲平台 block.tau-mech-pad.name = Tau 机甲平台 block.conduit.name = 导管 block.mechanical-pump.name = 机械泵 -block.item-source.name = 物品源 +block.item-source.name = 无限物品 block.item-void.name = 物品黑洞 -block.liquid-source.name = 液体源 +block.liquid-source.name = 无限液体 block.power-void.name = 能源黑洞 block.power-source.name = 无限能源 block.unloader.name = 装卸器 block.vault.name = 仓库 -block.wave.name = 波浪 +block.wave.name = 波浪炮 block.swarmer.name = 蜂群 -block.salvo.name = 齐射炮 -block.ripple.name = 浪涌 +block.salvo.name = 连射炮 +block.ripple.name = 浪涌炮 block.phase-conveyor.name = 相织布传送带桥 block.bridge-conveyor.name = 传送带桥 block.plastanium-compressor.name = 塑钢压缩机 block.pyratite-mixer.name = 硫混合器 block.blast-mixer.name = 爆炸混合器 -block.solar-panel.name = 太阳能电池 -block.solar-panel-large.name = 大型太阳能电池 +block.solar-panel.name = 太阳能板 +block.solar-panel-large.name = 大型太阳能板 block.oil-extractor.name = 石油钻井 block.command-center.name = 指挥中心 block.draug-factory.name = 德鲁格采矿机工厂 block.spirit-factory.name = 幽灵修理机工厂 -block.phantom-factory.name = 鬼怪建造机工厂 -block.wraith-factory.name = 幻影战机工厂 +block.phantom-factory.name = 幻影建造机工厂 +block.wraith-factory.name = 幽灵战机工厂 block.ghoul-factory.name = 食尸鬼轰炸机工厂 block.dagger-factory.name = 尖刀机甲工厂 block.crawler-factory.name = 爬行者机甲工厂 @@ -953,13 +987,13 @@ block.fortress-factory.name = 堡垒机甲工厂 block.revenant-factory.name = 亡魂战机工厂 block.repair-point.name = 维修点 block.pulse-conduit.name = 脉冲导管 -block.plated-conduit.name = Plated Conduit +block.plated-conduit.name = 电镀导管 block.phase-conduit.name = 相织布导管桥 block.liquid-router.name = 液体路由器 block.liquid-tank.name = 储液罐 -block.liquid-junction.name = 液体连接桥 +block.liquid-junction.name = 液体交叉器 block.bridge-conduit.name = 导管桥 -block.rotary-pump.name = 回旋泵 +block.rotary-pump.name = 回转泵 block.thorium-reactor.name = 钍反应堆 block.mass-driver.name = 质量驱动器 block.blast-drill.name = 爆破钻头 @@ -971,14 +1005,14 @@ block.mend-projector.name = 修理投影器 block.surge-wall.name = 波动墙 block.surge-wall-large.name = 大型波动墙 block.cyclone.name = 气旋炮 -block.fuse.name = 融合炮 +block.fuse.name = 雷光炮 block.shock-mine.name = 脉冲地雷 block.overdrive-projector.name = 超速投影器 block.force-projector.name = 力墙投影器 -block.arc.name = 电弧 +block.arc.name = 电弧炮 block.rtg-generator.name = RTG 发电机 -block.spectre.name = 幽灵 -block.meltdown.name = 熔毁 +block.spectre.name = 幽灵炮 +block.meltdown.name = 熔毁炮 block.container.name = 容器 block.launch-pad.name = 发射台 block.launch-pad-large.name = 大型发射台 @@ -991,12 +1025,12 @@ team.green.name = 绿 team.purple.name = 紫 unit.spirit.name = 幽灵修理机 unit.draug.name = 德鲁格采矿机 -unit.phantom.name = 鬼怪建造机 +unit.phantom.name = 幻影建造机 unit.dagger.name = 尖刀 unit.crawler.name = 爬行者 unit.titan.name = 泰坦 unit.ghoul.name = 食尸鬼轰炸机 -unit.wraith.name = 幻影战机 +unit.wraith.name = 幽灵战机 unit.fortress.name = 堡垒 unit.revenant.name = 亡魂 unit.eruptor.name = 暴君 @@ -1005,10 +1039,10 @@ 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.mobile = 您已进入[scarlet] Mindustry 教程[]。\n在屏幕上滑动来继续。\n[accent]双指捏合 [] 来缩小和放大。\n让我们从[accent]采集铜矿[]开始。先移动到它旁边,然后点按矿脉附近散落的矿物。\n\n[accent]铜 {0}/{1} -tutorial.drill = 手动采矿效率不佳。\n[accent]钻头[]可以自动采矿。\n让我们在在铜矿上放一个。\n点击右下角的钻头菜单。\n选择[accent]机械钻头[]。\n单击将其放置在铜矿上。\n[accent]右键单击[]来停止。 -tutorial.drill.mobile = 手动采矿效率不佳。\n[accent]钻头[]可以自动采矿。\n点右下角的钻头菜单。\n选择[accent]机械钻头[]。\n点一下将其放在铜矿上,点[accent]对号[]来确定。\n点[accent]叉号[]来取消。 +tutorial.intro = 您已进入[scarlet] Mindustry 教程[]。[]\n使用[accent][[WASD][]键移动主角和视角。\n[accent]按住[[Ctrl]并转动鼠标滚轮[]缩放视野。\n让我们从[accent]采集铜矿[]开始。先移动到铜矿旁边,然后点按矿脉附近散落的矿物。\n\n[accent]{0}/{1} 铜 +tutorial.intro.mobile = 您已进入[scarlet] Mindustry 教程[]。\n在屏幕上滑动来继续。\n[accent]双指捏合[] 来缩小和放大。\n让我们从[accent]采集铜矿[]开始。先移动到铜矿旁边,然后点按矿脉附近散落的矿物。\n\n[accent]铜 {0}/{1} +tutorial.drill = 手动采矿效率不高。\n[accent]钻头[]可以自动采矿。\n让我们在在铜矿上放一个。\n点击右下角的钻头菜单。\n选择[accent]机械钻头[]。\n单击将其放置在铜矿上。\n[accent]右键单击[]来停止。 +tutorial.drill.mobile = 手动采矿效率不高。\n[accent]钻头[]可以自动采矿。\n点右下角的钻头菜单。\n选择[accent]机械钻头[]。\n点一下将其放在铜矿上,点[accent]对号[]来确定。\n点[accent]叉号[]来取消。 tutorial.blockinfo = 每种方块都有其独特的数据。每个钻头只能开采部分矿石。\n若要查看块的信息和统计信息,[accent]在菜单中点击问号。[]\n\n[accent]现在查看机械钻头的数据吧。[] tutorial.conveyor = [accent]传送带[]可以把物资传送到核心。\n请在钻头到核心间建造一条传送带。 tutorial.conveyor.mobile = [accent]传送带[]可以把物资传送到核心。\n请在钻头到核心间建造一条传送带。\n[accent]长按数秒[]并向一个方向拖动来直线放置。\n\n[accent]{0}/{1} 条传送带\n[accent]0/1 物品 @@ -1024,158 +1058,158 @@ tutorial.withdraw = 有时,从方块中取出物品是必要的。\n[accent] tutorial.deposit = 将物品从机甲拖向方块来放下物品。\n\n[accent]将铜放回核心[]。 tutorial.waves = [lightgray]敌人[]来了。\n\n保护核心,防御两波攻击。造更多的炮塔。[accent]点击[]以射击。\n建造更多的炮塔和钻头,并采更多的矿。 tutorial.waves.mobile = [lightgray]敌人[]来了。\n\n保护核心,防御两波攻击。造更多的炮塔。你的机甲将对敌人自动开火。\n建造更多的炮塔和钻头,并采更多的矿。 -tutorial.launch = 特定波次中,你可以[accent]发射核心[],[accent]携带核心中所有资源[]离开所有的建筑。\n资源可用来研究科技。\n\n[accent]点击发射按钮。 +tutorial.launch = 进入特定波次后,你可以[accent]发射核心(起飞)[],[accent]带走核心中的所有资源[]并抛下所有的建筑。\n装运的资源可用于研究科技。\n\n[accent]点击发射按钮。 -item.copper.description = 一种有用的结构材料。在各种类型的方块中广泛使用。 -item.lead.description = 一种基本的起始材料。广泛用于电子设备和液体运输。 -item.metaglass.description = 一种超级强硬的复合玻璃。通常用来传送和收藏液体。 -item.graphite.description = 一种用于弹药和电路绝缘的矿化碳。 +item.copper.description = 最基本的的结构材料。在各种类型的方块中被广泛使用。 +item.lead.description = 一种基本的电力材料。广泛用于电子设备和液体输送模块。 +item.metaglass.description = 一种致密坚硬的复合玻璃。广泛用于液体输送和存储。 +item.graphite.description = 矿化碳,用于弹药和电路绝缘。 item.sand.description = 一种常见的材料,广泛用于冶炼,包括制作合金和助熔剂。 -item.coal.description = 一种常见并容易获得的燃料。 +item.coal.description = 植物的化石,常见且容易获得,常用作燃料或其他资源的生产。 item.titanium.description = 一种罕见的超轻金属,被广泛运用于液体运输、钻头和飞机。 item.thorium.description = 一种致密的放射性金属,用作结构支撑和核燃料。 item.scrap.description = 一种废弃的建筑物及废弃单位的残骸,富含多种金属元素。 item.silicon.description = 一种非常有用的半导体,被用于太阳能电池板和很多复杂的电子设备。 -item.plastanium.description = 一种轻质,可延展的材料,用于高级的飞机和碎片弹药。 -item.phase-fabric.description = 一种接近0重量的物质,用于先进的电子技术和自我修复技术。 -item.surge-alloy.description = 一种具有独特电气性能的高级合金。 -item.spore-pod.description = 一种用于制造石油,炸药及燃料的生物质。 -item.blast-compound.description = 一种用于炸弹和炸药的挥发性混合物。虽然它可以作为燃料燃烧,但不建议这样做。 -item.pyratite.description = 一种燃烧武器中使用的极易燃物质。 -liquid.water.description = 最有用的液体。常用于冷却和废物处理。 -liquid.slag.description = 各种不同类型的熔融金属混合在一起的液体。可以被分解成其组成矿物,或作为武器喷向敌方单位。 +item.plastanium.description = 一种轻质、可延展的材料,用于高级的飞机和碎片弹药。 +item.phase-fabric.description = 一种近乎无重量的物质,用于先进的电子技术和自我修复技术。 +item.surge-alloy.description = 一种先进的合金,具有独特的电气性能。 +item.spore-pod.description = 一种用于制造石油、炸药及燃料的生物质。 +item.blast-compound.description = 一种用于炸弹和炸药的挥发性混合物。虽然它可以作为燃料,但不建议这样做。 +item.pyratite.description = 一种在燃烧武器中使用的极易燃物质。 +liquid.water.description = 最有用的液体。常用于冷却机器和废物处理。 +liquid.slag.description = 各种不同类型的熔融金属混合在一起的液体。可以被分解成其矿物成分,或作为武器喷向敌方单位。 liquid.oil.description = 用于先进材料生产的液体。可以转换成煤作为燃料,或作为武器喷射和放火。 liquid.cryofluid.description = 一种由水和钛制成的惰性、无腐蚀性的液体。具有极高的热容量。广泛用作冷却剂。 mech.alpha-mech.description = 标准控制机甲。基于尖刀单位,具有升级的装甲和建筑能力。比 Dart 有更多的伤害输出。 -mech.delta-mech.description = 一种快速,轻便的机甲,一击即退。对结构造成的伤害很小,但可以用弧形闪电武器快速杀死大量敌方单位。 +mech.delta-mech.description = 一种快速、轻便的机甲,一击即退。对结构造成的伤害很小,但可以使用弧形闪电武器快速杀死大量敌方单位。 mech.tau-mech.description = 后勤机甲。治疗友军。可以熄灭火焰并治疗一定范围内的友军。 mech.omega-mech.description = 一种装甲厚重的机甲,用于在前线攻击。它的护甲可以阻挡高达90%的伤害。 mech.dart-ship.description = 标准飞船。快速轻便,但攻击能力低,采矿速度慢。 mech.javelin-ship.description = 一艘一击即退的攻击船。虽然最初很慢,但它可以加速到很快的速度,并飞过敌人的前哨,利用其闪电能力和导弹造成大量伤害。 mech.trident-ship.description = 为建造和摧毁敌人防御工事而建造的重型轰炸机。有相当好的装甲。 -mech.glaive-ship.description = 一种大型,装甲厚重的武装直升机。配备燃烧机枪。有优秀的加速能力和最快的速度。 +mech.glaive-ship.description = 一种大型的装甲厚重的武装直升机。配备火焰机枪。有优秀的加速能力和最快的速度。 unit.draug.description = 一种原始的采矿机。生产成本低,消耗品。在附近自动开采铜和铅。将开采的资源输送到最近的核心。 unit.spirit.description = 一种改进的德鲁格无人机,设计用于维修而不是采矿。自动修复该区域中任何损坏的块。 unit.phantom.description = 一种先进的无人机。跟随玩家并协助建造。 -unit.dagger.description = 一种最基本的地面机甲。生产成本低。在蜂群中使用时很有用。 +unit.dagger.description = 一种最基本的地面机甲。生产成本低。集群使用时比较有用。 unit.crawler.description = 一种地面装置,由一个框架和绑在上面的烈性炸药组成。不是特别耐用。与敌人接触后爆炸。 -unit.titan.description = 一种先进的装甲地面部队。攻击地面和空中目标。配备两个微型灼烧级火焰喷射器。 +unit.titan.description = 一种先进的地面装甲部队。攻击地面和空中目标。配备两个微型灼烧级火焰喷射器。 unit.fortress.description = 一种重型炮兵机甲。装备两门改进型冰雹炮,用于对敌军建筑物和部队进行远程攻击。 unit.eruptor.description = 一种用来拆除建筑物的重型机甲。在敌人的防御工事上发射矿渣,将它们熔化并点燃挥发物。 unit.wraith.description = 一种快速、一击即退的拦截器机甲。目标是发电机。 -unit.ghoul.description = 一种地毯式轰炸机。通过敌人的结构进行攻击,并瞄准关键的基础设施。 +unit.ghoul.description = 一种重型地毯式轰炸机。瞄准关键的基础设施来击溃敌人的基地。 unit.revenant.description = 一种发射导弹的重型飞行机甲。 -block.message.description = 储存一条信息。用于在盟军之间交流。 -block.graphite-press.description = 把大块的煤压缩成纯石墨片。 +block.message.description = 储存一条消息。用于盟友间的交流。 +block.graphite-press.description = 将煤块压缩成纯石墨片材料。 block.multi-press.description = 石墨压缩机的升级版。利用水和电力快速高效地处理煤炭。 block.silicon-smelter.description = 用高纯度的焦炭来加工沙子以生产硅。 block.kiln.description = 将铅和沙子熔炼成钢化玻璃,需要少量电力。 block.plastanium-compressor.description = 用石油和钛生产塑钢。 block.phase-weaver.description = 用放射性钍和大量沙子生产相织物。 -block.alloy-smelter.description = 用钛,铅,硅和铜生产浪涌合金。 -block.cryofluidmixer.description = 水和钛结合到低温流体中,冷却效率更高。 -block.blast-mixer.description = 用油将硫转化为不易燃但更具爆炸性的爆炸化合物。 -block.pyratite-mixer.description = 将煤,铅和沙子混合成高度易燃的硫。 +block.alloy-smelter.description = 用钛、铅、硅和铜生产浪涌合金。 +block.cryofluidmixer.description = 将水和细的钛粉混成冷却液。钍反应堆的必备之物。 +block.blast-mixer.description = 用油料将硫转化为不易燃但更具爆炸性的爆炸化合物。 +block.pyratite-mixer.description = 将煤、铅和沙子混合成高度易燃的硫。 block.melter.description = 将废料熔化成矿渣,以便进一步加工或用于炮塔弹药。 block.separator.description = 从矿渣中提取有用的矿物。 -block.spore-press.description = 压缩孢子荚得到石油。 -block.pulverizer.description = 将废料压碎成沙子。当缺少天然沙子时很有用。 +block.spore-press.description = 以极高压力压缩孢子荚合成油料。 +block.pulverizer.description = 将废料碾成沙。 block.coal-centrifuge.description = 使石油凝固成煤块。 -block.incinerator.description = 用于除掉任何多余的物品或液体。 +block.incinerator.description = 用来接收并除掉多余的物品或液体。 block.power-void.description = 消耗输入的所有能量。仅限沙盒。 block.power-source.description = 无限输出能量。仅限沙盒。 block.item-source.description = 无限输出物品。仅限沙盒。 -block.item-void.description = 在不使用能量的情况下销毁任何进入它的物品。仅限沙盒。 +block.item-void.description = 销毁输入的所有物品。仅限沙盒。 block.liquid-source.description = 无限输出液体。仅限沙盒。 block.copper-wall.description = 廉价的防御方块。\n适合在前几个波次中保护核心和炮塔。 -block.copper-wall-large.description = 廉价的防御方块。\n适合在前几个波次中保护核心和炮塔。\n跨越多个区块。 +block.copper-wall-large.description = 廉价的防御方块。\n适合在前几个波次中保护核心和炮塔。\n占多个方格。 block.titanium-wall.description = 中等强度的防御方块。\n提供中等强度的防御以抵御敌人。 -block.titanium-wall-large.description = 中等强度的防御方块。\n提供中等强度的防御以防敌人攻击。\n跨越多个区块。 +block.titanium-wall-large.description = 中等强度的防御方块。\n提供中等强度的防御以防敌人攻击。\n占多个方格。 block.plastanium-wall.description = 一种特殊的防御方块,能吸收电弧、自动与能量节点连接。 -block.plastanium-wall-large.description = 一种特殊的防御方块,能吸收电弧、自动与能量节点连接。\n跨越多个区块。 +block.plastanium-wall-large.description = 一种特殊的防御方块,能吸收电弧、自动与能量节点连接。\n占多个方格。 block.thorium-wall.description = 强大的防御方块。\n可以很好的防御敌人。 -block.thorium-wall-large.description = 强大的防御方块。\n很好地防御敌人。\n跨越多个区块。 +block.thorium-wall-large.description = 强大的防御方块。\n很好地防御敌人。\n占多个方格。 block.phase-wall.description = 没有钍墙那样坚固,但是它可以使不太强的弹药发生偏转。 -block.phase-wall-large.description = 没有钍墙那样坚固,但是它可以使不太强的弹药发生偏转。\n跨越多个区块。 +block.phase-wall-large.description = 没有钍墙那样坚固,但是它可以使不太强的弹药发生偏转。\n占多个方格。 block.surge-wall.description = 强大的防御方块。\n有很小的机会向攻击者发射闪电。 -block.surge-wall-large.description = 强大的防御方块。\n有很小的机会向攻击者发射闪电。\n跨越多个区块。 -block.door.description = 一扇小门,可以通过点击打开和关闭。\n如果打开,敌人可以射击并穿过。 -block.door-large.description = 一扇大门,可以通过点击打开和关闭。\n如果打开,敌人可以射击并穿过。\n跨越多个区块。 -block.mender.description = 会定期修理附近的方块,使防御系统在波与波之间得到修复。\n可以使用硅来提高修复范围和修复效率。 -block.mend-projector.description = 修理者的升级版,会定期修复附近的建筑物。 +block.surge-wall-large.description = 强大的防御方块。\n有很小的机会向攻击者发射闪电。\n占多个方格。 +block.door.description = 一扇小门。点按切换它的打开/关闭状态。 +block.door-large.description = 一扇大门。点按切换它的打开/关闭状态。\n占多个方格。 +block.mender.description = 定期修理附近的方块,使防御系统在波次之间得到修复。\n可选使用硅来提高修复范围和修复效率。 +block.mend-projector.description = 修理者的升级版,定期修复附近的建筑物。 block.overdrive-projector.description = 提高附近建筑物的速度,如钻头和传送带。 -block.force-projector.description = 自身周围创建一个六边形力场,使建筑物和内部单位免受弹药的伤害。 +block.force-projector.description = 在自身周围创建一个六角形力场,使里面的建筑物和单位免受伤害。\n持续承受高伤害会导致过热,可以使用冷却液降温。相织物可用于增加屏障大小。 block.shock-mine.description = 伤害踩到它的敌人。敌人几乎看不到它。 -block.conveyor.description = 初级传送带。将物品向前输送并将它们放入炮塔或工厂中。可旋转方向。 -block.titanium-conveyor.description = 高级传送带,比初级传送带更快地输送物品。 -block.junction.description = 作为交叉的两条传送带的桥梁。适用于两条不同方向的传送带将不同的物品运送到不同的位置。 -block.bridge-conveyor.description = 高级物品传输方块。允许跨越任何地形或建筑物上运输物品,最多跨越3个块。 -block.phase-conveyor.description = 高级传送带,使用电力将物品传送到距离几个块的相位传送带上。 +block.conveyor.description = 初级物资传送带。将物品向前输送并在可能时运入建筑。可旋转方向。 +block.titanium-conveyor.description = 高级物资传送带。运送物品的速度优于初级传送带。 +block.junction.description = 两条传送带的交叉桥连接。适用于两条不同方向的传送带要分别将不同的物品运送到不同的位置。 +block.bridge-conveyor.description = 先进的物品运输方块。允许跨越任意地形或建筑物运输物品,最多跨越3格。 +block.phase-conveyor.description = 先进的传送带,使用电力将物品传送到距离几个块的相位传送带上。 block.sorter.description = 对物品进行分类,如果物品与所选种类相同,则允许其通过。否则,物品将从左边和右边输出。 -block.inverted-sorter.description = Processes items like a standard sorter, but outputs selected items to the sides instead. +block.inverted-sorter.description = 同分类器一样分类物品,但所选物品输出到左边和右边。 block.router.description = 从一个方向接受物品,并将它们平均输出到其他3个方向。可以将材料分成多份。 -block.distributor.description = 一个高级路由器,可以将物品向最多7个方向输出。 -block.overflow-gate.description = 分离器和路由器的组合,如果前面被挡住,则向从左和右输出。 -block.mass-driver.description = 终极传送带,收集物品后将它们射向远处的另一个质量驱动器。 -block.mechanical-pump.description = 一种输出速度慢但没有功耗的廉价泵。 -block.rotary-pump.description = 先进的水泵。泵送更多液体,但需要能量。 -block.thermal-pump.description = 终级水泵。 +block.distributor.description = 改进的路由器,可将物品输出到周围的最多7个其他方向。 +block.overflow-gate.description = 仅在前路被阻塞时向左和右输出。 +block.mass-driver.description = 终极传送带,收集若干物品后将其射到远处的另一个质量驱动器。 +block.mechanical-pump.description = 一种廉价泵,输出速度慢,但无需能量。 +block.rotary-pump.description = 先进液泵。泵送更多液体,但需要能量。 +block.thermal-pump.description = 终级液泵。 block.conduit.description = 基本液体传输管道。像传送带一样工作,但仅适用于液体。用于从泵或其他导管中提取液体。 block.pulse-conduit.description = 高级液体传输管道。比普通导管更快地输送液体且能储存更多液体。 -block.plated-conduit.description = 转移液体的速度与脉冲导管相同,但护甲更强。Does not accept fluids from the sides by anything other than conduits.\n更少泄漏。 -block.liquid-router.description = 接受来自一个方向的液体并将它们平均输出到其他3个方向。同时可以储存一定量的液体。用于将液体从一个源分成多个目标。 -block.liquid-tank.description = 存储大量液体,可用于在材料需求不恒定的时候提供缓冲,或作为供给冷却液体的保障。 -block.liquid-junction.description = 作为两个交叉管道的桥梁。适用于两种不同方向的导管将不同液体输送到不同位置的情况。 -block.bridge-conduit.description = 高级液体传输方块。可以跨越任何地形或建筑物,最多跨越3格来传输液体。 -block.phase-conduit.description = 高级液体传输方块。使用电力将液体传送到多个块上的连接管道。 +block.plated-conduit.description = 转移液体的速度与脉冲导管相同,但护甲更强。两侧只接受通过导管传入液体。\n更少泄漏。 +block.liquid-router.description = 接受一个方向的液体并将它们平均输出到其他3个方向。同时可以储存一定量的液体。用于将液体从一个源分往多个目标。 +block.liquid-tank.description = 存储大量液体,可在材料需求不恒定作为缓冲区,或作为供给冷却液体的保障设施。 +block.liquid-junction.description = 两条管道的交叉桥连接。适用于两条不同方向的导管要将不同的液体输送到不同的位置。 +block.bridge-conduit.description = 先进的液体传输方块。可以跨越任何地形或建筑物,最多跨越3格来传输液体。 +block.phase-conduit.description = 先进的液体传输方块。使用电力将液体传送到多个块上的连接管道。 block.power-node.description = 将电源传输到连接的节点上。节点将接收来自任何方块的能量或向任何方块供给能量。 -block.power-node-large.description = 拥有大范围和多连接点的高级能量节点。 -block.surge-tower.description = 连接点较少,但是距离远的能量节点。 -block.diode.description = Battery power can flow through this block in only one direction, but only if the other side has less power stored. -block.battery.description = 储存能量,当储存有能量时,可在能源短缺时提供能量。 +block.power-node-large.description = 更大范围、更多连接点的高级能量节点。 +block.surge-tower.description = 连接数低但范围很远的能量节点。 +block.diode.description = 此方块上的电能只能单向流动,仅当对方的储能更低时流动。 +block.battery.description = 存储能量作为缓冲,在能源亏空时提供。 block.battery-large.description = 比普通电池容量更大。 block.combustion-generator.description = 燃烧煤等材料发电。 -block.thermal-generator.description = 当放置在热的地方时发电。 -block.turbine-generator.description = 先进的燃烧发电机,效率更高,但需要水来产生蒸汽。 -block.differential-generator.description = 利用低温流体和燃烧的硫之间的温差产生大量的能量。 -block.rtg-generator.description = 简单可靠的发电机。利用衰变放射性化合物的热量以缓慢的速度产生能量。 -block.solar-panel.description = 普通太阳能面板,提供少量电力。 -block.solar-panel-large.description = 高级太阳能面板,提供更多电力,但搭建起来更贵。 -block.thorium-reactor.description = 高放射性钍产生大量电力。需要冷却液来冷却。如果供应的冷却液不足,会导致爆炸。 -block.impact-reactor.description = 一种先进的发电机,能够以最高效率产生大量的电力。但需要大量的能量输入才会启动。 +block.thermal-generator.description = 放置在炽热的地方发电。 +block.turbine-generator.description = 先进的火力发电机,效率更高,但需要水来产生蒸汽。 +block.differential-generator.description = 利用低温流体与燃烧的硫之间的温差产生大量能量。 +block.rtg-generator.description = 一种简单可靠的发电机。利用放射性化合物的衰变产生的热量,以缓慢的速度产生能量。 +block.solar-panel.description = 普通太阳能板,提供少量电力。 +block.solar-panel-large.description = 高级太阳能板,提供更多电力,但成本更高。 +block.thorium-reactor.description = 用高放射性的钍产生大量电力。需要冷却液冷却。如果供应的冷却液不足,会导致爆炸。 +block.impact-reactor.description = 一种先进的发电机,能够以最高效率产生大量的电力。但需要大量的能量输入来启动。 block.mechanical-drill.description = 一种便宜的钻头。放置在合适的方块上时,以缓慢的速度无限期地输出物品。只能开采基本资源。 -block.pneumatic-drill.description = 一种改进的钻头,能开采钛。采矿速度比机械钻快。 -block.laser-drill.description = 通过激光技术更快开采,但需要电力。这种钻头可以开采放射性钍。 -block.blast-drill.description = 终极钻头,需要大量电力。 +block.pneumatic-drill.description = 一种改进的钻头,能开采钛。采矿速度比机械钻头快。 +block.laser-drill.description = 通过激光技术更快地开采,但需要能量。这种钻头可以开采放射性钍。 +block.blast-drill.description = 终极钻头,需要大量能量。 block.water-extractor.description = 从地下提取水。当附近没有水源时使用它。 block.cultivator.description = 将微小的孢子培养成工业用的孢子荚。 -block.oil-extractor.description = 使用大量的电力从沙子中提取石油。当附近没有直接的石油来源时使用它。 -block.core-shard.description = 核心第一代。一旦被摧毁,与该地区的所有连接都将断开。不要让它被摧毁。 -block.core-foundation.description = 核心第二代。血量更高。可以存储更多资源。 -block.core-nucleus.description = 核心第三代,也是最后一代,血量非常高。存储大量资源。 +block.oil-extractor.description = 使用大量能量、沙子和水提炼石油。 +block.core-shard.description = 初代核心。一旦被摧毁,与该地区的所有连接都将断开。不要让它被摧毁。 +block.core-foundation.description = 二代核心。血量更高。可以存储更多资源。 +block.core-nucleus.description = 三代核心,也是最新一代,血量非常高。能存储大量资源。 block.vault.description = 存储大量物品。当存在非恒定的材料需求时,使用它来创建缓冲区。[lightgray]卸载器[]可从仓库中提取物品。 block.container.description = 存储少量物品。当存在非恒定的材料需求时,使用它来创建缓冲区。[lightgray]卸载器[]可从容器中提取物品。 -block.unloader.description = 物品可以从容器,仓库或核心提取到传送带上或直接提取到相邻的方块中。可以通过点击卸载器来更改要卸载的项目类型。 -block.launch-pad.description = 允许不通过核心发射物体。 -block.launch-pad-large.description = 发射台的改进版,可以存储更多物体的同时启动频率更高。 -block.duo.description = 小而便宜的炮塔,对地有效。 -block.scatter.description = 不可或缺的防空炮塔,向空中敌人发射铅或废料。 -block.scorch.description = 小型炮塔,燃烧任何靠近它的地面敌人。近距离非常有效。 +block.unloader.description = 将物品从容器、仓库或你的核心中提取到传送带或直接提取到相邻的方块。点击卸载器本身更改所要卸载的物品类型。 +block.launch-pad.description = 定期发射一批物品,而无需发射核心(离开地图)。 +block.launch-pad-large.description = 发射台的改进版,可以存储更多物品,同时启动频率更高。 +block.duo.description = 小而便宜的炮塔,对地很有效。 +block.scatter.description = 基本型防空炮塔。向空中敌人喷出一团铅或废料。 +block.scorch.description = 小型炮塔,点燃任何靠近它的地面敌人。近距离非常有效。 block.hail.description = 小型远程炮台。 block.wave.description = 中型快速炮塔,射出液体泡泡。有液体输入时自动灭火。 -block.lancer.description = 中型对地炮塔。遇敌时会充能并发射强有力的的能量束。 +block.lancer.description = 中型对地炮塔。会充能并发射强力的的能量束。 block.arc.description = 小型炮塔,发射电弧。 block.swarmer.description = 中型炮塔,对空对地,发射跟踪爆炸导弹。 -block.salvo.description = 双管炮的升级版。中型,齐射射击。 -block.fuse.description = 大型炮塔,发射三道刺穿敌人的短程光束。 +block.salvo.description = 双管炮的升级版。中型,快速射出一串子弹。 +block.fuse.description = 大型近程炮塔,发射三道刺穿敌人的短程光束。 block.ripple.description = 大型远程炮台,非常强力,向远处的敌人投射一簇弹药。 -block.cyclone.description = 大型快速炮塔,对空对地,向周围敌人发射爆炸弹。 +block.cyclone.description = 大型炮塔,对空对地,发射在敌人周围引爆的爆炸物。 block.spectre.description = 超大型炮塔,对空对地,一次射出两颗强大的穿甲弹药。 block.meltdown.description = 超大型激光炮塔,充能之后持续发射光束,需要冷却剂。 -block.command-center.description = 在地图上向盟军发出移动命令。\n使用部队巡逻、攻击敌军核心或撤退到核心/工厂。当没有敌人核心时,部队默认在攻击命令下巡逻。 +block.command-center.description = 在地图上向联盟单位发出移动命令。\n使部队巡逻、攻击一个敌人核心,或者撤退到核心/工厂。当没有敌人核心时,得到攻击命令的部队默认执行巡逻。 block.draug-factory.description = 生产德鲁格釆矿机。 block.spirit-factory.description = 生产幽灵修理机。 -block.phantom-factory.description = 生产鬼怪建造机。 +block.phantom-factory.description = 生产幻影建造机。 block.wraith-factory.description = 生产快速截击机。 block.ghoul-factory.description = 生产重型地毯轰炸机。 block.revenant-factory.description = 生产重型导弹部队。 @@ -1183,11 +1217,11 @@ block.dagger-factory.description = 生产基本地面单位。 block.crawler-factory.description = 生产快速自毁单元。 block.titan-factory.description = 生产先进的装甲地面单位。 block.fortress-factory.description = 生产重型地面火炮部队。 -block.repair-point.description = 连续治疗附近最近的受损单位。 -block.dart-mech-pad.description = 替换当前的机甲并转换成一个基础的攻击型机甲。\n站在上面时点击切换。 -block.delta-mech-pad.description = 替换当前的机甲并转换成一个快速,轻装甲的机械装置。\n站在上面时点击切换。 -block.tau-mech-pad.description = 替换当前的机甲并转换成一个可以治愈友方建筑物和单位的后勤机甲。\n站在上面时点击切换。 -block.omega-mech-pad.description = 替换当前的机甲并转换成一个笨重但是高护甲的机甲。\n站在上面时点击切换。 -block.javelin-ship-pad.description = 替换当前的机甲并转换成一个强大而快速的截击机,发射电弧。\n站在上面时点击切换。 -block.trident-ship-pad.description = 替换当前的机甲并转换成一个高护甲的重型轰炸机。\n站在上面时点击切换。 -block.glaive-ship-pad.description = 替换当前的机甲并转换成一个高护甲的大型武装直升机。\n站在上面时点击切换。 +block.repair-point.description = 持续治疗其附近伤势最重的单位。 +block.dart-mech-pad.description = 允许将当前的机甲替换为一款基础的攻击型机甲。\n站在上面并点一下执行切换。 +block.delta-mech-pad.description = 允许将当前的机甲替换为一款轻快的攻击型机甲。\n站在上面并点一下执行切换。 +block.tau-mech-pad.description = 允许将当前的机甲替换为一款可以治愈友方建筑物和单位的支援型机甲。\n站在上面并点一下执行切换。 +block.omega-mech-pad.description = 允许将当前的机甲替换为一款笨重、厚装甲的导弹机甲。\n站在上面并点一下执行切换。 +block.javelin-ship-pad.description = 允许将当前的机甲替换为一款快速、轻装甲的截击机,发射电弧。\n站在上面并点一下执行切换。 +block.trident-ship-pad.description = 允许将当前的机甲替换为一款重型的支援轰炸机。\n站在上面并点一下执行切换。 +block.glaive-ship-pad.description = 允许将当前的机甲替换为一款大型的装甲武装直升机。\n站在上面并点一下执行切换。 diff --git a/core/assets/bundles/bundle_zh_TW.properties b/core/assets/bundles/bundle_zh_TW.properties index 5e7ad5bc62..e286fa4854 100644 --- a/core/assets/bundles/bundle_zh_TW.properties +++ b/core/assets/bundles/bundle_zh_TW.properties @@ -10,6 +10,7 @@ link.dev-builds.description = 開發中版本 link.trello.description = 官方 Trello 功能規劃看板 link.itch.io.description = itch.io 電腦版下載網頁 link.google-play.description = Google Play 商店頁面 +link.f-droid.description = F-Droid 目錄頁面 link.wiki.description = 官方 Mindustry 維基 linkfail = 無法打開連結!\n我們已將該網址複製到您的剪貼簿。 screenshot = 截圖保存到{0} @@ -25,6 +26,7 @@ load.image = 圖片載入中 load.content = 內容載入中 load.system = 系統載入中 load.mod = 模組載入中 +load.scripts = 指令檔載入中 schematic = 藍圖 schematic.add = 儲存藍圖... @@ -98,12 +100,14 @@ mod.disabled = [scarlet]已禁用 mod.enable = 啟用 mod.disable = 禁用 mod.delete.error = 無法刪除模組,檔案可能在使用中。 +mod.requiresversion = [scarlet]遊戲版本要求:[accent]{0} mod.missingdependencies = [scarlet]缺少依賴項目: {0} -mod.nowdisabled = [scarlet]「{0}'」模組缺少依賴項目:[accent] {1}\n[lightgray]必須先下載這些模組。\n此模組將被自動禁用。 +mod.nowdisabled = [scarlet]「{0}」模組缺少必須項目:[accent] {1}\n[lightgray]必須先下載這些模組。\n此模組將被自動禁用。 mod.requiresrestart = 遊戲將立即關閉以套用模組變更。 mod.reloadrequired = [scarlet]需要重新載入 mod.import = 匯入模組 mod.import.github = 匯入GitHub模組 +mod.item.remove = 此物品是[accent] '{0}'[]模組的一部份。解除安裝模組以移除此物品。 mod.remove.confirm = 該模組將被刪除。 mod.author = [lightgray]作者:[] {0} mod.missing = 此存檔含有您最近更新或不再安裝的模組。可能會發生存檔損毀。您確定要載入嗎?\n[lightgray]模組:\n{0} @@ -139,7 +143,7 @@ server.kicked.idInUse = 你已經在伺服器中!不允許用兩個帳號。 server.kicked.customClient = 這個伺服器不支持自訂客戶端,請下載官方版本。 server.kicked.gameover = 遊戲結束! server.versions = 您的遊戲版本:[accent] {0}[]\n伺服器遊戲版本:[accent] {1}[] -host.info = 目前伺服器監聽於連接埠[scarlet]6567[]。\n所有跟您在同一個[lightgray]網路或區域網路[]環境的玩家應該能在他們的伺服器清單中找到您的伺服器。\n\n如果您希望網際網路上的玩家透過IP 位址連線到您的伺服器,您必須設定[accent]連接埠轉發[]。\n\n[lightgray]注意:如果區域網路內有玩家無法連線至您的伺服器,請務必確認您已於防火牆設定中開放Mindustry存取您的區域網路。請注意公共網路有時不允許搜尋伺服器。 +host.info = [accent]建立伺服器[]按鍵會在連接埠[scarlet]6567[]建立一個伺服器。\n所有跟您在同一個[lightgray]網路或區域網路[]環境的玩家應該能在他們的伺服器清單中找到您的伺服器。\n\n如果您希望網際網路上的玩家透過IP 位址連線到您的伺服器,您必須設定[accent]連接埠轉發[]。\n\n[lightgray]注意:如果區域網路內有玩家無法連線至您的伺服器,請務必確認您已於防火牆設定中開放Mindustry存取您的區域網路。請注意公共網路有時不允許搜尋伺服器。 join.info = 您可以在此輸入欲連線的[accent]伺服器IP位址[],或尋找[accent]區域網路[]內的伺服器。目前支援區域網路與網際網路連線。\n\n[lightgray]注意:並沒有自動的網際網路伺服器清單,如果您想透過IP位址連線到他人的伺服器,您必須向他們詢問IP位址。 hostserver = 建立伺服器 invitefriends = 邀請好友 @@ -493,6 +497,7 @@ settings.language = 語言 settings.data = 遊戲數據 settings.reset = 重設為預設設定 settings.rebind = 重新綁定 +settings.resetKey = 重設按鍵 settings.controls = 操作 settings.game = 遊戲 settings.sound = 音效 @@ -586,6 +591,8 @@ unit.persecond = /秒 unit.timesspeed = ×速度 unit.percent = % unit.items = 物品 +unit.thousands = k +unit.millions = mil category.general = 一般 category.power = 能量 category.liquids = 液體 @@ -659,6 +666,7 @@ keybind.clear_building.name = 清除建築物 keybind.press = 按一下按鍵... keybind.press.axis = 按一下軸向或按鍵... keybind.screenshot.name = 地圖截圖 +keybind.toggle_power_lines.name = 顯示能量激光 keybind.move_x.name = 水平移動 keybind.move_y.name = 垂直移動 keybind.schematic_select.name = 選擇區域 @@ -780,6 +788,7 @@ mech.trident-ship.name = 三叉戟 mech.trident-ship.weapon = 轟炸艙 mech.glaive-ship.name = 偃月刀 mech.glaive-ship.weapon = 火焰機關槍 +item.corestorable = [lightgray]核心可儲存: {0} item.explosiveness = [lightgray]爆炸性:{0} item.flammability = [lightgray]易燃性:{0} item.radioactivity = [lightgray]放射性:{0} @@ -894,6 +903,7 @@ block.sorter.name = 分類器 block.inverted-sorter.name = 反向分類器 block.message.name = 訊息板 block.illuminator.name = 照明燈 +block.illuminator.description = 小、緊湊而且可調整的光源。需要能源來運作。 block.overflow-gate.name = 溢流器 block.silicon-smelter.name = 煉矽廠 block.phase-weaver.name = 相織布編織器 @@ -1008,7 +1018,7 @@ unit.fortress.name = 要塞 unit.revenant.name = 復仇鬼 unit.eruptor.name = 爆發者 unit.chaos-array.name = 混沌陣列 -unit.eradicator.name = 消除者 +unit.eradicator.name = 殲滅者 unit.lich.name = 巫妖 unit.reaper.name = 收掠者 tutorial.next = [lightgray]<按下以繼續> diff --git a/core/assets/scripts/base.js b/core/assets/scripts/base.js new file mode 100755 index 0000000000..9b3fb5dcb4 --- /dev/null +++ b/core/assets/scripts/base.js @@ -0,0 +1,19 @@ +const log = function(context, obj){ + Vars.mods.getScripts().log(context, obj ? String(obj) : "null") +} + +const extendContent = function(classType, name, params){ + return new JavaAdapter(classType, params, name) +} + +const extend = function(classType, params){ + return new JavaAdapter(classType, params) +} + +const run = method => new java.lang.Runnable(){run: method} +const boolf = method => new Boolf(){get: method} +const boolp = method => new Boolp(){get: method} +const cons = method => new Cons(){get: method} +const prov = method => new Prov(){get: method} +const newEffect = (lifetime, renderer) => new Effects.Effect(lifetime, new Effects.EffectRenderer({render: renderer})) +const Calls = Packages.io.anuke.mindustry.gen.Call \ No newline at end of file diff --git a/core/assets/scripts/global.js b/core/assets/scripts/global.js new file mode 100755 index 0000000000..72a5440403 --- /dev/null +++ b/core/assets/scripts/global.js @@ -0,0 +1,77 @@ +//Generated class. Do not modify. + +const log = function(context, obj){ + Vars.mods.getScripts().log(context, obj ? String(obj) : "null") +} + +const extendContent = function(classType, name, params){ + return new JavaAdapter(classType, params, name) +} + +const extend = function(classType, params){ + return new JavaAdapter(classType, params) +} + +const run = method => new java.lang.Runnable(){run: method} +const boolf = method => new Boolf(){get: method} +const boolp = method => new Boolp(){get: method} +const cons = method => new Cons(){get: method} +const newEffect = (lifetime, renderer) => new Effects.Effect(lifetime, new Effects.EffectRenderer({render: renderer})) +const Calls = Packages.io.anuke.mindustry.gen.Call +importPackage(Packages.io.anuke.arc) +importPackage(Packages.io.anuke.arc.collection) +importPackage(Packages.io.anuke.arc.func) +importPackage(Packages.io.anuke.arc.graphics) +importPackage(Packages.io.anuke.arc.graphics.g2d) +importPackage(Packages.io.anuke.arc.math) +importPackage(Packages.io.anuke.arc.scene) +importPackage(Packages.io.anuke.arc.scene.actions) +importPackage(Packages.io.anuke.arc.scene.event) +importPackage(Packages.io.anuke.arc.scene.style) +importPackage(Packages.io.anuke.arc.scene.ui) +importPackage(Packages.io.anuke.arc.scene.ui.layout) +importPackage(Packages.io.anuke.arc.scene.utils) +importPackage(Packages.io.anuke.arc.util) +importPackage(Packages.io.anuke.mindustry) +importPackage(Packages.io.anuke.mindustry.ai) +importPackage(Packages.io.anuke.mindustry.content) +importPackage(Packages.io.anuke.mindustry.core) +importPackage(Packages.io.anuke.mindustry.ctype) +importPackage(Packages.io.anuke.mindustry.editor) +importPackage(Packages.io.anuke.mindustry.entities) +importPackage(Packages.io.anuke.mindustry.entities.bullet) +importPackage(Packages.io.anuke.mindustry.entities.effect) +importPackage(Packages.io.anuke.mindustry.entities.traits) +importPackage(Packages.io.anuke.mindustry.entities.type) +importPackage(Packages.io.anuke.mindustry.entities.type.base) +importPackage(Packages.io.anuke.mindustry.entities.units) +importPackage(Packages.io.anuke.mindustry.game) +importPackage(Packages.io.anuke.mindustry.gen) +importPackage(Packages.io.anuke.mindustry.graphics) +importPackage(Packages.io.anuke.mindustry.input) +importPackage(Packages.io.anuke.mindustry.maps) +importPackage(Packages.io.anuke.mindustry.maps.filters) +importPackage(Packages.io.anuke.mindustry.maps.generators) +importPackage(Packages.io.anuke.mindustry.maps.zonegen) +importPackage(Packages.io.anuke.mindustry.type) +importPackage(Packages.io.anuke.mindustry.ui) +importPackage(Packages.io.anuke.mindustry.ui.dialogs) +importPackage(Packages.io.anuke.mindustry.ui.fragments) +importPackage(Packages.io.anuke.mindustry.ui.layout) +importPackage(Packages.io.anuke.mindustry.world) +importPackage(Packages.io.anuke.mindustry.world.blocks) +importPackage(Packages.io.anuke.mindustry.world.blocks.defense) +importPackage(Packages.io.anuke.mindustry.world.blocks.defense.turrets) +importPackage(Packages.io.anuke.mindustry.world.blocks.distribution) +importPackage(Packages.io.anuke.mindustry.world.blocks.liquid) +importPackage(Packages.io.anuke.mindustry.world.blocks.logic) +importPackage(Packages.io.anuke.mindustry.world.blocks.power) +importPackage(Packages.io.anuke.mindustry.world.blocks.production) +importPackage(Packages.io.anuke.mindustry.world.blocks.sandbox) +importPackage(Packages.io.anuke.mindustry.world.blocks.storage) +importPackage(Packages.io.anuke.mindustry.world.blocks.units) +importPackage(Packages.io.anuke.mindustry.world.consumers) +importPackage(Packages.io.anuke.mindustry.world.meta) +importPackage(Packages.io.anuke.mindustry.world.meta.values) +importPackage(Packages.io.anuke.mindustry.world.modules) +importPackage(Packages.io.anuke.mindustry.world.producers) diff --git a/core/assets/scripts/wrapper.js b/core/assets/scripts/wrapper.js new file mode 100755 index 0000000000..0c7a8aba4d --- /dev/null +++ b/core/assets/scripts/wrapper.js @@ -0,0 +1,10 @@ +modName = "$MOD_NAME$" + +!function(){ + +const scriptName = "$SCRIPT_NAME$" +const print = text => log(scriptName, text); +$CODE$ + +}(); + diff --git a/core/assets/sprites/block_colors.png b/core/assets/sprites/block_colors.png index 20d01ac7fb..9a8a3dfdb2 100644 Binary files a/core/assets/sprites/block_colors.png and b/core/assets/sprites/block_colors.png differ diff --git a/core/assets/sprites/sprites.atlas b/core/assets/sprites/sprites.atlas index 52a3ecb9f8..693796cfff 100644 --- a/core/assets/sprites/sprites.atlas +++ b/core/assets/sprites/sprites.atlas @@ -7338,10388 +7338,6 @@ size: 2048,1024 format: RGBA8888 filter: Nearest,Nearest repeat: none -alpha-bg - rotate: false - xy: 1, 637 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -bar - rotate: false - xy: 1172, 225 - size: 27, 36 - split: 9, 9, 9, 9 - orig: 27, 36 - offset: 0, 0 - index: -1 -bar-top - rotate: false - xy: 1143, 230 - size: 27, 36 - split: 9, 10, 9, 10 - orig: 27, 36 - offset: 0, 0 - index: -1 -block-alloy-smelter-large - rotate: false - xy: 387, 683 - 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: 599, 266 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-alloy-smelter-tiny - rotate: false - xy: 101, 569 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-alloy-smelter-xlarge - rotate: false - xy: 131, 717 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-arc-large - rotate: false - xy: 337, 583 - 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: 1201, 237 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-arc-tiny - rotate: false - xy: 119, 569 - 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: 387, 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: 541, 69 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-armored-conveyor-tiny - rotate: false - xy: 309, 807 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-armored-conveyor-xlarge - rotate: false - xy: 1, 540 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-battery-large - rotate: false - xy: 429, 683 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-battery-large-large - rotate: false - xy: 429, 641 - 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: 1227, 237 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-battery-large-tiny - rotate: false - xy: 77, 19 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-battery-large-xlarge - rotate: false - xy: 131, 667 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-battery-medium - rotate: false - xy: 557, 229 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-battery-small - rotate: false - xy: 1253, 237 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-battery-tiny - rotate: false - xy: 77, 1 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-battery-xlarge - rotate: false - xy: 181, 717 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-blast-drill-large - rotate: false - xy: 471, 683 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-blast-drill-medium - rotate: false - xy: 1231, 565 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-blast-drill-small - rotate: false - xy: 1279, 237 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-blast-drill-tiny - rotate: false - xy: 735, 392 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-blast-drill-xlarge - rotate: false - xy: 259, 878 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-blast-mixer-large - rotate: false - xy: 471, 641 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-blast-mixer-medium - rotate: false - xy: 1265, 565 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-blast-mixer-small - rotate: false - xy: 1305, 237 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-blast-mixer-tiny - rotate: false - xy: 327, 10 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-blast-mixer-xlarge - rotate: false - xy: 1, 490 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-bridge-conduit-large - rotate: false - xy: 513, 683 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-bridge-conduit-medium - rotate: false - xy: 1299, 565 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-bridge-conduit-small - rotate: false - xy: 1331, 237 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-bridge-conduit-tiny - rotate: false - xy: 445, 11 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-bridge-conduit-xlarge - rotate: false - xy: 181, 667 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-bridge-conveyor-large - rotate: false - xy: 513, 641 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-bridge-conveyor-medium - rotate: false - xy: 1333, 565 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-bridge-conveyor-small - rotate: false - xy: 1357, 237 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-bridge-conveyor-tiny - rotate: false - xy: 2021, 401 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-bridge-conveyor-xlarge - rotate: false - xy: 259, 828 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-char-large - rotate: false - xy: 555, 683 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-char-medium - rotate: false - xy: 1367, 565 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-char-small - rotate: false - xy: 1383, 237 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-char-tiny - rotate: false - xy: 727, 262 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-char-xlarge - rotate: false - xy: 1, 440 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-cliffs-large - rotate: false - xy: 555, 641 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-cliffs-medium - rotate: false - xy: 1401, 565 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-cliffs-small - rotate: false - xy: 1409, 237 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-cliffs-tiny - rotate: false - xy: 309, 789 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-cliffs-xlarge - rotate: false - xy: 259, 778 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-coal-centrifuge-large - rotate: false - xy: 597, 683 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-coal-centrifuge-medium - rotate: false - xy: 1435, 565 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-coal-centrifuge-small - rotate: false - xy: 1435, 237 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-coal-centrifuge-tiny - rotate: false - xy: 2031, 821 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-coal-centrifuge-xlarge - rotate: false - xy: 1, 390 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-combustion-generator-large - rotate: false - xy: 597, 641 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-combustion-generator-medium - rotate: false - xy: 1469, 565 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-combustion-generator-small - rotate: false - xy: 1461, 239 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-combustion-generator-tiny - rotate: false - xy: 2031, 803 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-combustion-generator-xlarge - rotate: false - xy: 1, 340 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-command-center-large - rotate: false - xy: 639, 683 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-command-center-medium - rotate: false - xy: 1503, 565 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-command-center-small - rotate: false - xy: 1487, 239 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-command-center-tiny - rotate: false - xy: 2031, 785 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-command-center-xlarge - rotate: false - xy: 1, 290 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-conduit-large - rotate: false - xy: 639, 641 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-conduit-medium - rotate: false - xy: 1537, 565 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-conduit-small - rotate: false - xy: 1513, 239 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-conduit-tiny - rotate: false - xy: 2031, 767 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-conduit-xlarge - rotate: false - xy: 1, 240 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-container-large - rotate: false - xy: 681, 683 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-container-medium - rotate: false - xy: 1571, 565 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-container-small - rotate: false - xy: 1539, 239 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-container-tiny - rotate: false - xy: 2031, 749 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-container-xlarge - rotate: false - xy: 1, 190 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-conveyor-large - rotate: false - xy: 681, 641 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-conveyor-medium - rotate: false - xy: 1605, 565 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-conveyor-small - rotate: false - xy: 1565, 239 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-conveyor-tiny - rotate: false - xy: 2031, 731 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-conveyor-xlarge - rotate: false - xy: 1, 140 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-copper-wall-large - rotate: false - xy: 723, 683 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-copper-wall-large-large - rotate: false - xy: 723, 641 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-copper-wall-large-medium - rotate: false - xy: 1639, 565 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-copper-wall-large-small - rotate: false - xy: 1591, 239 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-copper-wall-large-tiny - rotate: false - xy: 2031, 713 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-copper-wall-large-xlarge - rotate: false - xy: 1, 90 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-copper-wall-medium - rotate: false - xy: 1673, 565 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-copper-wall-small - rotate: false - xy: 1617, 239 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-copper-wall-tiny - rotate: false - xy: 589, 8 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-copper-wall-xlarge - rotate: false - xy: 1, 40 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-core-foundation-large - rotate: false - xy: 765, 683 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-core-foundation-medium - rotate: false - xy: 1707, 565 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-core-foundation-small - rotate: false - xy: 1643, 239 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-core-foundation-tiny - rotate: false - xy: 607, 8 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-core-foundation-xlarge - rotate: false - xy: 345, 975 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-core-nucleus-large - rotate: false - xy: 765, 641 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-core-nucleus-medium - rotate: false - xy: 1741, 565 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-core-nucleus-small - rotate: false - xy: 1669, 239 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-core-nucleus-tiny - rotate: false - xy: 625, 8 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-core-nucleus-xlarge - rotate: false - xy: 395, 975 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-core-shard-large - rotate: false - xy: 807, 683 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-core-shard-medium - rotate: false - xy: 1775, 565 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-core-shard-small - rotate: false - xy: 1695, 239 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-core-shard-tiny - rotate: false - xy: 643, 8 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-core-shard-xlarge - rotate: false - xy: 445, 975 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-craters-large - rotate: false - xy: 807, 641 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-craters-medium - rotate: false - xy: 1809, 565 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-craters-small - rotate: false - xy: 1721, 239 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-craters-tiny - rotate: false - xy: 661, 8 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-craters-xlarge - rotate: false - xy: 495, 975 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-crawler-factory-large - rotate: false - xy: 849, 683 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-crawler-factory-medium - rotate: false - xy: 1843, 565 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-crawler-factory-small - rotate: false - xy: 1747, 239 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-crawler-factory-tiny - rotate: false - xy: 679, 8 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-crawler-factory-xlarge - rotate: false - xy: 545, 975 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-cryofluidmixer-large - rotate: false - xy: 849, 641 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-cryofluidmixer-medium - rotate: false - xy: 1877, 565 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-cryofluidmixer-small - rotate: false - xy: 1773, 239 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-cryofluidmixer-tiny - rotate: false - xy: 697, 8 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-cryofluidmixer-xlarge - rotate: false - xy: 595, 975 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-cultivator-large - rotate: false - xy: 891, 683 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-cultivator-medium - rotate: false - xy: 1911, 565 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-cultivator-small - rotate: false - xy: 1799, 239 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-cultivator-tiny - rotate: false - xy: 715, 8 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-cultivator-xlarge - rotate: false - xy: 645, 975 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-cyclone-large - rotate: false - xy: 891, 641 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-cyclone-medium - rotate: false - xy: 1945, 565 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-cyclone-small - rotate: false - xy: 1825, 239 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-cyclone-tiny - rotate: false - xy: 733, 8 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-cyclone-xlarge - rotate: false - xy: 695, 975 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-dagger-factory-large - rotate: false - xy: 933, 683 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-dagger-factory-medium - rotate: false - xy: 1979, 565 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-dagger-factory-small - rotate: false - xy: 1851, 239 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-dagger-factory-tiny - rotate: false - xy: 751, 8 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-dagger-factory-xlarge - rotate: false - xy: 745, 975 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-dark-metal-large - rotate: false - xy: 933, 641 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-dark-metal-medium - rotate: false - xy: 435, 29 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-dark-metal-small - rotate: false - xy: 1877, 239 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-dark-metal-tiny - rotate: false - xy: 1121, 160 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-dark-metal-xlarge - rotate: false - xy: 795, 975 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-dark-panel-1-large - rotate: false - xy: 975, 683 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-dark-panel-1-medium - rotate: false - xy: 43, 3 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-dark-panel-1-small - rotate: false - xy: 1940, 263 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-dark-panel-1-tiny - rotate: false - xy: 1139, 160 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-dark-panel-1-xlarge - rotate: false - xy: 845, 975 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-dark-panel-2-large - rotate: false - xy: 975, 641 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-dark-panel-2-medium - rotate: false - xy: 603, 326 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-dark-panel-2-small - rotate: false - xy: 1966, 263 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-dark-panel-2-tiny - rotate: false - xy: 908, 140 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-dark-panel-2-xlarge - rotate: false - xy: 895, 975 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-dark-panel-3-large - rotate: false - xy: 1017, 683 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-dark-panel-3-medium - rotate: false - xy: 599, 292 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-dark-panel-3-small - rotate: false - xy: 570, 135 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-dark-panel-3-tiny - rotate: false - xy: 908, 122 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-dark-panel-3-xlarge - rotate: false - xy: 945, 975 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-dark-panel-4-large - rotate: false - xy: 1017, 641 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-dark-panel-4-medium - rotate: false - xy: 645, 368 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-dark-panel-4-small - rotate: false - xy: 570, 109 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-dark-panel-4-tiny - rotate: false - xy: 926, 140 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-dark-panel-4-xlarge - rotate: false - xy: 995, 975 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-dark-panel-5-large - rotate: false - xy: 1059, 683 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-dark-panel-5-medium - rotate: false - xy: 687, 410 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-dark-panel-5-small - rotate: false - xy: 679, 358 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-dark-panel-5-tiny - rotate: false - xy: 908, 104 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-dark-panel-5-xlarge - rotate: false - xy: 1045, 975 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-dark-panel-6-large - rotate: false - xy: 1059, 641 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-dark-panel-6-medium - rotate: false - xy: 729, 452 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-dark-panel-6-small - rotate: false - xy: 683, 384 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-dark-panel-6-tiny - rotate: false - xy: 926, 122 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-dark-panel-6-xlarge - rotate: false - xy: 1095, 975 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-darksand-large - rotate: false - xy: 1101, 683 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-darksand-medium - rotate: false - xy: 771, 494 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-darksand-small - rotate: false - xy: 709, 384 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-darksand-tainted-water-large - rotate: false - xy: 1101, 641 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-darksand-tainted-water-medium - rotate: false - xy: 477, 158 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-darksand-tainted-water-small - rotate: false - xy: 705, 358 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-darksand-tainted-water-tiny - rotate: false - xy: 944, 140 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-darksand-tainted-water-xlarge - rotate: false - xy: 1145, 975 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-darksand-tiny - rotate: false - xy: 908, 86 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-darksand-water-large - rotate: false - xy: 1143, 683 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-darksand-water-medium - rotate: false - xy: 473, 124 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-darksand-water-small - rotate: false - xy: 731, 358 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-darksand-water-tiny - rotate: false - xy: 926, 104 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-darksand-water-xlarge - rotate: false - xy: 1195, 975 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-darksand-xlarge - rotate: false - xy: 1245, 975 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-dart-mech-pad-large - rotate: false - xy: 1143, 641 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-dart-mech-pad-medium - rotate: false - xy: 473, 90 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-dart-mech-pad-small - rotate: false - xy: 703, 332 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-dart-mech-pad-tiny - rotate: false - xy: 944, 122 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-dart-mech-pad-xlarge - rotate: false - xy: 1295, 975 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-deepwater-large - rotate: false - xy: 1185, 683 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-deepwater-medium - rotate: false - xy: 473, 56 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-deepwater-small - rotate: false - xy: 729, 332 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-deepwater-tiny - rotate: false - xy: 962, 140 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-deepwater-xlarge - rotate: false - xy: 1345, 975 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-delta-mech-pad-large - rotate: false - xy: 1185, 641 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-delta-mech-pad-medium - rotate: false - xy: 469, 22 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-delta-mech-pad-small - rotate: false - xy: 570, 83 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-delta-mech-pad-tiny - rotate: false - xy: 908, 68 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-delta-mech-pad-xlarge - rotate: false - xy: 1395, 975 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-differential-generator-large - rotate: false - xy: 1227, 683 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-differential-generator-medium - rotate: false - xy: 519, 200 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-differential-generator-small - rotate: false - xy: 541, 43 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-differential-generator-tiny - rotate: false - xy: 905, 50 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-differential-generator-xlarge - rotate: false - xy: 1445, 975 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-diode-large - rotate: false - xy: 1227, 641 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-diode-medium - rotate: false - xy: 553, 195 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-diode-small - rotate: false - xy: 567, 57 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-diode-tiny - rotate: false - xy: 926, 86 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-diode-xlarge - rotate: false - xy: 1495, 975 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-distributor-large - rotate: false - xy: 1269, 683 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-distributor-medium - rotate: false - xy: 813, 536 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-distributor-small - rotate: false - xy: 537, 17 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-distributor-tiny - rotate: false - xy: 944, 104 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-distributor-xlarge - rotate: false - xy: 1545, 975 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-door-large - rotate: false - xy: 1269, 641 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-door-large-large - rotate: false - xy: 1311, 683 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-door-large-medium - rotate: false - xy: 847, 536 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-door-large-small - rotate: false - xy: 567, 31 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-door-large-tiny - rotate: false - xy: 962, 122 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-door-large-xlarge - rotate: false - xy: 1595, 975 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-door-medium - rotate: false - xy: 881, 536 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-door-small - rotate: false - xy: 1201, 211 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-door-tiny - rotate: false - xy: 980, 140 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-door-xlarge - rotate: false - xy: 1645, 975 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-draug-factory-large - rotate: false - xy: 1311, 641 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-draug-factory-medium - rotate: false - xy: 915, 536 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-draug-factory-small - rotate: false - xy: 1227, 211 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-draug-factory-tiny - rotate: false - xy: 905, 32 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-draug-factory-xlarge - rotate: false - xy: 1695, 975 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-dunerocks-large - rotate: false - xy: 1353, 683 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-dunerocks-medium - rotate: false - xy: 949, 536 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-dunerocks-small - rotate: false - xy: 1253, 211 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-dunerocks-tiny - rotate: false - xy: 926, 68 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-dunerocks-xlarge - rotate: false - xy: 1745, 975 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-duo-large - rotate: false - xy: 1353, 641 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-duo-medium - rotate: false - xy: 983, 536 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-duo-small - rotate: false - xy: 1279, 211 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-duo-tiny - rotate: false - xy: 923, 50 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-duo-xlarge - rotate: false - xy: 1795, 975 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-force-projector-large - rotate: false - xy: 1395, 683 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-force-projector-medium - rotate: false - xy: 1017, 536 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-force-projector-small - rotate: false - xy: 1305, 211 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-force-projector-tiny - rotate: false - xy: 944, 86 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-force-projector-xlarge - rotate: false - xy: 1845, 975 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-fortress-factory-large - rotate: false - xy: 1395, 641 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-fortress-factory-medium - rotate: false - xy: 1051, 536 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-fortress-factory-small - rotate: false - xy: 1331, 211 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-fortress-factory-tiny - rotate: false - xy: 962, 104 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-fortress-factory-xlarge - rotate: false - xy: 1895, 975 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-fuse-large - rotate: false - xy: 1437, 683 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-fuse-medium - rotate: false - xy: 1085, 536 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-fuse-small - rotate: false - xy: 1357, 211 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-fuse-tiny - rotate: false - xy: 980, 122 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-fuse-xlarge - rotate: false - xy: 1945, 975 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-ghoul-factory-large - rotate: false - xy: 1437, 641 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-ghoul-factory-medium - rotate: false - xy: 1119, 536 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-ghoul-factory-small - rotate: false - xy: 1383, 211 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-ghoul-factory-tiny - rotate: false - xy: 998, 140 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-ghoul-factory-xlarge - rotate: false - xy: 1995, 975 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-glaive-ship-pad-large - rotate: false - xy: 1479, 683 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-glaive-ship-pad-medium - rotate: false - xy: 1153, 536 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-glaive-ship-pad-small - rotate: false - xy: 1409, 211 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-glaive-ship-pad-tiny - rotate: false - xy: 923, 32 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-glaive-ship-pad-xlarge - rotate: false - xy: 87, 587 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-graphite-press-large - rotate: false - xy: 1479, 641 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-graphite-press-medium - rotate: false - xy: 1187, 536 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-graphite-press-small - rotate: false - xy: 1435, 211 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-graphite-press-tiny - rotate: false - xy: 944, 68 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-graphite-press-xlarge - rotate: false - xy: 231, 717 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-grass-large - rotate: false - xy: 1521, 683 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-grass-medium - rotate: false - xy: 1221, 531 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-grass-small - rotate: false - xy: 1461, 213 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-grass-tiny - rotate: false - xy: 941, 50 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-grass-xlarge - rotate: false - xy: 231, 667 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-hail-large - rotate: false - xy: 1521, 641 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-hail-medium - rotate: false - xy: 1255, 531 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-hail-small - rotate: false - xy: 1487, 213 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-hail-tiny - rotate: false - xy: 962, 86 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-hail-xlarge - rotate: false - xy: 137, 617 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-holostone-large - rotate: false - xy: 1563, 683 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-holostone-medium - rotate: false - xy: 1289, 531 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-holostone-small - rotate: false - xy: 1513, 213 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-holostone-tiny - rotate: false - xy: 980, 104 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-holostone-xlarge - rotate: false - xy: 187, 617 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-hotrock-large - rotate: false - xy: 1563, 641 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-hotrock-medium - rotate: false - xy: 1323, 531 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-hotrock-small - rotate: false - xy: 1539, 213 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-hotrock-tiny - rotate: false - xy: 998, 122 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-hotrock-xlarge - rotate: false - xy: 237, 617 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-ice-large - rotate: false - xy: 1605, 683 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-ice-medium - rotate: false - xy: 1357, 531 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-ice-small - rotate: false - xy: 1565, 213 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-ice-snow-large - rotate: false - xy: 1605, 641 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-ice-snow-medium - rotate: false - xy: 1391, 531 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-ice-snow-small - rotate: false - xy: 1591, 213 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-ice-snow-tiny - rotate: false - xy: 1016, 140 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-ice-snow-xlarge - rotate: false - xy: 137, 567 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-ice-tiny - rotate: false - xy: 941, 32 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-ice-xlarge - rotate: false - xy: 187, 567 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-icerocks-large - rotate: false - xy: 1647, 683 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-icerocks-medium - rotate: false - xy: 1425, 531 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-icerocks-small - rotate: false - xy: 1617, 213 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-icerocks-tiny - rotate: false - xy: 962, 68 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-icerocks-xlarge - rotate: false - xy: 237, 567 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-ignarock-large - rotate: false - xy: 1647, 641 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-ignarock-medium - rotate: false - xy: 1459, 531 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-ignarock-small - rotate: false - xy: 1643, 213 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-ignarock-tiny - rotate: false - xy: 959, 50 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-ignarock-xlarge - rotate: false - xy: 281, 728 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-illuminator-large - rotate: false - xy: 1689, 683 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-illuminator-medium - rotate: false - xy: 1493, 531 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-illuminator-small - rotate: false - xy: 1669, 213 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-illuminator-tiny - rotate: false - xy: 980, 86 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-illuminator-xlarge - rotate: false - xy: 281, 678 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-impact-reactor-large - rotate: false - xy: 1689, 641 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-impact-reactor-medium - rotate: false - xy: 1527, 531 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-impact-reactor-small - rotate: false - xy: 1695, 213 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-impact-reactor-tiny - rotate: false - xy: 998, 104 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-impact-reactor-xlarge - rotate: false - xy: 287, 628 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-incinerator-large - rotate: false - xy: 1731, 683 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-incinerator-medium - rotate: false - xy: 1561, 531 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-incinerator-small - rotate: false - xy: 1721, 213 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-incinerator-tiny - rotate: false - xy: 1016, 122 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-incinerator-xlarge - rotate: false - xy: 287, 578 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-inverted-sorter-large - rotate: false - xy: 1731, 641 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-inverted-sorter-medium - rotate: false - xy: 1595, 531 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-inverted-sorter-small - rotate: false - xy: 1747, 213 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-inverted-sorter-tiny - rotate: false - xy: 1034, 140 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-inverted-sorter-xlarge - rotate: false - xy: 51, 537 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-item-source-large - rotate: false - xy: 1773, 683 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-item-source-medium - rotate: false - xy: 1629, 531 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-item-source-small - rotate: false - xy: 1773, 213 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-item-source-tiny - rotate: false - xy: 959, 32 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-item-source-xlarge - rotate: false - xy: 51, 487 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-item-void-large - rotate: false - xy: 1773, 641 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-item-void-medium - rotate: false - xy: 1663, 531 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-item-void-small - rotate: false - xy: 1799, 213 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-item-void-tiny - rotate: false - xy: 980, 68 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-item-void-xlarge - rotate: false - xy: 51, 437 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-javelin-ship-pad-large - rotate: false - xy: 1815, 683 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-javelin-ship-pad-medium - rotate: false - xy: 1697, 531 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-javelin-ship-pad-small - rotate: false - xy: 1825, 213 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-javelin-ship-pad-tiny - rotate: false - xy: 977, 50 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-javelin-ship-pad-xlarge - rotate: false - xy: 51, 387 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-junction-large - rotate: false - xy: 1815, 641 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-junction-medium - rotate: false - xy: 1731, 531 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-junction-small - rotate: false - xy: 1851, 213 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-junction-tiny - rotate: false - xy: 998, 86 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-junction-xlarge - rotate: false - xy: 51, 337 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-kiln-large - rotate: false - xy: 1857, 683 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-kiln-medium - rotate: false - xy: 1765, 531 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-kiln-small - rotate: false - xy: 1877, 213 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-kiln-tiny - rotate: false - xy: 1016, 104 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-kiln-xlarge - rotate: false - xy: 51, 287 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-lancer-large - rotate: false - xy: 1857, 641 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-lancer-medium - rotate: false - xy: 1799, 531 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-lancer-small - rotate: false - xy: 1903, 231 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-lancer-tiny - rotate: false - xy: 1034, 122 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-lancer-xlarge - rotate: false - xy: 51, 237 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-laser-drill-large - rotate: false - xy: 1899, 683 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-laser-drill-medium - rotate: false - xy: 1833, 531 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-laser-drill-small - rotate: false - xy: 1903, 205 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-laser-drill-tiny - rotate: false - xy: 1052, 140 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-laser-drill-xlarge - rotate: false - xy: 51, 187 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-launch-pad-large - rotate: false - xy: 1899, 641 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-launch-pad-large-large - rotate: false - xy: 1941, 683 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-launch-pad-large-medium - rotate: false - xy: 1867, 531 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-launch-pad-large-small - rotate: false - xy: 301, 2 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-launch-pad-large-tiny - rotate: false - xy: 977, 32 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-launch-pad-large-xlarge - rotate: false - xy: 51, 137 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-launch-pad-medium - rotate: false - xy: 1901, 531 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-launch-pad-small - rotate: false - xy: 1992, 263 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-launch-pad-tiny - rotate: false - xy: 998, 68 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-launch-pad-xlarge - rotate: false - xy: 51, 87 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-liquid-junction-large - rotate: false - xy: 1941, 641 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-liquid-junction-medium - rotate: false - xy: 1935, 531 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-liquid-junction-small - rotate: false - xy: 1929, 231 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-liquid-junction-tiny - rotate: false - xy: 995, 50 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-liquid-junction-xlarge - rotate: false - xy: 51, 37 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-liquid-router-large - rotate: false - xy: 1983, 683 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-liquid-router-medium - rotate: false - xy: 1969, 531 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-liquid-router-small - rotate: false - xy: 1929, 205 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-liquid-router-tiny - rotate: false - xy: 1016, 86 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-liquid-router-xlarge - rotate: false - xy: 309, 925 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-liquid-source-large - rotate: false - xy: 1983, 641 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-liquid-source-medium - rotate: false - xy: 2003, 531 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-liquid-source-small - rotate: false - xy: 1955, 237 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-liquid-source-tiny - rotate: false - xy: 1034, 104 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-liquid-source-xlarge - rotate: false - xy: 309, 875 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-liquid-tank-large - rotate: false - xy: 351, 541 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-liquid-tank-medium - rotate: false - xy: 2013, 565 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-liquid-tank-small - rotate: false - xy: 1955, 211 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-liquid-tank-tiny - rotate: false - xy: 1052, 122 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-liquid-tank-xlarge - rotate: false - xy: 359, 925 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-magmarock-large - rotate: false - xy: 351, 499 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-magmarock-medium - rotate: false - xy: 351, 3 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-magmarock-small - rotate: false - xy: 1981, 237 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-magmarock-tiny - rotate: false - xy: 1070, 140 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-magmarock-xlarge - rotate: false - xy: 309, 825 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-mass-driver-large - rotate: false - xy: 351, 457 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-mass-driver-medium - rotate: false - xy: 385, 3 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-mass-driver-small - rotate: false - xy: 1981, 211 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-mass-driver-tiny - rotate: false - xy: 995, 32 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-mass-driver-xlarge - rotate: false - xy: 359, 875 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-mechanical-drill-large - rotate: false - xy: 351, 415 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-mechanical-drill-medium - rotate: false - xy: 591, 229 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-mechanical-drill-small - rotate: false - xy: 2007, 237 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-mechanical-drill-tiny - rotate: false - xy: 1016, 68 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-mechanical-drill-xlarge - rotate: false - xy: 409, 925 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-mechanical-pump-large - rotate: false - xy: 351, 373 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-mechanical-pump-medium - rotate: false - xy: 587, 195 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-mechanical-pump-small - rotate: false - xy: 2007, 211 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-mechanical-pump-tiny - rotate: false - xy: 1013, 50 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-mechanical-pump-xlarge - rotate: false - xy: 359, 825 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-meltdown-large - rotate: false - xy: 351, 331 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-meltdown-medium - rotate: false - xy: 637, 326 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-meltdown-small - rotate: false - xy: 419, 3 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-meltdown-tiny - rotate: false - xy: 1034, 86 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-meltdown-xlarge - rotate: false - xy: 409, 875 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-melter-large - rotate: false - xy: 351, 289 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-melter-medium - rotate: false - xy: 633, 292 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-melter-small - rotate: false - xy: 563, 5 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-melter-tiny - rotate: false - xy: 1052, 104 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-melter-xlarge - rotate: false - xy: 459, 925 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-mend-projector-large - rotate: false - xy: 351, 247 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-mend-projector-medium - rotate: false - xy: 625, 258 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-mend-projector-small - rotate: false - xy: 596, 130 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-mend-projector-tiny - rotate: false - xy: 1070, 122 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-mend-projector-xlarge - rotate: false - xy: 409, 825 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-mender-large - rotate: false - xy: 351, 205 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-mender-medium - rotate: false - xy: 625, 224 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-mender-small - rotate: false - xy: 596, 104 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-mender-tiny - rotate: false - xy: 1088, 140 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-mender-xlarge - rotate: false - xy: 459, 875 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-message-large - rotate: false - xy: 351, 163 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-message-medium - rotate: false - xy: 621, 190 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-message-small - rotate: false - xy: 622, 130 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-message-tiny - rotate: false - xy: 1013, 32 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-message-xlarge - rotate: false - xy: 509, 925 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-metal-floor-2-large - rotate: false - xy: 351, 121 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-metal-floor-2-medium - rotate: false - xy: 659, 258 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-metal-floor-2-small - rotate: false - xy: 622, 104 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-metal-floor-2-tiny - rotate: false - xy: 1034, 68 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-metal-floor-2-xlarge - rotate: false - xy: 459, 825 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-metal-floor-3-large - rotate: false - xy: 351, 79 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-metal-floor-3-medium - rotate: false - xy: 659, 224 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-metal-floor-3-small - rotate: false - xy: 648, 130 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-metal-floor-3-tiny - rotate: false - xy: 1031, 50 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-metal-floor-3-xlarge - rotate: false - xy: 509, 875 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-metal-floor-5-large - rotate: false - xy: 351, 37 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-metal-floor-5-medium - rotate: false - xy: 655, 190 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-metal-floor-5-small - rotate: false - xy: 648, 104 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-metal-floor-5-tiny - rotate: false - xy: 1052, 86 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-metal-floor-5-xlarge - rotate: false - xy: 559, 925 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-metal-floor-damaged-large - rotate: false - xy: 379, 583 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-metal-floor-damaged-medium - rotate: false - xy: 667, 292 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-metal-floor-damaged-small - rotate: false - xy: 674, 130 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-metal-floor-damaged-tiny - rotate: false - xy: 1070, 104 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-metal-floor-damaged-xlarge - rotate: false - xy: 509, 825 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-metal-floor-large - rotate: false - xy: 393, 541 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-metal-floor-medium - rotate: false - xy: 693, 258 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-metal-floor-small - rotate: false - xy: 674, 104 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-metal-floor-tiny - rotate: false - xy: 1088, 122 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-metal-floor-xlarge - rotate: false - xy: 559, 875 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-moss-large - rotate: false - xy: 393, 499 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-moss-medium - rotate: false - xy: 693, 224 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-moss-small - rotate: false - xy: 700, 130 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-moss-tiny - rotate: false - xy: 1031, 32 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-moss-xlarge - rotate: false - xy: 609, 925 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-multi-press-large - rotate: false - xy: 393, 457 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-multi-press-medium - rotate: false - xy: 689, 190 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-multi-press-small - rotate: false - xy: 700, 104 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-multi-press-tiny - rotate: false - xy: 1052, 68 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-multi-press-xlarge - rotate: false - xy: 559, 825 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-oil-extractor-large - rotate: false - xy: 393, 415 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-oil-extractor-medium - rotate: false - xy: 763, 452 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-oil-extractor-small - rotate: false - xy: 726, 130 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-oil-extractor-tiny - rotate: false - xy: 1049, 50 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-oil-extractor-xlarge - rotate: false - xy: 609, 875 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-omega-mech-pad-large - rotate: false - xy: 393, 373 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-omega-mech-pad-medium - rotate: false - xy: 805, 494 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-omega-mech-pad-small - rotate: false - xy: 726, 104 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-omega-mech-pad-tiny - rotate: false - xy: 1070, 86 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-omega-mech-pad-xlarge - rotate: false - xy: 659, 925 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-overdrive-projector-large - rotate: false - xy: 393, 331 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-overdrive-projector-medium - rotate: false - xy: 797, 460 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-overdrive-projector-small - rotate: false - xy: 752, 130 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-overdrive-projector-tiny - rotate: false - xy: 1088, 104 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-overdrive-projector-xlarge - rotate: false - xy: 609, 825 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-overflow-gate-large - rotate: false - xy: 393, 289 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-overflow-gate-medium - rotate: false - xy: 839, 502 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-overflow-gate-small - rotate: false - xy: 752, 104 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-overflow-gate-tiny - rotate: false - xy: 1049, 32 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-overflow-gate-xlarge - rotate: false - xy: 659, 875 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-pebbles-large - rotate: false - xy: 393, 247 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-pebbles-medium - rotate: false - xy: 873, 502 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-pebbles-small - rotate: false - xy: 596, 78 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-pebbles-tiny - rotate: false - xy: 1070, 68 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-pebbles-xlarge - rotate: false - xy: 709, 925 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-phantom-factory-large - rotate: false - xy: 393, 205 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-phantom-factory-medium - rotate: false - xy: 907, 502 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-phantom-factory-small - rotate: false - xy: 622, 78 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-phantom-factory-tiny - rotate: false - xy: 1067, 50 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-phantom-factory-xlarge - rotate: false - xy: 659, 825 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-phase-conduit-large - rotate: false - xy: 393, 163 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-phase-conduit-medium - rotate: false - xy: 941, 502 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-phase-conduit-small - rotate: false - xy: 648, 78 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-phase-conduit-tiny - rotate: false - xy: 1088, 86 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-phase-conduit-xlarge - rotate: false - xy: 709, 875 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-phase-conveyor-large - rotate: false - xy: 393, 121 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-phase-conveyor-medium - rotate: false - xy: 975, 502 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-phase-conveyor-small - rotate: false - xy: 674, 78 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-phase-conveyor-tiny - rotate: false - xy: 1067, 32 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-phase-conveyor-xlarge - rotate: false - xy: 759, 925 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-phase-wall-large - rotate: false - xy: 393, 79 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-phase-wall-large-large - rotate: false - xy: 393, 37 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-phase-wall-large-medium - rotate: false - xy: 1009, 502 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-phase-wall-large-small - rotate: false - xy: 700, 78 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-phase-wall-large-tiny - rotate: false - xy: 1088, 68 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-phase-wall-large-xlarge - rotate: false - xy: 709, 825 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-phase-wall-medium - rotate: false - xy: 1043, 502 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-phase-wall-small - rotate: false - xy: 726, 78 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-phase-wall-tiny - rotate: false - xy: 1085, 50 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-phase-wall-xlarge - rotate: false - xy: 759, 875 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-phase-weaver-large - rotate: false - xy: 421, 599 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-phase-weaver-medium - rotate: false - xy: 1077, 502 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-phase-weaver-small - rotate: false - xy: 752, 78 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-phase-weaver-tiny - rotate: false - xy: 1085, 32 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-phase-weaver-xlarge - rotate: false - xy: 809, 925 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-pine-large - rotate: false - xy: 463, 599 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-pine-medium - rotate: false - xy: 1111, 502 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-pine-small - rotate: false - xy: 593, 52 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-pine-tiny - rotate: false - xy: 1106, 140 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-pine-xlarge - rotate: false - xy: 759, 825 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-plastanium-compressor-large - rotate: false - xy: 505, 599 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-plastanium-compressor-medium - rotate: false - xy: 1145, 502 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-plastanium-compressor-small - rotate: false - xy: 619, 52 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-plastanium-compressor-tiny - rotate: false - xy: 1106, 122 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-plastanium-compressor-xlarge - rotate: false - xy: 809, 875 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-plastanium-wall-large - rotate: false - xy: 547, 599 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-plastanium-wall-large-large - rotate: false - xy: 589, 599 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-plastanium-wall-large-medium - rotate: false - xy: 1179, 502 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-plastanium-wall-large-small - rotate: false - xy: 645, 52 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-plastanium-wall-large-tiny - rotate: false - xy: 1106, 104 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-plastanium-wall-large-xlarge - rotate: false - xy: 859, 925 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-plastanium-wall-medium - rotate: false - xy: 1213, 497 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-plastanium-wall-small - rotate: false - xy: 671, 52 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-plastanium-wall-tiny - rotate: false - xy: 1106, 86 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-plastanium-wall-xlarge - rotate: false - xy: 809, 825 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-plated-conduit-large - rotate: false - xy: 631, 599 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-plated-conduit-medium - rotate: false - xy: 1247, 497 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-plated-conduit-small - rotate: false - xy: 697, 52 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-plated-conduit-tiny - rotate: false - xy: 1106, 68 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-plated-conduit-xlarge - rotate: false - xy: 859, 875 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-pneumatic-drill-large - rotate: false - xy: 673, 599 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-pneumatic-drill-medium - rotate: false - xy: 1281, 497 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-pneumatic-drill-small - rotate: false - xy: 723, 52 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-pneumatic-drill-tiny - rotate: false - xy: 1103, 50 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-pneumatic-drill-xlarge - rotate: false - xy: 909, 925 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-power-node-large - rotate: false - xy: 715, 599 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-power-node-large-large - rotate: false - xy: 757, 599 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-power-node-large-medium - rotate: false - xy: 1315, 497 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-power-node-large-small - rotate: false - xy: 749, 52 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-power-node-large-tiny - rotate: false - xy: 1103, 32 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-power-node-large-xlarge - rotate: false - xy: 859, 825 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-power-node-medium - rotate: false - xy: 1349, 497 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-power-node-small - rotate: false - xy: 593, 26 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-power-node-tiny - rotate: false - xy: 1124, 142 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-power-node-xlarge - rotate: false - xy: 909, 875 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-power-source-large - rotate: false - xy: 799, 599 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-power-source-medium - rotate: false - xy: 1383, 497 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-power-source-small - rotate: false - xy: 619, 26 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-power-source-tiny - rotate: false - xy: 1124, 124 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-power-source-xlarge - rotate: false - xy: 959, 925 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-power-void-large - rotate: false - xy: 841, 599 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-power-void-medium - rotate: false - xy: 1417, 497 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-power-void-small - rotate: false - xy: 645, 26 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-power-void-tiny - rotate: false - xy: 1124, 106 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-power-void-xlarge - rotate: false - xy: 909, 825 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-pulse-conduit-large - rotate: false - xy: 883, 599 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-pulse-conduit-medium - rotate: false - xy: 1451, 497 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-pulse-conduit-small - rotate: false - xy: 671, 26 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-pulse-conduit-tiny - rotate: false - xy: 1124, 88 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-pulse-conduit-xlarge - rotate: false - xy: 959, 875 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-pulverizer-large - rotate: false - xy: 925, 599 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-pulverizer-medium - rotate: false - xy: 1485, 497 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-pulverizer-small - rotate: false - xy: 697, 26 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-pulverizer-tiny - rotate: false - xy: 1124, 70 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-pulverizer-xlarge - rotate: false - xy: 1009, 925 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-pyratite-mixer-large - rotate: false - xy: 967, 599 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-pyratite-mixer-medium - rotate: false - xy: 1519, 497 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-pyratite-mixer-small - rotate: false - xy: 723, 26 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-pyratite-mixer-tiny - rotate: false - xy: 1142, 142 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-pyratite-mixer-xlarge - rotate: false - xy: 959, 825 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-repair-point-large - rotate: false - xy: 1009, 599 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-repair-point-medium - rotate: false - xy: 1553, 497 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-repair-point-small - rotate: false - xy: 749, 26 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-repair-point-tiny - rotate: false - xy: 1142, 124 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-repair-point-xlarge - rotate: false - xy: 1009, 875 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-revenant-factory-large - rotate: false - xy: 1051, 599 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-revenant-factory-medium - rotate: false - xy: 1587, 497 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-revenant-factory-small - rotate: false - xy: 2021, 471 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-revenant-factory-tiny - rotate: false - xy: 1142, 106 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-revenant-factory-xlarge - rotate: false - xy: 1059, 925 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-ripple-large - rotate: false - xy: 1093, 599 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-ripple-medium - rotate: false - xy: 1621, 497 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-ripple-small - rotate: false - xy: 2021, 445 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-ripple-tiny - rotate: false - xy: 1142, 88 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-ripple-xlarge - rotate: false - xy: 1009, 825 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-rock-large - rotate: false - xy: 1135, 599 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-rock-medium - rotate: false - xy: 1655, 497 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-rock-small - rotate: false - xy: 2021, 419 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-rock-tiny - rotate: false - xy: 1142, 70 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-rock-xlarge - rotate: false - xy: 1059, 875 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-rocks-large - rotate: false - xy: 1177, 599 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-rocks-medium - rotate: false - xy: 1689, 497 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-rocks-small - rotate: false - xy: 2003, 303 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-rocks-tiny - rotate: false - xy: 2025, 695 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-rocks-xlarge - rotate: false - xy: 1109, 925 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-rotary-pump-large - rotate: false - xy: 1219, 599 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-rotary-pump-medium - rotate: false - xy: 1723, 497 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-rotary-pump-small - rotate: false - xy: 855, 210 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-rotary-pump-tiny - rotate: false - xy: 2025, 677 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-rotary-pump-xlarge - rotate: false - xy: 1059, 825 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-router-large - rotate: false - xy: 1261, 599 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-router-medium - rotate: false - xy: 1757, 497 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-router-small - rotate: false - xy: 881, 210 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-router-tiny - rotate: false - xy: 2025, 659 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-router-xlarge - rotate: false - xy: 1109, 875 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-rtg-generator-large - rotate: false - xy: 1303, 599 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-rtg-generator-medium - rotate: false - xy: 1791, 497 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-rtg-generator-small - rotate: false - xy: 907, 210 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-rtg-generator-tiny - rotate: false - xy: 2025, 641 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-rtg-generator-xlarge - rotate: false - xy: 1159, 925 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-salt-large - rotate: false - xy: 1345, 599 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-salt-medium - rotate: false - xy: 1825, 497 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-salt-small - rotate: false - xy: 933, 210 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-salt-tiny - rotate: false - xy: 879, 13 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-salt-xlarge - rotate: false - xy: 1109, 825 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-saltrocks-large - rotate: false - xy: 1387, 599 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-saltrocks-medium - rotate: false - xy: 1859, 497 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-saltrocks-small - rotate: false - xy: 959, 210 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-saltrocks-tiny - rotate: false - xy: 2029, 513 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-saltrocks-xlarge - rotate: false - xy: 1159, 875 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-salvo-large - rotate: false - xy: 1429, 599 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-salvo-medium - rotate: false - xy: 1893, 497 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-salvo-small - rotate: false - xy: 985, 210 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-salvo-tiny - rotate: false - xy: 897, 13 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-salvo-xlarge - rotate: false - xy: 1209, 925 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-sand-boulder-large - rotate: false - xy: 1471, 599 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-sand-boulder-medium - rotate: false - xy: 1927, 497 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-sand-boulder-small - rotate: false - xy: 1011, 210 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-sand-boulder-tiny - rotate: false - xy: 915, 14 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-sand-boulder-xlarge - rotate: false - xy: 1159, 825 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-sand-large - rotate: false - xy: 1513, 599 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-sand-medium - rotate: false - xy: 1961, 497 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-sand-small - rotate: false - xy: 1037, 210 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-sand-tiny - rotate: false - xy: 933, 14 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-sand-water-large - rotate: false - xy: 1555, 599 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-sand-water-medium - rotate: false - xy: 1995, 497 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-sand-water-small - rotate: false - xy: 1063, 210 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-sand-water-tiny - rotate: false - xy: 951, 14 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-sand-water-xlarge - rotate: false - xy: 1209, 875 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-sand-xlarge - rotate: false - xy: 1259, 925 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-sandrocks-large - rotate: false - xy: 1597, 599 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-sandrocks-medium - rotate: false - xy: 797, 426 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-sandrocks-small - rotate: false - xy: 1089, 210 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-sandrocks-tiny - rotate: false - xy: 969, 14 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-sandrocks-xlarge - rotate: false - xy: 1209, 825 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-scatter-large - rotate: false - xy: 1639, 599 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-scatter-medium - rotate: false - xy: 831, 460 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-scatter-small - rotate: false - xy: 1115, 210 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-scatter-tiny - rotate: false - xy: 987, 14 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-scatter-xlarge - rotate: false - xy: 1259, 875 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-scorch-large - rotate: false - xy: 1681, 599 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-scorch-medium - rotate: false - xy: 831, 426 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-scorch-small - rotate: false - xy: 1141, 204 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-scorch-tiny - rotate: false - xy: 1005, 14 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-scorch-xlarge - rotate: false - xy: 1309, 925 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-scrap-wall-gigantic-large - rotate: false - xy: 1723, 599 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-scrap-wall-gigantic-medium - rotate: false - xy: 865, 468 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-scrap-wall-gigantic-small - rotate: false - xy: 1167, 199 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-scrap-wall-gigantic-tiny - rotate: false - xy: 1023, 14 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-scrap-wall-gigantic-xlarge - rotate: false - xy: 1259, 825 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-scrap-wall-huge-large - rotate: false - xy: 1765, 599 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-scrap-wall-huge-medium - rotate: false - xy: 865, 434 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-scrap-wall-huge-small - rotate: false - xy: 703, 306 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-scrap-wall-huge-tiny - rotate: false - xy: 1041, 14 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-scrap-wall-huge-xlarge - rotate: false - xy: 1309, 875 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-scrap-wall-large - rotate: false - xy: 1807, 599 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-scrap-wall-large-large - rotate: false - xy: 1849, 599 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-scrap-wall-large-medium - rotate: false - xy: 899, 468 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-scrap-wall-large-small - rotate: false - xy: 729, 306 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-scrap-wall-large-tiny - rotate: false - xy: 1059, 14 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-scrap-wall-large-xlarge - rotate: false - xy: 1359, 925 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-scrap-wall-medium - rotate: false - xy: 899, 434 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-scrap-wall-small - rotate: false - xy: 727, 280 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-scrap-wall-tiny - rotate: false - xy: 1077, 14 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-scrap-wall-xlarge - rotate: false - xy: 1309, 825 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-separator-large - rotate: false - xy: 1891, 599 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-separator-medium - rotate: false - xy: 933, 468 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-separator-small - rotate: false - xy: 1955, 185 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-separator-tiny - rotate: false - xy: 1095, 14 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-separator-xlarge - rotate: false - xy: 1359, 875 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-shale-boulder-large - rotate: false - xy: 1933, 599 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-shale-boulder-medium - rotate: false - xy: 933, 434 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-shale-boulder-small - rotate: false - xy: 1981, 185 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-shale-boulder-tiny - rotate: false - xy: 769, 4 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-shale-boulder-xlarge - rotate: false - xy: 1409, 925 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-shale-large - rotate: false - xy: 1975, 599 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-shale-medium - rotate: false - xy: 967, 468 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-shale-small - rotate: false - xy: 2007, 185 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-shale-tiny - rotate: false - xy: 787, 4 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-shale-xlarge - rotate: false - xy: 1359, 825 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-shalerocks-large - rotate: false - xy: 435, 557 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-shalerocks-medium - rotate: false - xy: 967, 434 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-shalerocks-small - rotate: false - xy: 791, 204 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-shalerocks-tiny - rotate: false - xy: 805, 4 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-shalerocks-xlarge - rotate: false - xy: 1409, 875 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-shock-mine-large - rotate: false - xy: 435, 515 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-shock-mine-medium - rotate: false - xy: 1001, 468 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-shock-mine-small - rotate: false - xy: 817, 204 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-shock-mine-tiny - rotate: false - xy: 823, 4 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-shock-mine-xlarge - rotate: false - xy: 1459, 925 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-shrubs-large - rotate: false - xy: 477, 557 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-shrubs-medium - rotate: false - xy: 1001, 434 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-shrubs-small - rotate: false - xy: 789, 178 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-shrubs-tiny - rotate: false - xy: 841, 4 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-shrubs-xlarge - rotate: false - xy: 1409, 825 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-silicon-smelter-large - rotate: false - xy: 435, 473 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-silicon-smelter-medium - rotate: false - xy: 1035, 468 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-silicon-smelter-small - rotate: false - xy: 815, 178 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-silicon-smelter-tiny - rotate: false - xy: 859, 4 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-silicon-smelter-xlarge - rotate: false - xy: 1459, 875 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-snow-large - rotate: false - xy: 477, 515 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-snow-medium - rotate: false - xy: 1035, 434 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-snow-pine-large - rotate: false - xy: 519, 557 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-snow-pine-medium - rotate: false - xy: 1069, 468 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-snow-pine-small - rotate: false - xy: 783, 152 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-snow-pine-tiny - rotate: false - xy: 1113, 14 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-snow-pine-xlarge - rotate: false - xy: 1509, 925 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-snow-small - rotate: false - xy: 809, 152 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-snow-tiny - rotate: false - xy: 463, 4 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-snow-xlarge - rotate: false - xy: 1459, 825 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-snowrock-large - rotate: false - xy: 435, 431 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-snowrock-medium - rotate: false - xy: 1069, 434 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-snowrock-small - rotate: false - xy: 778, 126 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-snowrock-tiny - rotate: false - xy: 481, 4 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-snowrock-xlarge - rotate: false - xy: 1509, 875 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-snowrocks-large - rotate: false - xy: 477, 473 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-snowrocks-medium - rotate: false - xy: 1103, 468 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-snowrocks-small - rotate: false - xy: 778, 100 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-snowrocks-tiny - rotate: false - xy: 499, 4 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-snowrocks-xlarge - rotate: false - xy: 1559, 925 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-solar-panel-large - rotate: false - xy: 519, 515 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-solar-panel-large-large - rotate: false - xy: 561, 557 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-solar-panel-large-medium - rotate: false - xy: 1103, 434 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-solar-panel-large-small - rotate: false - xy: 804, 126 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-solar-panel-large-tiny - rotate: false - xy: 517, 4 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-solar-panel-large-xlarge - rotate: false - xy: 1509, 825 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-solar-panel-medium - rotate: false - xy: 1137, 468 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-solar-panel-small - rotate: false - xy: 804, 100 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-solar-panel-tiny - rotate: false - xy: 1193, 193 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-solar-panel-xlarge - rotate: false - xy: 1559, 875 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-sorter-large - rotate: false - xy: 435, 389 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-sorter-medium - rotate: false - xy: 1137, 434 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-sorter-small - rotate: false - xy: 778, 74 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-sorter-tiny - rotate: false - xy: 1211, 193 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-sorter-xlarge - rotate: false - xy: 1609, 925 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-spawn-large - rotate: false - xy: 477, 431 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-spawn-medium - rotate: false - xy: 1171, 468 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-spawn-small - rotate: false - xy: 804, 74 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-spawn-tiny - rotate: false - xy: 1229, 193 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-spawn-xlarge - rotate: false - xy: 1559, 825 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-spectre-large - rotate: false - xy: 519, 473 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-spectre-medium - rotate: false - xy: 1171, 434 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-spectre-small - rotate: false - xy: 775, 48 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-spectre-tiny - rotate: false - xy: 1247, 193 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-spectre-xlarge - rotate: false - xy: 1609, 875 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-spirit-factory-large - rotate: false - xy: 561, 515 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-spirit-factory-medium - rotate: false - xy: 1205, 463 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-spirit-factory-small - rotate: false - xy: 801, 48 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-spirit-factory-tiny - rotate: false - xy: 1265, 193 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-spirit-factory-xlarge - rotate: false - xy: 1659, 925 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-spore-cluster-large - rotate: false - xy: 603, 557 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-spore-cluster-medium - rotate: false - xy: 1239, 463 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-spore-cluster-small - rotate: false - xy: 775, 22 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-spore-cluster-tiny - rotate: false - xy: 1283, 193 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-spore-cluster-xlarge - rotate: false - xy: 1609, 825 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-spore-moss-large - rotate: false - xy: 435, 347 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-spore-moss-medium - rotate: false - xy: 1273, 463 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-spore-moss-small - rotate: false - xy: 801, 22 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-spore-moss-tiny - rotate: false - xy: 1301, 193 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-spore-moss-xlarge - rotate: false - xy: 1659, 875 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-spore-pine-large - rotate: false - xy: 477, 389 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-spore-pine-medium - rotate: false - xy: 1307, 463 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-spore-pine-small - rotate: false - xy: 835, 152 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-spore-pine-tiny - rotate: false - xy: 1319, 193 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-spore-pine-xlarge - rotate: false - xy: 1709, 925 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-spore-press-large - rotate: false - xy: 519, 431 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-spore-press-medium - rotate: false - xy: 1341, 463 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-spore-press-small - rotate: false - xy: 830, 126 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-spore-press-tiny - rotate: false - xy: 1337, 193 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-spore-press-xlarge - rotate: false - xy: 1659, 825 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-sporerocks-large - rotate: false - xy: 561, 473 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-sporerocks-medium - rotate: false - xy: 1375, 463 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-sporerocks-small - rotate: false - xy: 830, 100 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-sporerocks-tiny - rotate: false - xy: 1355, 193 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-sporerocks-xlarge - rotate: false - xy: 1709, 875 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-stone-large - rotate: false - xy: 603, 515 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-stone-medium - rotate: false - xy: 1409, 463 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-stone-small - rotate: false - xy: 830, 74 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-stone-tiny - rotate: false - xy: 1373, 193 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-stone-xlarge - rotate: false - xy: 1759, 925 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-surge-tower-large - rotate: false - xy: 645, 557 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-surge-tower-medium - rotate: false - xy: 1443, 463 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-surge-tower-small - rotate: false - xy: 827, 48 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-surge-tower-tiny - rotate: false - xy: 1391, 193 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-surge-tower-xlarge - rotate: false - xy: 1709, 825 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-surge-wall-large - rotate: false - xy: 435, 305 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-surge-wall-large-large - rotate: false - xy: 477, 347 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-surge-wall-large-medium - rotate: false - xy: 1477, 463 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-surge-wall-large-small - rotate: false - xy: 827, 22 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-surge-wall-large-tiny - rotate: false - xy: 1409, 193 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-surge-wall-large-xlarge - rotate: false - xy: 1759, 875 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-surge-wall-medium - rotate: false - xy: 1511, 463 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-surge-wall-small - rotate: false - xy: 841, 178 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-surge-wall-tiny - rotate: false - xy: 1427, 193 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-surge-wall-xlarge - rotate: false - xy: 1809, 925 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-swarmer-large - rotate: false - xy: 519, 389 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-swarmer-medium - rotate: false - xy: 1545, 463 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-swarmer-small - rotate: false - xy: 867, 184 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-swarmer-tiny - rotate: false - xy: 1445, 193 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-swarmer-xlarge - rotate: false - xy: 1759, 825 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-tainted-water-large - rotate: false - xy: 561, 431 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-tainted-water-medium - rotate: false - xy: 1579, 463 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-tainted-water-small - rotate: false - xy: 893, 184 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-tainted-water-tiny - rotate: false - xy: 1463, 195 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-tainted-water-xlarge - rotate: false - xy: 1809, 875 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-tar-large - rotate: false - xy: 603, 473 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-tar-medium - rotate: false - xy: 1613, 463 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-tar-small - rotate: false - xy: 919, 184 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-tar-tiny - rotate: false - xy: 1481, 195 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-tar-xlarge - rotate: false - xy: 1859, 925 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-tau-mech-pad-large - rotate: false - xy: 645, 515 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-tau-mech-pad-medium - rotate: false - xy: 1647, 463 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-tau-mech-pad-small - rotate: false - xy: 945, 184 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-tau-mech-pad-tiny - rotate: false - xy: 1499, 195 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-tau-mech-pad-xlarge - rotate: false - xy: 1809, 825 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-tendrils-large - rotate: false - xy: 687, 557 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-tendrils-medium - rotate: false - xy: 1681, 463 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-tendrils-small - rotate: false - xy: 971, 184 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-tendrils-tiny - rotate: false - xy: 1517, 195 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-tendrils-xlarge - rotate: false - xy: 1859, 875 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-thermal-generator-large - rotate: false - xy: 435, 263 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-thermal-generator-medium - rotate: false - xy: 1715, 463 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-thermal-generator-small - rotate: false - xy: 997, 184 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-thermal-generator-tiny - rotate: false - xy: 1535, 195 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-thermal-generator-xlarge - rotate: false - xy: 1909, 925 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-thermal-pump-large - rotate: false - xy: 477, 305 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-thermal-pump-medium - rotate: false - xy: 1749, 463 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-thermal-pump-small - rotate: false - xy: 1023, 184 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-thermal-pump-tiny - rotate: false - xy: 1553, 195 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-thermal-pump-xlarge - rotate: false - xy: 1859, 825 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-thorium-reactor-large - rotate: false - xy: 519, 347 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-thorium-reactor-medium - rotate: false - xy: 1783, 463 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-thorium-reactor-small - rotate: false - xy: 1049, 184 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-thorium-reactor-tiny - rotate: false - xy: 1571, 195 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-thorium-reactor-xlarge - rotate: false - xy: 1909, 875 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-thorium-wall-large - rotate: false - xy: 561, 389 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-thorium-wall-large-large - rotate: false - xy: 603, 431 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-thorium-wall-large-medium - rotate: false - xy: 1817, 463 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-thorium-wall-large-small - rotate: false - xy: 1075, 184 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-thorium-wall-large-tiny - rotate: false - xy: 1589, 195 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-thorium-wall-large-xlarge - rotate: false - xy: 1959, 925 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-thorium-wall-medium - rotate: false - xy: 1851, 463 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-thorium-wall-small - rotate: false - xy: 1101, 184 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-thorium-wall-tiny - rotate: false - xy: 1607, 195 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-thorium-wall-xlarge - rotate: false - xy: 1909, 825 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-thruster-large - rotate: false - xy: 645, 473 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-thruster-medium - rotate: false - xy: 1885, 463 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-thruster-small - rotate: false - xy: 861, 152 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-thruster-tiny - rotate: false - xy: 1625, 195 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-thruster-xlarge - rotate: false - xy: 1959, 875 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-titan-factory-large - rotate: false - xy: 687, 515 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-titan-factory-medium - rotate: false - xy: 1919, 463 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-titan-factory-small - rotate: false - xy: 856, 126 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-titan-factory-tiny - rotate: false - xy: 1643, 195 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-titan-factory-xlarge - rotate: false - xy: 1959, 825 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-titanium-conveyor-large - rotate: false - xy: 729, 557 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-titanium-conveyor-medium - rotate: false - xy: 1953, 463 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-titanium-conveyor-small - rotate: false - xy: 856, 100 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-titanium-conveyor-tiny - rotate: false - xy: 1661, 195 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-titanium-conveyor-xlarge - rotate: false - xy: 101, 517 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-titanium-wall-large - rotate: false - xy: 435, 221 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-titanium-wall-large-large - rotate: false - xy: 477, 263 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-titanium-wall-large-medium - rotate: false - xy: 1987, 463 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-titanium-wall-large-small - rotate: false - xy: 856, 74 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-titanium-wall-large-tiny - rotate: false - xy: 1679, 195 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-titanium-wall-large-xlarge - rotate: false - xy: 101, 467 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-titanium-wall-medium - rotate: false - xy: 1205, 429 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-titanium-wall-small - rotate: false - xy: 853, 48 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-titanium-wall-tiny - rotate: false - xy: 1697, 195 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-titanium-wall-xlarge - rotate: false - xy: 151, 517 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-trident-ship-pad-large - rotate: false - xy: 519, 305 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-trident-ship-pad-medium - rotate: false - xy: 1239, 429 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-trident-ship-pad-small - rotate: false - xy: 853, 22 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-trident-ship-pad-tiny - rotate: false - xy: 1715, 195 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-trident-ship-pad-xlarge - rotate: false - xy: 101, 417 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-turbine-generator-large - rotate: false - xy: 561, 347 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-turbine-generator-medium - rotate: false - xy: 1273, 429 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-turbine-generator-small - rotate: false - xy: 887, 158 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-turbine-generator-tiny - rotate: false - xy: 1733, 195 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-turbine-generator-xlarge - rotate: false - xy: 151, 467 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-unloader-large - rotate: false - xy: 603, 389 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-unloader-medium - rotate: false - xy: 1307, 429 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-unloader-small - rotate: false - xy: 913, 158 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-unloader-tiny - rotate: false - xy: 1751, 195 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-unloader-xlarge - rotate: false - xy: 201, 517 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-vault-large - rotate: false - xy: 645, 431 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-vault-medium - rotate: false - xy: 1341, 429 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-vault-small - rotate: false - xy: 939, 158 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-vault-tiny - rotate: false - xy: 1769, 195 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-vault-xlarge - rotate: false - xy: 101, 367 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-water-extractor-large - rotate: false - xy: 687, 473 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-water-extractor-medium - rotate: false - xy: 1375, 429 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-water-extractor-small - rotate: false - xy: 965, 158 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-water-extractor-tiny - rotate: false - xy: 1787, 195 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-water-extractor-xlarge - rotate: false - xy: 151, 417 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-water-large - rotate: false - xy: 729, 515 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-water-medium - rotate: false - xy: 1409, 429 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-water-small - rotate: false - xy: 991, 158 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-water-tiny - rotate: false - xy: 1805, 195 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-water-xlarge - rotate: false - xy: 201, 467 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-wave-large - rotate: false - xy: 771, 557 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-wave-medium - rotate: false - xy: 1443, 429 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-wave-small - rotate: false - xy: 1017, 158 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-wave-tiny - rotate: false - xy: 1823, 195 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-wave-xlarge - rotate: false - xy: 101, 317 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-white-tree-dead-large - rotate: false - xy: 435, 179 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-white-tree-dead-medium - rotate: false - xy: 1477, 429 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-white-tree-dead-small - rotate: false - xy: 1043, 158 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-white-tree-dead-tiny - rotate: false - xy: 1841, 195 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-white-tree-dead-xlarge - rotate: false - xy: 151, 367 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-white-tree-large - rotate: false - xy: 477, 221 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-white-tree-medium - rotate: false - xy: 1511, 429 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-white-tree-small - rotate: false - xy: 1069, 158 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-white-tree-tiny - rotate: false - xy: 1859, 195 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-white-tree-xlarge - rotate: false - xy: 201, 417 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-wraith-factory-large - rotate: false - xy: 519, 263 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-wraith-factory-medium - rotate: false - xy: 1545, 429 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-wraith-factory-small - rotate: false - xy: 1095, 158 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-wraith-factory-tiny - rotate: false - xy: 1877, 195 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-wraith-factory-xlarge - rotate: false - xy: 101, 267 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -button - rotate: false - xy: 435, 63 - size: 36, 27 - split: 12, 12, 12, 12 - orig: 36, 27 - offset: 0, 0 - index: -1 -button-disabled - rotate: false - xy: 561, 318 - size: 36, 27 - split: 12, 12, 12, 12 - orig: 36, 27 - offset: 0, 0 - index: -1 -button-down - rotate: false - xy: 603, 360 - size: 36, 27 - split: 12, 12, 12, 12 - orig: 36, 27 - offset: 0, 0 - index: -1 -button-edge-1 - rotate: false - xy: 645, 402 - size: 36, 27 - split: 12, 12, 12, 12 - orig: 36, 27 - offset: 0, 0 - index: -1 -button-edge-2 - rotate: false - xy: 687, 444 - size: 36, 27 - split: 12, 12, 12, 12 - orig: 36, 27 - offset: 0, 0 - index: -1 -button-edge-3 - rotate: false - xy: 729, 486 - size: 36, 27 - split: 12, 12, 12, 12 - orig: 36, 27 - offset: 0, 0 - index: -1 -button-edge-4 - rotate: false - xy: 771, 528 - size: 36, 27 - split: 12, 12, 12, 12 - orig: 36, 27 - offset: 0, 0 - index: -1 -button-edge-over-4 - rotate: false - xy: 813, 570 - size: 36, 27 - split: 12, 12, 12, 12 - orig: 36, 27 - offset: 0, 0 - index: -1 -button-over - rotate: false - xy: 435, 150 - size: 36, 27 - split: 12, 12, 12, 12 - orig: 36, 27 - offset: 0, 0 - index: -1 -button-red - rotate: false - xy: 477, 192 - size: 36, 27 - split: 12, 12, 12, 12 - orig: 36, 27 - offset: 0, 0 - index: -1 -button-right - rotate: false - xy: 851, 570 - size: 36, 27 - split: 12, 12, 12, 12 - orig: 36, 27 - offset: 0, 0 - index: -1 -button-right-down - rotate: false - xy: 519, 234 - size: 36, 27 - split: 12, 12, 12, 12 - orig: 36, 27 - offset: 0, 0 - index: -1 -button-right-over - rotate: false - xy: 561, 289 - size: 36, 27 - split: 12, 12, 12, 12 - orig: 36, 27 - offset: 0, 0 - index: -1 -button-select - rotate: false - xy: 1127, 178 - size: 24, 24 - split: 4, 4, 4, 4 - orig: 24, 24 - offset: 0, 0 - index: -1 -button-square - rotate: false - xy: 435, 92 - size: 36, 27 - split: 12, 12, 12, 12 - orig: 36, 27 - offset: 0, 0 - index: -1 -button-square-down - rotate: false - xy: 435, 121 - size: 36, 27 - split: 12, 12, 12, 12 - orig: 36, 27 - offset: 0, 0 - index: -1 -button-square-over - rotate: false - xy: 889, 570 - size: 36, 27 - split: 12, 12, 12, 12 - orig: 36, 27 - offset: 0, 0 - index: -1 -button-trans - rotate: false - xy: 927, 570 - size: 36, 27 - split: 12, 12, 12, 12 - orig: 36, 27 - offset: 0, 0 - index: -1 -check-disabled - rotate: false - xy: 1579, 429 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -check-off - rotate: false - xy: 1613, 429 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -check-on - rotate: false - xy: 1647, 429 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -check-on-disabled - rotate: false - xy: 1681, 429 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -check-on-over - rotate: false - xy: 1715, 429 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -check-over - rotate: false - xy: 1749, 429 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -clear - rotate: false - xy: 843, 218 - size: 10, 10 - orig: 10, 10 - offset: 0, 0 - index: -1 -cursor - rotate: false - xy: 1121, 178 - size: 4, 4 - orig: 4, 4 - offset: 0, 0 - index: -1 -discord-banner - rotate: false - xy: 259, 978 - size: 84, 45 - orig: 84, 45 - offset: 0, 0 - index: -1 -flat-down-base - rotate: false - xy: 965, 570 - size: 36, 27 - split: 12, 12, 12, 12 - orig: 36, 27 - offset: 0, 0 - index: -1 -icon-about - rotate: false - xy: 151, 317 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-about-small - rotate: false - xy: 1783, 429 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-about-smaller - rotate: false - xy: 2017, 609 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-about-tiny - rotate: false - xy: 1153, 181 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-add - rotate: false - xy: 201, 367 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-add-small - rotate: false - xy: 1817, 429 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-add-smaller - rotate: false - xy: 1435, 329 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-add-tiny - rotate: false - xy: 1171, 181 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-admin - rotate: false - xy: 101, 217 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-admin-badge - rotate: false - xy: 151, 267 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-admin-badge-small - rotate: false - xy: 1851, 429 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-admin-badge-smaller - rotate: false - xy: 1467, 329 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-admin-badge-tiny - rotate: false - xy: 1157, 163 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-admin-small - rotate: false - xy: 1885, 429 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-admin-smaller - rotate: false - xy: 1499, 329 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-admin-tiny - rotate: false - xy: 1175, 163 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-arrow - rotate: false - xy: 201, 317 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-arrow-16 - rotate: false - xy: 201, 317 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-arrow-16-small - rotate: false - xy: 1919, 429 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-arrow-small - rotate: false - xy: 1919, 429 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-arrow-16-smaller - rotate: false - xy: 1531, 329 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-arrow-smaller - rotate: false - xy: 1531, 329 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-arrow-16-tiny - rotate: false - xy: 1160, 145 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-arrow-tiny - rotate: false - xy: 1160, 145 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-arrow-down - rotate: false - xy: 101, 167 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-arrow-down-small - rotate: false - xy: 1953, 429 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-arrow-down-smaller - rotate: false - xy: 1563, 329 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-arrow-down-tiny - rotate: false - xy: 1160, 127 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-arrow-left - rotate: false - xy: 151, 217 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-arrow-left-small - rotate: false - xy: 1987, 429 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-arrow-left-smaller - rotate: false - xy: 1595, 329 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-arrow-left-tiny - rotate: false - xy: 1160, 109 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-arrow-right - rotate: false - xy: 201, 267 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-arrow-right-small - rotate: false - xy: 865, 400 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-arrow-right-smaller - rotate: false - xy: 1627, 329 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-arrow-right-tiny - rotate: false - xy: 1160, 91 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-arrow-up - rotate: false - xy: 101, 117 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-arrow-up-small - rotate: false - xy: 899, 400 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-arrow-up-smaller - rotate: false - xy: 1659, 329 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-arrow-up-tiny - rotate: false - xy: 1160, 73 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-back - rotate: false - xy: 151, 167 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-back-small - rotate: false - xy: 933, 400 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-back-smaller - rotate: false - xy: 1691, 329 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-back-tiny - rotate: false - xy: 1178, 145 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-ban - rotate: false - xy: 201, 217 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-ban-small - rotate: false - xy: 967, 400 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-ban-smaller - rotate: false - xy: 1723, 329 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-ban-tiny - rotate: false - xy: 1178, 127 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-break - rotate: false - xy: 101, 67 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-break-small - rotate: false - xy: 1001, 400 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-break-smaller - rotate: false - xy: 1755, 329 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-break-tiny - rotate: false - xy: 1178, 109 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-cancel - rotate: false - xy: 151, 117 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-cancel-small - rotate: false - xy: 1035, 400 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-cancel-smaller - rotate: false - xy: 1787, 329 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-cancel-tiny - rotate: false - xy: 1178, 91 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-quit-tiny - rotate: false - xy: 1178, 91 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-changelog - rotate: false - xy: 201, 167 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-changelog-small - rotate: false - xy: 1069, 400 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-changelog-smaller - rotate: false - xy: 1819, 329 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-changelog-tiny - rotate: false - xy: 1178, 73 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-chat - rotate: false - xy: 151, 67 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-chat-small - rotate: false - xy: 1103, 400 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-chat-smaller - rotate: false - xy: 1851, 329 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-chat-tiny - rotate: false - xy: 1193, 175 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-check - rotate: false - xy: 201, 117 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-check-small - rotate: false - xy: 1137, 400 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-check-smaller - rotate: false - xy: 1883, 329 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-check-tiny - rotate: false - xy: 1211, 175 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-command-attack - rotate: false - xy: 201, 67 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-command-attack-small - rotate: false - xy: 1171, 400 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-command-attack-smaller - rotate: false - xy: 1915, 329 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-command-attack-tiny - rotate: false - xy: 1229, 175 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-command-patrol - rotate: false - xy: 251, 517 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-command-patrol-small - rotate: false - xy: 1205, 395 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-command-patrol-smaller - rotate: false - xy: 1947, 329 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-command-patrol-tiny - rotate: false - xy: 1247, 175 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-command-rally - rotate: false - xy: 251, 467 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-command-rally-small - rotate: false - xy: 1239, 395 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-command-rally-smaller - rotate: false - xy: 1979, 329 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-command-rally-tiny - rotate: false - xy: 1265, 175 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-command-retreat - rotate: false - xy: 251, 417 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-command-retreat-small - rotate: false - xy: 1273, 395 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-command-retreat-smaller - rotate: false - xy: 671, 326 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-command-retreat-tiny - rotate: false - xy: 1283, 175 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-copy - rotate: false - xy: 251, 367 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-copy-small - rotate: false - xy: 1307, 395 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-copy-smaller - rotate: false - xy: 757, 352 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-copy-tiny - rotate: false - xy: 1301, 175 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-crafting - rotate: false - xy: 251, 317 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-crafting-small - rotate: false - xy: 1341, 395 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-crafting-smaller - rotate: false - xy: 2013, 363 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-crafting-tiny - rotate: false - xy: 1319, 175 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-cursor - rotate: false - xy: 251, 267 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-cursor-small - rotate: false - xy: 1375, 395 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-cursor-smaller - rotate: false - xy: 789, 326 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-cursor-tiny - rotate: false - xy: 1337, 175 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-database - rotate: false - xy: 251, 217 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-database-small - rotate: false - xy: 1409, 395 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-database-smaller - rotate: false - xy: 821, 326 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-database-tiny - rotate: false - xy: 1355, 175 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-defense - rotate: false - xy: 251, 167 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-defense-small - rotate: false - xy: 1443, 395 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-defense-smaller - rotate: false - xy: 757, 320 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-defense-tiny - rotate: false - xy: 1373, 175 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-dev-builds - rotate: false - xy: 251, 117 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-dev-builds-small - rotate: false - xy: 1477, 395 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-dev-builds-smaller - rotate: false - xy: 789, 294 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-dev-builds-tiny - rotate: false - xy: 1391, 175 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-diagonal - rotate: false - xy: 251, 67 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-diagonal-small - rotate: false - xy: 1511, 395 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-diagonal-smaller - rotate: false - xy: 821, 294 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-diagonal-tiny - rotate: false - xy: 1409, 175 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-discord - rotate: false - xy: 101, 17 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-discord-small - rotate: false - xy: 1545, 395 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-discord-smaller - rotate: false - xy: 853, 300 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-discord-tiny - rotate: false - xy: 1427, 175 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-distribution - rotate: false - xy: 151, 17 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-distribution-small - rotate: false - xy: 1579, 395 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-distribution-smaller - rotate: false - xy: 885, 300 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-distribution-tiny - rotate: false - xy: 1445, 175 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-donate - rotate: false - xy: 201, 17 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-donate-small - rotate: false - xy: 1613, 395 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-donate-smaller - rotate: false - xy: 917, 300 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-donate-tiny - rotate: false - xy: 1463, 177 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-dots - rotate: false - xy: 251, 17 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-dots-small - rotate: false - xy: 1647, 395 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-dots-smaller - rotate: false - xy: 949, 300 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-dots-tiny - rotate: false - xy: 1481, 177 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-editor - rotate: false - xy: 301, 528 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-editor-small - rotate: false - xy: 1681, 395 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-editor-smaller - rotate: false - xy: 981, 300 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-editor-tiny - rotate: false - xy: 1499, 177 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-effect - rotate: false - xy: 301, 478 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-effect-small - rotate: false - xy: 1715, 395 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-effect-smaller - rotate: false - xy: 1013, 300 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-effect-tiny - rotate: false - xy: 1517, 177 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-elevation - rotate: false - xy: 301, 428 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-elevation-small - rotate: false - xy: 1749, 395 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-elevation-smaller - rotate: false - xy: 1045, 300 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-elevation-tiny - rotate: false - xy: 1535, 177 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-eraser - rotate: false - xy: 301, 378 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-eraser-small - rotate: false - xy: 1783, 395 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-eraser-smaller - rotate: false - xy: 1077, 300 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-eraser-tiny - rotate: false - xy: 1553, 177 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-exit - rotate: false - xy: 301, 328 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-exit-small - rotate: false - xy: 1817, 395 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-exit-smaller - rotate: false - xy: 1109, 300 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-exit-tiny - rotate: false - xy: 1571, 177 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-f-droid - rotate: false - xy: 301, 278 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-f-droid-small - rotate: false - xy: 1851, 395 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-f-droid-smaller - rotate: false - xy: 1141, 300 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-f-droid-tiny - rotate: false - xy: 1589, 177 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-fdroid - rotate: false - xy: 301, 228 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-fdroid-small - rotate: false - xy: 1885, 395 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-fdroid-smaller - rotate: false - xy: 757, 288 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-fdroid-tiny - rotate: false - xy: 1607, 177 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-file - rotate: false - xy: 301, 178 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-file-image - rotate: false - xy: 301, 128 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-file-image-small - rotate: false - xy: 1919, 395 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-file-image-smaller - rotate: false - xy: 853, 268 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-file-image-tiny - rotate: false - xy: 1625, 177 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-file-small - rotate: false - xy: 1953, 395 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-file-smaller - rotate: false - xy: 885, 268 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-file-text - rotate: false - xy: 301, 78 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-file-text-small - rotate: false - xy: 1987, 395 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-file-text-smaller - rotate: false - xy: 917, 268 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-file-text-tiny - rotate: false - xy: 1643, 177 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-file-tiny - rotate: false - xy: 1661, 177 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-fill - rotate: false - xy: 301, 28 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-fill-small - rotate: false - xy: 507, 124 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-fill-smaller - rotate: false - xy: 949, 268 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-fill-tiny - rotate: false - xy: 1679, 177 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-flip - rotate: false - xy: 331, 775 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-flip-small - rotate: false - xy: 507, 90 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-flip-smaller - rotate: false - xy: 981, 268 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-flip-tiny - rotate: false - xy: 1697, 177 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-floppy - rotate: false - xy: 331, 725 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-floppy-16 - rotate: false - xy: 381, 775 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-floppy-16-small - rotate: false - xy: 511, 158 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-floppy-16-smaller - rotate: false - xy: 1013, 268 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-floppy-16-tiny - rotate: false - xy: 1715, 177 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-floppy-small - rotate: false - xy: 507, 56 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-floppy-smaller - rotate: false - xy: 1045, 268 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-floppy-tiny - rotate: false - xy: 1733, 177 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-folder - rotate: false - xy: 381, 725 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-folder-parent - rotate: false - xy: 431, 775 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-folder-parent-small - rotate: false - xy: 503, 22 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-folder-parent-smaller - rotate: false - xy: 1077, 268 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-folder-parent-tiny - rotate: false - xy: 1751, 177 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-folder-small - rotate: false - xy: 545, 161 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-folder-smaller - rotate: false - xy: 1109, 268 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-folder-tiny - rotate: false - xy: 1769, 177 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-github - rotate: false - xy: 431, 725 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-github-small - rotate: false - xy: 579, 161 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-github-smaller - rotate: false - xy: 1141, 268 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-github-tiny - rotate: false - xy: 1787, 177 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-google-play - rotate: false - xy: 481, 775 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-google-play-small - rotate: false - xy: 613, 156 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-google-play-smaller - rotate: false - xy: 1173, 295 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-google-play-tiny - rotate: false - xy: 1805, 177 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-grid - rotate: false - xy: 481, 725 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-grid-small - rotate: false - xy: 647, 156 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-grid-smaller - rotate: false - xy: 1205, 295 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-grid-tiny - rotate: false - xy: 1823, 177 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-home - rotate: false - xy: 531, 775 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-home-small - rotate: false - xy: 681, 156 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-home-smaller - rotate: false - xy: 1237, 295 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-home-tiny - rotate: false - xy: 1841, 177 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-host - rotate: false - xy: 531, 725 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-host-small - rotate: false - xy: 715, 156 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-host-smaller - rotate: false - xy: 1269, 295 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-host-tiny - rotate: false - xy: 1859, 177 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-info - rotate: false - xy: 581, 775 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-info-small - rotate: false - xy: 723, 190 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-info-smaller - rotate: false - xy: 1301, 295 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-info-tiny - rotate: false - xy: 1877, 177 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-itch.io - rotate: false - xy: 581, 725 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-itch.io-small - rotate: false - xy: 749, 156 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-itch.io-smaller - rotate: false - xy: 1333, 295 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-itch.io-tiny - rotate: false - xy: 1895, 187 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-item - rotate: false - xy: 631, 775 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-item-small - rotate: false - xy: 721, 410 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-item-smaller - rotate: false - xy: 1365, 295 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-item-tiny - rotate: false - xy: 1913, 187 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-line - rotate: false - xy: 631, 725 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-line-small - rotate: false - xy: 755, 418 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-line-smaller - rotate: false - xy: 1397, 295 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-line-tiny - rotate: false - xy: 1931, 187 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-link - rotate: false - xy: 681, 775 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-link-small - rotate: false - xy: 755, 384 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-link-smaller - rotate: false - xy: 1173, 263 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-link-tiny - rotate: false - xy: 1895, 169 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-liquid - rotate: false - xy: 681, 725 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-liquid-consume - rotate: false - xy: 731, 775 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-liquid-consume-small - rotate: false - xy: 789, 392 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-liquid-consume-smaller - rotate: false - xy: 1205, 263 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-liquid-consume-tiny - rotate: false - xy: 1913, 169 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-liquid-small - rotate: false - xy: 823, 392 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-liquid-smaller - rotate: false - xy: 1237, 263 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-liquid-tiny - rotate: false - xy: 1931, 169 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-load - rotate: false - xy: 731, 725 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-load-image - rotate: false - xy: 781, 775 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-load-image-small - rotate: false - xy: 789, 358 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-load-image-smaller - rotate: false - xy: 1269, 263 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-load-image-tiny - rotate: false - xy: 1949, 167 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-load-map - rotate: false - xy: 781, 725 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-load-map-small - rotate: false - xy: 823, 358 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-load-map-smaller - rotate: false - xy: 1301, 263 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-load-map-tiny - rotate: false - xy: 1967, 167 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-load-small - rotate: false - xy: 857, 366 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-load-smaller - rotate: false - xy: 1333, 263 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-load-tiny - rotate: false - xy: 1985, 167 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-loading - rotate: false - xy: 831, 775 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-loading-small - rotate: false - xy: 891, 366 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-loading-smaller - rotate: false - xy: 1365, 263 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-loading-tiny - rotate: false - xy: 2003, 167 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-locked - rotate: false - xy: 831, 725 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-locked-small - rotate: false - xy: 925, 366 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-locked-smaller - rotate: false - xy: 1397, 263 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-locked-tiny - rotate: false - xy: 2021, 167 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-map - rotate: false - xy: 881, 775 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-map-small - rotate: false - xy: 959, 366 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-map-smaller - rotate: false - xy: 789, 262 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-map-tiny - rotate: false - xy: 1196, 157 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-menu - rotate: false - xy: 881, 725 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-menu-large - rotate: false - xy: 931, 775 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-menu-large-small - rotate: false - xy: 993, 366 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-menu-large-smaller - rotate: false - xy: 821, 262 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-menu-large-tiny - rotate: false - xy: 1214, 157 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-menu-small - rotate: false - xy: 1027, 366 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-menu-smaller - rotate: false - xy: 757, 256 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-menu-tiny - rotate: false - xy: 1196, 139 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-missing - rotate: false - xy: 931, 725 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-missing-small - rotate: false - xy: 1061, 366 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-missing-smaller - rotate: false - xy: 727, 224 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-missing-tiny - rotate: false - xy: 1232, 157 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-mode-attack - rotate: false - xy: 981, 775 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-mode-attack-small - rotate: false - xy: 1095, 366 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-mode-attack-smaller - rotate: false - xy: 759, 224 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-mode-attack-tiny - rotate: false - xy: 1196, 121 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-mode-pvp - rotate: false - xy: 981, 725 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-mode-pvp-small - rotate: false - xy: 1129, 366 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-mode-pvp-smaller - rotate: false - xy: 757, 192 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-mode-pvp-tiny - rotate: false - xy: 1214, 139 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-mode-survival - rotate: false - xy: 1031, 775 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-mode-survival-small - rotate: false - xy: 1163, 366 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-mode-survival-smaller - rotate: false - xy: 791, 230 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-mode-survival-tiny - rotate: false - xy: 1250, 157 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-none - rotate: false - xy: 1031, 725 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-none-small - rotate: false - xy: 1197, 361 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-none-smaller - rotate: false - xy: 823, 230 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-none-tiny - rotate: false - xy: 1196, 103 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-paste - rotate: false - xy: 1081, 775 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-paste-small - rotate: false - xy: 1231, 361 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-paste-smaller - rotate: false - xy: 855, 236 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-paste-tiny - rotate: false - xy: 1214, 121 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-pause - rotate: false - xy: 1081, 725 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-pause-small - rotate: false - xy: 1265, 361 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-pause-smaller - rotate: false - xy: 887, 236 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-pause-tiny - rotate: false - xy: 1232, 139 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-pencil - rotate: false - xy: 1131, 775 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-pencil-small - rotate: false - xy: 1299, 361 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-pencil-smaller - rotate: false - xy: 919, 236 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-pencil-tiny - rotate: false - xy: 1268, 157 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-pick - rotate: false - xy: 1131, 725 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-pick-small - rotate: false - xy: 1333, 361 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-pick-smaller - rotate: false - xy: 951, 236 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-pick-tiny - rotate: false - xy: 1196, 85 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-play - rotate: false - xy: 1181, 775 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-play-2 - rotate: false - xy: 1181, 725 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-play-2-small - rotate: false - xy: 1367, 361 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-play-2-smaller - rotate: false - xy: 983, 236 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-play-2-tiny - rotate: false - xy: 1214, 103 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-play-tiny - rotate: false - xy: 1214, 103 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-play-custom - rotate: false - xy: 1231, 775 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-play-custom-small - rotate: false - xy: 1401, 361 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-play-custom-smaller - rotate: false - xy: 1015, 236 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-play-custom-tiny - rotate: false - xy: 1232, 121 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-play-small - rotate: false - xy: 1435, 361 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-play-smaller - rotate: false - xy: 1047, 236 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-players - rotate: false - xy: 1231, 725 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-players-small - rotate: false - xy: 1469, 361 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-players-smaller - rotate: false - xy: 1079, 236 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-players-tiny - rotate: false - xy: 1250, 139 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-power - rotate: false - xy: 1281, 775 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-power-small - rotate: false - xy: 1503, 361 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-power-smaller - rotate: false - xy: 1111, 236 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-power-tiny - rotate: false - xy: 1286, 157 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-production - rotate: false - xy: 1281, 725 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-production-small - rotate: false - xy: 1537, 361 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-production-smaller - rotate: false - xy: 1429, 295 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-production-tiny - rotate: false - xy: 1214, 85 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-quit - rotate: false - xy: 1331, 775 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-quit-small - rotate: false - xy: 1571, 361 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-quit-smaller - rotate: false - xy: 1429, 263 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-reddit - rotate: false - xy: 1331, 725 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-reddit-small - rotate: false - xy: 1605, 361 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-reddit-smaller - rotate: false - xy: 1461, 297 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-reddit-tiny - rotate: false - xy: 1232, 103 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-redo - rotate: false - xy: 1381, 775 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-redo-small - rotate: false - xy: 1639, 361 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-redo-smaller - rotate: false - xy: 1461, 265 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-redo-tiny - rotate: false - xy: 1250, 121 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-refresh - rotate: false - xy: 1381, 725 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-refresh-small - rotate: false - xy: 1673, 361 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-refresh-smaller - rotate: false - xy: 1493, 297 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-refresh-tiny - rotate: false - xy: 1268, 139 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-rename - rotate: false - xy: 1431, 775 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-rename-small - rotate: false - xy: 1707, 361 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-rename-smaller - rotate: false - xy: 1493, 265 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-rename-tiny - rotate: false - xy: 1304, 157 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-resize - rotate: false - xy: 1431, 725 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-resize-small - rotate: false - xy: 1741, 361 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-resize-smaller - rotate: false - xy: 1525, 297 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-resize-tiny - rotate: false - xy: 1232, 85 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-rotate - rotate: false - xy: 1481, 775 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-rotate-arrow - rotate: false - xy: 1481, 725 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-rotate-arrow-small - rotate: false - xy: 1775, 361 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-rotate-arrow-smaller - rotate: false - xy: 1525, 265 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-rotate-arrow-tiny - rotate: false - xy: 1250, 103 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-rotate-left - rotate: false - xy: 1531, 775 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-rotate-left-small - rotate: false - xy: 1809, 361 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-rotate-left-smaller - rotate: false - xy: 1557, 297 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-rotate-left-tiny - rotate: false - xy: 1268, 121 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-rotate-right - rotate: false - xy: 1531, 725 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-rotate-right-small - rotate: false - xy: 1843, 361 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-rotate-right-smaller - rotate: false - xy: 1557, 265 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-rotate-right-tiny - rotate: false - xy: 1286, 139 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-rotate-small - rotate: false - xy: 1877, 361 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-rotate-smaller - rotate: false - xy: 1589, 297 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-rotate-tiny - rotate: false - xy: 1322, 157 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-save - rotate: false - xy: 1581, 775 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-save-image - rotate: false - xy: 1581, 725 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-save-image-small - rotate: false - xy: 1911, 361 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-save-image-smaller - rotate: false - xy: 1589, 265 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-save-image-tiny - rotate: false - xy: 1250, 85 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-save-map - rotate: false - xy: 1631, 775 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-save-map-small - rotate: false - xy: 1945, 361 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-save-map-smaller - rotate: false - xy: 1621, 297 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-save-map-tiny - rotate: false - xy: 1268, 103 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-save-small - rotate: false - xy: 1979, 361 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-save-smaller - rotate: false - xy: 1621, 265 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-save-tiny - rotate: false - xy: 1286, 121 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-settings - rotate: false - xy: 1631, 725 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-settings-small - rotate: false - xy: 857, 332 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-settings-smaller - rotate: false - xy: 1653, 297 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-settings-tiny - rotate: false - xy: 1304, 139 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-spray - rotate: false - xy: 1681, 775 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-spray-small - rotate: false - xy: 891, 332 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-spray-smaller - rotate: false - xy: 1653, 265 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-spray-tiny - rotate: false - xy: 1340, 157 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-terrain - rotate: false - xy: 1681, 725 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-terrain-small - rotate: false - xy: 925, 332 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-terrain-smaller - rotate: false - xy: 1685, 297 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-terrain-tiny - rotate: false - xy: 1268, 85 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-tools - rotate: false - xy: 1731, 775 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-tools-small - rotate: false - xy: 959, 332 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-tools-smaller - rotate: false - xy: 1685, 265 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-tools-tiny - rotate: false - xy: 1286, 103 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-trash - rotate: false - xy: 1731, 725 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-trash-16 - rotate: false - xy: 1781, 775 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-trash-16-small - rotate: false - xy: 993, 332 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-trash-16-smaller - rotate: false - xy: 1717, 297 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-trash-16-tiny - rotate: false - xy: 1304, 121 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-trash-small - rotate: false - xy: 1027, 332 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-trash-smaller - rotate: false - xy: 1717, 265 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-trash-tiny - rotate: false - xy: 1322, 139 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-tree - rotate: false - xy: 1781, 725 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-tree-small - rotate: false - xy: 1061, 332 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-tree-smaller - rotate: false - xy: 1749, 297 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-tree-tiny - rotate: false - xy: 1358, 157 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-trello - rotate: false - xy: 1831, 775 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-trello-small - rotate: false - xy: 1095, 332 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-trello-smaller - rotate: false - xy: 1749, 265 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-trello-tiny - rotate: false - xy: 1286, 85 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-turret - rotate: false - xy: 1831, 725 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-turret-small - rotate: false - xy: 1129, 332 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-turret-smaller - rotate: false - xy: 1781, 297 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-turret-tiny - rotate: false - xy: 1304, 103 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-tutorial - rotate: false - xy: 1881, 775 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-tutorial-small - rotate: false - xy: 1163, 332 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-tutorial-smaller - rotate: false - xy: 1781, 265 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-tutorial-tiny - rotate: false - xy: 1322, 121 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-undo - rotate: false - xy: 1881, 725 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-undo-small - rotate: false - xy: 1197, 327 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-undo-smaller - rotate: false - xy: 1813, 297 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-undo-tiny - rotate: false - xy: 1340, 139 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-units - rotate: false - xy: 1931, 775 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-units-small - rotate: false - xy: 1231, 327 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-units-smaller - rotate: false - xy: 1813, 265 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-units-tiny - rotate: false - xy: 1376, 157 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-unlocks - rotate: false - xy: 1931, 725 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-unlocks-small - rotate: false - xy: 1265, 327 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-unlocks-smaller - rotate: false - xy: 1845, 297 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-unlocks-tiny - rotate: false - xy: 1304, 85 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-upgrade - rotate: false - xy: 1981, 775 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-upgrade-small - rotate: false - xy: 1299, 327 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-upgrade-smaller - rotate: false - xy: 1845, 265 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-upgrade-tiny - rotate: false - xy: 1322, 103 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-wiki - rotate: false - xy: 1981, 725 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-wiki-small - rotate: false - xy: 1333, 327 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-wiki-smaller - rotate: false - xy: 1877, 297 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-wiki-tiny - rotate: false - xy: 1340, 121 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-workshop - rotate: false - xy: 337, 675 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-workshop-small - rotate: false - xy: 1367, 327 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-workshop-smaller - rotate: false - xy: 1877, 265 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-workshop-tiny - rotate: false - xy: 1358, 139 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-zoom - rotate: false - xy: 337, 625 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-zoom-small - rotate: false - xy: 1401, 327 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-zoom-smaller - rotate: false - xy: 1909, 297 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-zoom-tiny - rotate: false - xy: 1394, 157 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -info-banner - rotate: false - xy: 1, 590 - size: 84, 45 - orig: 84, 45 - offset: 0, 0 - index: -1 -inventory - rotate: false - xy: 882, 110 - size: 24, 40 - split: 10, 10, 10, 14 - orig: 24, 40 - offset: 0, 0 - index: -1 -nomap - rotate: false - xy: 1, 767 - size: 256, 256 - orig: 256, 256 - offset: 0, 0 - index: -1 -pane - rotate: false - xy: 1041, 570 - size: 36, 27 - split: 12, 12, 12, 12 - orig: 36, 27 - offset: 0, 0 - index: -1 -pane-2 - rotate: false - xy: 1003, 570 - size: 36, 27 - split: 12, 12, 12, 12 - orig: 36, 27 - offset: 0, 0 - index: -1 -scroll - rotate: false - xy: 879, 31 - size: 24, 35 - split: 10, 10, 6, 5 - orig: 24, 35 - offset: 0, 0 - index: -1 -scroll-horizontal - rotate: false - xy: 561, 263 - size: 35, 24 - split: 6, 5, 10, 10 - orig: 35, 24 - offset: 0, 0 - index: -1 -scroll-knob-horizontal-black - rotate: false - xy: 1, 14 - size: 40, 24 - orig: 40, 24 - offset: 0, 0 - index: -1 -scroll-knob-vertical-black - rotate: false - xy: 882, 68 - size: 24, 40 - orig: 24, 40 - offset: 0, 0 - index: -1 -scroll-knob-vertical-thin - rotate: false - xy: 1322, 61 - size: 12, 40 - orig: 12, 40 - offset: 0, 0 - index: -1 -selection - rotate: false - xy: 1157, 160 - size: 1, 1 - orig: 1, 1 - offset: 0, 0 - index: -1 -slider - rotate: false - xy: 567, 85 - size: 1, 8 - orig: 1, 8 - offset: 0, 0 - index: -1 -slider-knob - rotate: false - xy: 1909, 257 - size: 29, 38 - orig: 29, 38 - offset: 0, 0 - index: -1 -slider-knob-down - rotate: false - xy: 1941, 289 - size: 29, 38 - orig: 29, 38 - offset: 0, 0 - index: -1 -slider-knob-over - rotate: false - xy: 1972, 289 - size: 29, 38 - orig: 29, 38 - offset: 0, 0 - index: -1 -slider-vertical - rotate: false - xy: 51, 587 - size: 8, 1 - orig: 8, 1 - offset: 0, 0 - index: -1 -underline - rotate: false - xy: 1193, 570 - size: 36, 27 - split: 12, 12, 12, 12 - orig: 36, 27 - offset: 0, 0 - index: -1 -underline-2 - rotate: false - xy: 1079, 570 - size: 36, 27 - split: 12, 12, 12, 12 - orig: 36, 27 - offset: 0, 0 - index: -1 -underline-disabled - rotate: false - xy: 1117, 570 - size: 36, 27 - split: 12, 12, 12, 12 - orig: 36, 27 - offset: 0, 0 - index: -1 -underline-red - rotate: false - xy: 1155, 570 - size: 36, 27 - split: 12, 12, 12, 12 - orig: 36, 27 - offset: 0, 0 - index: -1 -whiteui - rotate: false - xy: 1167, 225 - size: 3, 3 - orig: 3, 3 - offset: 0, 0 - index: -1 -window-empty - rotate: false - xy: 541, 95 - size: 27, 61 - split: 4, 4, 2, 2 - orig: 27, 61 - offset: 0, 0 - index: -1 - -sprites4.png -size: 1024,1024 -format: RGBA8888 -filter: Nearest,Nearest -repeat: none -zone-craters - rotate: false - xy: 605, 767 - size: 256, 256 - orig: 256, 256 - offset: 0, 0 - index: -1 -zone-desertWastes - rotate: false - xy: 303, 461 - size: 260, 260 - orig: 260, 260 - offset: 0, 0 - index: -1 -zone-desolateRift - rotate: false - xy: 817, 163 - size: 100, 350 - orig: 100, 350 - offset: 0, 0 - index: -1 -zone-frozenForest - rotate: false - xy: 303, 1 - size: 200, 200 - orig: 200, 200 - offset: 0, 0 - index: -1 -zone-fungalPass - rotate: false - xy: 863, 773 - size: 150, 250 - orig: 150, 250 - offset: 0, 0 - index: -1 -zone-groundZero - rotate: false - xy: 303, 203 - size: 256, 256 - orig: 256, 256 - offset: 0, 0 - index: -1 -zone-nuclearComplex - rotate: false - xy: 605, 515 - size: 250, 250 - orig: 250, 250 - offset: 0, 0 - index: -1 -zone-overgrowth - rotate: false - xy: 1, 723 - size: 300, 300 - orig: 300, 300 - offset: 0, 0 - index: -1 -zone-ruinousShores - rotate: false - xy: 1, 421 - size: 300, 300 - orig: 300, 300 - offset: 0, 0 - index: -1 -zone-saltFlats - rotate: false - xy: 303, 723 - size: 300, 300 - orig: 300, 300 - offset: 0, 0 - index: -1 -zone-stainedMountains - rotate: false - xy: 1, 119 - size: 300, 300 - orig: 300, 300 - offset: 0, 0 - index: -1 -zone-tarFields - rotate: false - xy: 565, 263 - size: 250, 250 - orig: 250, 250 - offset: 0, 0 - index: -1 - -sprites5.png -size: 2048,1024 -format: RGBA8888 -filter: Nearest,Nearest -repeat: none alloy-smelter-icon-editor rotate: false xy: 1, 23 @@ -19743,3 +9361,10392 @@ wraith-factory-icon-editor orig: 64, 64 offset: 0, 0 index: -1 + +sprites4.png +size: 1024,1024 +format: RGBA8888 +filter: Nearest,Nearest +repeat: none +zone-craters + rotate: false + xy: 605, 767 + size: 256, 256 + orig: 256, 256 + offset: 0, 0 + index: -1 +zone-desertWastes + rotate: false + xy: 303, 461 + size: 260, 260 + orig: 260, 260 + offset: 0, 0 + index: -1 +zone-desolateRift + rotate: false + xy: 817, 163 + size: 100, 350 + orig: 100, 350 + offset: 0, 0 + index: -1 +zone-frozenForest + rotate: false + xy: 303, 1 + size: 200, 200 + orig: 200, 200 + offset: 0, 0 + index: -1 +zone-fungalPass + rotate: false + xy: 863, 773 + size: 150, 250 + orig: 150, 250 + offset: 0, 0 + index: -1 +zone-groundZero + rotate: false + xy: 303, 203 + size: 256, 256 + orig: 256, 256 + offset: 0, 0 + index: -1 +zone-nuclearComplex + rotate: false + xy: 605, 515 + size: 250, 250 + orig: 250, 250 + offset: 0, 0 + index: -1 +zone-overgrowth + rotate: false + xy: 1, 723 + size: 300, 300 + orig: 300, 300 + offset: 0, 0 + index: -1 +zone-ruinousShores + rotate: false + xy: 1, 421 + size: 300, 300 + orig: 300, 300 + offset: 0, 0 + index: -1 +zone-saltFlats + rotate: false + xy: 303, 723 + size: 300, 300 + orig: 300, 300 + offset: 0, 0 + index: -1 +zone-stainedMountains + rotate: false + xy: 1, 119 + size: 300, 300 + orig: 300, 300 + offset: 0, 0 + index: -1 +zone-tarFields + rotate: false + xy: 565, 263 + size: 250, 250 + orig: 250, 250 + offset: 0, 0 + index: -1 + +sprites5.png +size: 2048,1024 +format: RGBA8888 +filter: Nearest,Nearest +repeat: none +alpha-bg + rotate: false + xy: 1, 528 + size: 128, 128 + orig: 128, 128 + offset: 0, 0 + index: -1 +bar + rotate: false + xy: 2019, 869 + size: 27, 36 + split: 9, 9, 9, 9 + orig: 27, 36 + offset: 0, 0 + index: -1 +bar-top + rotate: false + xy: 751, 578 + size: 27, 36 + split: 9, 10, 9, 10 + orig: 27, 36 + offset: 0, 0 + index: -1 +block-alloy-smelter-large + rotate: false + xy: 2007, 983 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-alloy-smelter-medium + rotate: false + xy: 1839, 647 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-alloy-smelter-small + rotate: false + xy: 781, 690 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-alloy-smelter-tiny + rotate: false + xy: 1609, 350 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-alloy-smelter-xlarge + rotate: false + xy: 1, 478 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-arc-large + rotate: false + xy: 2007, 941 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-arc-medium + rotate: false + xy: 1873, 647 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-arc-small + rotate: false + xy: 80, 2 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-arc-tiny + rotate: false + xy: 1971, 567 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-arc-xlarge + rotate: false + xy: 131, 608 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-armored-conveyor-large + rotate: false + xy: 851, 36 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-armored-conveyor-medium + rotate: false + xy: 1907, 647 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-armored-conveyor-small + rotate: false + xy: 1939, 589 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-armored-conveyor-tiny + rotate: false + xy: 2031, 645 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-armored-conveyor-xlarge + rotate: false + xy: 771, 928 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-battery-large + rotate: false + xy: 893, 36 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-battery-large-large + rotate: false + xy: 821, 933 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-battery-large-medium + rotate: false + xy: 1951, 857 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-battery-large-small + rotate: false + xy: 2019, 780 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-battery-large-tiny + rotate: false + xy: 2031, 627 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-battery-large-xlarge + rotate: false + xy: 259, 819 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-battery-medium + rotate: false + xy: 1951, 823 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-battery-small + rotate: false + xy: 106, 2 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-battery-tiny + rotate: false + xy: 2031, 609 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-battery-xlarge + rotate: false + xy: 1, 428 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-blast-drill-large + rotate: false + xy: 863, 933 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-blast-drill-medium + rotate: false + xy: 1951, 789 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-blast-drill-small + rotate: false + xy: 2019, 754 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-blast-drill-tiny + rotate: false + xy: 2031, 591 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-blast-drill-xlarge + rotate: false + xy: 51, 478 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-blast-mixer-large + rotate: false + xy: 905, 933 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-blast-mixer-medium + rotate: false + xy: 1951, 755 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-blast-mixer-small + rotate: false + xy: 2019, 728 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-blast-mixer-tiny + rotate: false + xy: 2031, 573 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-blast-mixer-xlarge + rotate: false + xy: 131, 558 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-bridge-conduit-large + rotate: false + xy: 947, 933 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-bridge-conduit-medium + rotate: false + xy: 1951, 721 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-bridge-conduit-small + rotate: false + xy: 2019, 702 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-bridge-conduit-tiny + rotate: false + xy: 301, 1 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-bridge-conduit-xlarge + rotate: false + xy: 181, 608 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-bridge-conveyor-large + rotate: false + xy: 989, 933 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-bridge-conveyor-medium + rotate: false + xy: 1951, 687 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-bridge-conveyor-small + rotate: false + xy: 1383, 54 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-bridge-conveyor-tiny + rotate: false + xy: 319, 1 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-bridge-conveyor-xlarge + rotate: false + xy: 259, 769 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-char-large + rotate: false + xy: 1031, 933 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-char-medium + rotate: false + xy: 1979, 899 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-char-small + rotate: false + xy: 751, 2 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-char-tiny + rotate: false + xy: 131, 540 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-char-xlarge + rotate: false + xy: 1, 378 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-cliffs-large + rotate: false + xy: 1073, 933 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-cliffs-medium + rotate: false + xy: 2013, 907 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-cliffs-small + rotate: false + xy: 777, 2 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-cliffs-tiny + rotate: false + xy: 309, 698 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-cliffs-xlarge + rotate: false + xy: 51, 428 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-coal-centrifuge-large + rotate: false + xy: 1115, 933 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-coal-centrifuge-medium + rotate: false + xy: 1985, 865 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-coal-centrifuge-small + rotate: false + xy: 803, 2 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-coal-centrifuge-tiny + rotate: false + xy: 331, 598 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-coal-centrifuge-xlarge + rotate: false + xy: 181, 558 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-combustion-generator-large + rotate: false + xy: 1157, 933 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-combustion-generator-medium + rotate: false + xy: 1985, 831 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-combustion-generator-small + rotate: false + xy: 1409, 54 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-combustion-generator-tiny + rotate: false + xy: 881, 579 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-combustion-generator-xlarge + rotate: false + xy: 259, 719 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-command-center-large + rotate: false + xy: 1199, 933 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-command-center-medium + rotate: false + xy: 1985, 797 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-command-center-small + rotate: false + xy: 1395, 28 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-command-center-tiny + rotate: false + xy: 901, 82 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-command-center-xlarge + rotate: false + xy: 1, 328 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-conduit-large + rotate: false + xy: 1241, 933 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-conduit-medium + rotate: false + xy: 1985, 763 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-conduit-small + rotate: false + xy: 1395, 2 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-conduit-tiny + rotate: false + xy: 1815, 634 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-conduit-xlarge + rotate: false + xy: 51, 378 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-container-large + rotate: false + xy: 1283, 933 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-container-medium + rotate: false + xy: 1985, 729 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-container-small + rotate: false + xy: 1421, 28 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-container-tiny + rotate: false + xy: 132, 10 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-container-xlarge + rotate: false + xy: 259, 669 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-conveyor-large + rotate: false + xy: 1325, 933 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-conveyor-medium + rotate: false + xy: 1985, 695 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-conveyor-small + rotate: false + xy: 1421, 2 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-conveyor-tiny + rotate: false + xy: 829, 10 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-conveyor-xlarge + rotate: false + xy: 1, 278 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-copper-wall-large + rotate: false + xy: 1367, 933 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-copper-wall-large-large + rotate: false + xy: 1409, 933 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-copper-wall-large-medium + rotate: false + xy: 923, 576 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-copper-wall-large-small + rotate: false + xy: 1681, 524 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-copper-wall-large-tiny + rotate: false + xy: 1915, 501 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-copper-wall-large-xlarge + rotate: false + xy: 51, 328 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-copper-wall-medium + rotate: false + xy: 965, 618 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-copper-wall-small + rotate: false + xy: 1707, 526 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-copper-wall-tiny + rotate: false + xy: 1403, 116 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-copper-wall-xlarge + rotate: false + xy: 1, 228 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-core-foundation-large + rotate: false + xy: 1451, 933 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-core-foundation-medium + rotate: false + xy: 999, 618 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-core-foundation-small + rotate: false + xy: 1733, 526 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-core-foundation-tiny + rotate: false + xy: 1577, 108 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-core-foundation-xlarge + rotate: false + xy: 51, 278 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-core-nucleus-large + rotate: false + xy: 1493, 933 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-core-nucleus-medium + rotate: false + xy: 1033, 618 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-core-nucleus-small + rotate: false + xy: 1759, 526 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-core-nucleus-tiny + rotate: false + xy: 1809, 348 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-core-nucleus-xlarge + rotate: false + xy: 1, 178 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-core-shard-large + rotate: false + xy: 1535, 933 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-core-shard-medium + rotate: false + xy: 1067, 618 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-core-shard-small + rotate: false + xy: 1785, 526 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-core-shard-tiny + rotate: false + xy: 1783, 311 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-core-shard-xlarge + rotate: false + xy: 51, 228 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-craters-large + rotate: false + xy: 1577, 933 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-craters-medium + rotate: false + xy: 1101, 618 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-craters-small + rotate: false + xy: 1681, 498 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-craters-tiny + rotate: false + xy: 309, 680 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-craters-xlarge + rotate: false + xy: 1, 128 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-crawler-factory-large + rotate: false + xy: 1619, 933 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-crawler-factory-medium + rotate: false + xy: 1135, 618 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-crawler-factory-small + rotate: false + xy: 1707, 500 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-crawler-factory-tiny + rotate: false + xy: 331, 580 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-crawler-factory-xlarge + rotate: false + xy: 51, 178 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-cryofluidmixer-large + rotate: false + xy: 1661, 933 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-cryofluidmixer-medium + rotate: false + xy: 1169, 618 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-cryofluidmixer-small + rotate: false + xy: 1733, 500 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-cryofluidmixer-tiny + rotate: false + xy: 899, 579 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-cryofluidmixer-xlarge + rotate: false + xy: 1, 78 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-cultivator-large + rotate: false + xy: 1703, 933 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-cultivator-medium + rotate: false + xy: 1203, 618 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-cultivator-small + rotate: false + xy: 1759, 500 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-cultivator-tiny + rotate: false + xy: 1809, 330 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-cultivator-xlarge + rotate: false + xy: 51, 128 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-cyclone-large + rotate: false + xy: 1745, 933 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-cyclone-medium + rotate: false + xy: 1237, 618 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-cyclone-small + rotate: false + xy: 1785, 500 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-cyclone-tiny + rotate: false + xy: 1783, 293 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-cyclone-xlarge + rotate: false + xy: 1, 28 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-dagger-factory-large + rotate: false + xy: 1787, 933 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-dagger-factory-medium + rotate: false + xy: 1271, 618 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-dagger-factory-small + rotate: false + xy: 1678, 472 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-dagger-factory-tiny + rotate: false + xy: 1783, 275 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-dagger-factory-xlarge + rotate: false + xy: 51, 78 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-dark-metal-large + rotate: false + xy: 1829, 933 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-dark-metal-medium + rotate: false + xy: 1305, 618 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-dark-metal-small + rotate: false + xy: 1678, 446 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-dark-metal-tiny + rotate: false + xy: 1783, 257 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-dark-metal-xlarge + rotate: false + xy: 51, 28 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-dark-panel-1-large + rotate: false + xy: 1871, 933 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-dark-panel-1-medium + rotate: false + xy: 1339, 618 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-dark-panel-1-small + rotate: false + xy: 1678, 420 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-dark-panel-1-tiny + rotate: false + xy: 1783, 239 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-dark-panel-1-xlarge + rotate: false + xy: 857, 975 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-dark-panel-2-large + rotate: false + xy: 1913, 933 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-dark-panel-2-medium + rotate: false + xy: 1373, 618 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-dark-panel-2-small + rotate: false + xy: 1678, 394 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-dark-panel-2-tiny + rotate: false + xy: 1427, 194 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-dark-panel-2-xlarge + rotate: false + xy: 907, 975 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-dark-panel-3-large + rotate: false + xy: 1955, 933 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-dark-panel-3-medium + rotate: false + xy: 1407, 618 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-dark-panel-3-small + rotate: false + xy: 1811, 496 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-dark-panel-3-tiny + rotate: false + xy: 1427, 176 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-dark-panel-3-xlarge + rotate: false + xy: 957, 975 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-dark-panel-4-large + rotate: false + xy: 845, 891 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-dark-panel-4-medium + rotate: false + xy: 1441, 618 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-dark-panel-4-small + rotate: false + xy: 1837, 493 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-dark-panel-4-tiny + rotate: false + xy: 1429, 158 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-dark-panel-4-xlarge + rotate: false + xy: 1007, 975 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-dark-panel-5-large + rotate: false + xy: 887, 891 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-dark-panel-5-medium + rotate: false + xy: 1475, 618 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-dark-panel-5-small + rotate: false + xy: 1863, 493 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-dark-panel-5-tiny + rotate: false + xy: 1429, 140 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-dark-panel-5-xlarge + rotate: false + xy: 1057, 975 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-dark-panel-6-large + rotate: false + xy: 929, 891 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-dark-panel-6-medium + rotate: false + xy: 1509, 618 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-dark-panel-6-small + rotate: false + xy: 1889, 493 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-dark-panel-6-tiny + rotate: false + xy: 1429, 122 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-dark-panel-6-xlarge + rotate: false + xy: 1107, 975 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-darksand-large + rotate: false + xy: 971, 891 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-darksand-medium + rotate: false + xy: 1543, 618 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-darksand-small + rotate: false + xy: 1704, 472 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-darksand-tainted-water-large + rotate: false + xy: 1013, 891 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-darksand-tainted-water-medium + rotate: false + xy: 1577, 618 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-darksand-tainted-water-small + rotate: false + xy: 1704, 446 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-darksand-tainted-water-tiny + rotate: false + xy: 1827, 345 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-darksand-tainted-water-xlarge + rotate: false + xy: 1157, 975 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-darksand-tiny + rotate: false + xy: 1845, 345 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-darksand-water-large + rotate: false + xy: 1055, 891 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-darksand-water-medium + rotate: false + xy: 1611, 618 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-darksand-water-small + rotate: false + xy: 1704, 420 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-darksand-water-tiny + rotate: false + xy: 1863, 345 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-darksand-water-xlarge + rotate: false + xy: 1207, 975 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-darksand-xlarge + rotate: false + xy: 1257, 975 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-dart-mech-pad-large + rotate: false + xy: 1097, 891 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-dart-mech-pad-medium + rotate: false + xy: 1645, 618 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-dart-mech-pad-small + rotate: false + xy: 1704, 394 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-dart-mech-pad-tiny + rotate: false + xy: 1881, 345 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-dart-mech-pad-xlarge + rotate: false + xy: 1307, 975 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-deepwater-large + rotate: false + xy: 1139, 891 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-deepwater-medium + rotate: false + xy: 1679, 618 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-deepwater-small + rotate: false + xy: 1730, 474 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-deepwater-tiny + rotate: false + xy: 1899, 345 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-deepwater-xlarge + rotate: false + xy: 1357, 975 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-delta-mech-pad-large + rotate: false + xy: 1181, 891 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-delta-mech-pad-medium + rotate: false + xy: 1713, 618 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-delta-mech-pad-small + rotate: false + xy: 1730, 448 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-delta-mech-pad-tiny + rotate: false + xy: 1917, 345 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-delta-mech-pad-xlarge + rotate: false + xy: 1407, 975 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-differential-generator-large + rotate: false + xy: 1223, 891 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-differential-generator-medium + rotate: false + xy: 1747, 618 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-differential-generator-small + rotate: false + xy: 1756, 474 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-differential-generator-tiny + rotate: false + xy: 1827, 327 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-differential-generator-xlarge + rotate: false + xy: 1457, 975 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-diode-large + rotate: false + xy: 1265, 891 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-diode-medium + rotate: false + xy: 1781, 618 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-diode-small + rotate: false + xy: 1730, 422 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-diode-tiny + rotate: false + xy: 1845, 327 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-diode-xlarge + rotate: false + xy: 1507, 975 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-distributor-large + rotate: false + xy: 1307, 891 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-distributor-medium + rotate: false + xy: 901, 542 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-distributor-small + rotate: false + xy: 1756, 448 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-distributor-tiny + rotate: false + xy: 1863, 327 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-distributor-xlarge + rotate: false + xy: 1557, 975 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-door-large + rotate: false + xy: 1349, 891 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-door-large-large + rotate: false + xy: 1391, 891 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-door-large-medium + rotate: false + xy: 901, 508 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-door-large-small + rotate: false + xy: 1782, 474 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-door-large-tiny + rotate: false + xy: 1881, 327 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-door-large-xlarge + rotate: false + xy: 1607, 975 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-door-medium + rotate: false + xy: 901, 474 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-door-small + rotate: false + xy: 1730, 396 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-door-tiny + rotate: false + xy: 1899, 327 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-door-xlarge + rotate: false + xy: 1657, 975 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-draug-factory-large + rotate: false + xy: 1433, 891 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-draug-factory-medium + rotate: false + xy: 901, 440 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-draug-factory-small + rotate: false + xy: 1756, 422 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-draug-factory-tiny + rotate: false + xy: 1917, 327 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-draug-factory-xlarge + rotate: false + xy: 1707, 975 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-dunerocks-large + rotate: false + xy: 1475, 891 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-dunerocks-medium + rotate: false + xy: 901, 406 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-dunerocks-small + rotate: false + xy: 1782, 448 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-dunerocks-tiny + rotate: false + xy: 1935, 341 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-dunerocks-xlarge + rotate: false + xy: 1757, 975 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-duo-large + rotate: false + xy: 1517, 891 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-duo-medium + rotate: false + xy: 901, 372 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-duo-small + rotate: false + xy: 1756, 396 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-duo-tiny + rotate: false + xy: 1935, 323 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-duo-xlarge + rotate: false + xy: 1807, 975 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-force-projector-large + rotate: false + xy: 1559, 891 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-force-projector-medium + rotate: false + xy: 901, 338 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-force-projector-small + rotate: false + xy: 1782, 422 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-force-projector-tiny + rotate: false + xy: 1603, 254 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-force-projector-xlarge + rotate: false + xy: 1857, 975 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-fortress-factory-large + rotate: false + xy: 1601, 891 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-fortress-factory-medium + rotate: false + xy: 901, 304 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-fortress-factory-small + rotate: false + xy: 1782, 396 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-fortress-factory-tiny + rotate: false + xy: 1603, 236 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-fortress-factory-xlarge + rotate: false + xy: 1907, 975 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-fuse-large + rotate: false + xy: 1643, 891 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-fuse-medium + rotate: false + xy: 901, 270 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-fuse-small + rotate: false + xy: 1808, 470 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-fuse-tiny + rotate: false + xy: 1603, 218 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-fuse-xlarge + rotate: false + xy: 1957, 975 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-ghoul-factory-large + rotate: false + xy: 1685, 891 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-ghoul-factory-medium + rotate: false + xy: 901, 236 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-ghoul-factory-small + rotate: false + xy: 1808, 444 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-ghoul-factory-tiny + rotate: false + xy: 1603, 200 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-ghoul-factory-xlarge + rotate: false + xy: 345, 866 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-glaive-ship-pad-large + rotate: false + xy: 1727, 891 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-glaive-ship-pad-medium + rotate: false + xy: 901, 202 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-glaive-ship-pad-small + rotate: false + xy: 1808, 418 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-glaive-ship-pad-tiny + rotate: false + xy: 1603, 182 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-glaive-ship-pad-xlarge + rotate: false + xy: 395, 866 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-graphite-press-large + rotate: false + xy: 1769, 891 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-graphite-press-medium + rotate: false + xy: 901, 168 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-graphite-press-small + rotate: false + xy: 1834, 467 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-graphite-press-tiny + rotate: false + xy: 1603, 164 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-graphite-press-xlarge + rotate: false + xy: 445, 866 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-grass-large + rotate: false + xy: 1811, 891 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-grass-medium + rotate: false + xy: 901, 134 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-grass-small + rotate: false + xy: 1860, 467 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-grass-tiny + rotate: false + xy: 1603, 146 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-grass-xlarge + rotate: false + xy: 495, 866 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-hail-large + rotate: false + xy: 1853, 891 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-hail-medium + rotate: false + xy: 901, 100 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-hail-small + rotate: false + xy: 1834, 441 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-hail-tiny + rotate: false + xy: 1603, 128 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-hail-xlarge + rotate: false + xy: 545, 866 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-holostone-large + rotate: false + xy: 1895, 891 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-holostone-medium + rotate: false + xy: 935, 542 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-holostone-small + rotate: false + xy: 1886, 467 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-holostone-tiny + rotate: false + xy: 1621, 246 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-holostone-xlarge + rotate: false + xy: 595, 866 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-hotrock-large + rotate: false + xy: 1937, 891 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-hotrock-medium + rotate: false + xy: 935, 508 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-hotrock-small + rotate: false + xy: 1860, 441 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-hotrock-tiny + rotate: false + xy: 1621, 228 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-hotrock-xlarge + rotate: false + xy: 645, 866 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-ice-large + rotate: false + xy: 859, 849 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-ice-medium + rotate: false + xy: 935, 474 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-ice-small + rotate: false + xy: 1886, 441 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-ice-snow-large + rotate: false + xy: 901, 849 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-ice-snow-medium + rotate: false + xy: 935, 440 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-ice-snow-small + rotate: false + xy: 1834, 415 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-ice-snow-tiny + rotate: false + xy: 1639, 246 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-ice-snow-xlarge + rotate: false + xy: 695, 866 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-ice-tiny + rotate: false + xy: 1621, 210 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-ice-xlarge + rotate: false + xy: 101, 478 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-icerocks-large + rotate: false + xy: 859, 807 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-icerocks-medium + rotate: false + xy: 935, 406 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-icerocks-small + rotate: false + xy: 1860, 415 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-icerocks-tiny + rotate: false + xy: 1639, 228 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-icerocks-xlarge + rotate: false + xy: 101, 428 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-ignarock-large + rotate: false + xy: 901, 807 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-ignarock-medium + rotate: false + xy: 935, 372 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-ignarock-small + rotate: false + xy: 1886, 415 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-ignarock-tiny + rotate: false + xy: 1657, 246 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-ignarock-xlarge + rotate: false + xy: 101, 378 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-illuminator-large + rotate: false + xy: 943, 849 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-illuminator-medium + rotate: false + xy: 935, 338 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-illuminator-small + rotate: false + xy: 1808, 392 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-illuminator-tiny + rotate: false + xy: 1621, 192 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-illuminator-xlarge + rotate: false + xy: 101, 328 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-impact-reactor-large + rotate: false + xy: 859, 765 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-impact-reactor-medium + rotate: false + xy: 935, 304 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-impact-reactor-small + rotate: false + xy: 1834, 389 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-impact-reactor-tiny + rotate: false + xy: 1639, 210 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-impact-reactor-xlarge + rotate: false + xy: 101, 278 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-incinerator-large + rotate: false + xy: 901, 765 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-incinerator-medium + rotate: false + xy: 935, 270 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-incinerator-small + rotate: false + xy: 1860, 389 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-incinerator-tiny + rotate: false + xy: 1657, 228 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-incinerator-xlarge + rotate: false + xy: 101, 228 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-inverted-sorter-large + rotate: false + xy: 943, 807 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-inverted-sorter-medium + rotate: false + xy: 935, 236 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-inverted-sorter-small + rotate: false + xy: 1886, 389 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-inverted-sorter-tiny + rotate: false + xy: 1675, 246 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-inverted-sorter-xlarge + rotate: false + xy: 101, 178 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-item-source-large + rotate: false + xy: 985, 849 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-item-source-medium + rotate: false + xy: 935, 202 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-item-source-small + rotate: false + xy: 1912, 467 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-item-source-tiny + rotate: false + xy: 1621, 174 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-item-source-xlarge + rotate: false + xy: 101, 128 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-item-void-large + rotate: false + xy: 859, 723 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-item-void-medium + rotate: false + xy: 935, 168 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-item-void-small + rotate: false + xy: 1912, 441 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-item-void-tiny + rotate: false + xy: 1639, 192 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-item-void-xlarge + rotate: false + xy: 101, 78 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-javelin-ship-pad-large + rotate: false + xy: 901, 723 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-javelin-ship-pad-medium + rotate: false + xy: 935, 134 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-javelin-ship-pad-small + rotate: false + xy: 1912, 415 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-javelin-ship-pad-tiny + rotate: false + xy: 1657, 210 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-javelin-ship-pad-xlarge + rotate: false + xy: 101, 28 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-junction-large + rotate: false + xy: 943, 765 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-junction-medium + rotate: false + xy: 935, 100 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-junction-small + rotate: false + xy: 1912, 389 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-junction-tiny + rotate: false + xy: 1675, 228 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-junction-xlarge + rotate: false + xy: 231, 608 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-kiln-large + rotate: false + xy: 985, 807 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-kiln-medium + rotate: false + xy: 957, 576 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-kiln-small + rotate: false + xy: 1938, 463 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-kiln-tiny + rotate: false + xy: 1693, 246 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-kiln-xlarge + rotate: false + xy: 231, 558 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-lancer-large + rotate: false + xy: 1027, 849 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-lancer-medium + rotate: false + xy: 991, 584 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-lancer-small + rotate: false + xy: 1938, 437 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-lancer-tiny + rotate: false + xy: 1621, 156 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-lancer-xlarge + rotate: false + xy: 745, 866 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-laser-drill-large + rotate: false + xy: 859, 681 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-laser-drill-medium + rotate: false + xy: 1025, 584 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-laser-drill-small + rotate: false + xy: 1938, 411 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-laser-drill-tiny + rotate: false + xy: 1639, 174 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-laser-drill-xlarge + rotate: false + xy: 151, 508 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-launch-pad-large + rotate: false + xy: 901, 681 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-launch-pad-large-large + rotate: false + xy: 943, 723 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-launch-pad-large-medium + rotate: false + xy: 1059, 584 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-launch-pad-large-small + rotate: false + xy: 1938, 385 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-launch-pad-large-tiny + rotate: false + xy: 1657, 192 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-launch-pad-large-xlarge + rotate: false + xy: 151, 458 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-launch-pad-medium + rotate: false + xy: 1093, 584 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-launch-pad-small + rotate: false + xy: 1964, 445 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-launch-pad-tiny + rotate: false + xy: 1675, 210 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-launch-pad-xlarge + rotate: false + xy: 201, 508 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-liquid-junction-large + rotate: false + xy: 985, 765 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-liquid-junction-medium + rotate: false + xy: 1127, 584 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-liquid-junction-small + rotate: false + xy: 1964, 419 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-liquid-junction-tiny + rotate: false + xy: 1693, 228 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-liquid-junction-xlarge + rotate: false + xy: 151, 408 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-liquid-router-large + rotate: false + xy: 1027, 807 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-liquid-router-medium + rotate: false + xy: 1161, 584 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-liquid-router-small + rotate: false + xy: 1990, 445 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-liquid-router-tiny + rotate: false + xy: 1711, 246 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-liquid-router-xlarge + rotate: false + xy: 201, 458 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-liquid-source-large + rotate: false + xy: 1069, 849 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-liquid-source-medium + rotate: false + xy: 1195, 584 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-liquid-source-small + rotate: false + xy: 1964, 393 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-liquid-source-tiny + rotate: false + xy: 1621, 138 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-liquid-source-xlarge + rotate: false + xy: 151, 358 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-liquid-tank-large + rotate: false + xy: 943, 681 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-liquid-tank-medium + rotate: false + xy: 1229, 584 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-liquid-tank-small + rotate: false + xy: 1990, 419 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-liquid-tank-tiny + rotate: false + xy: 1639, 156 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-liquid-tank-xlarge + rotate: false + xy: 201, 408 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-magmarock-large + rotate: false + xy: 985, 723 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-magmarock-medium + rotate: false + xy: 1263, 584 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-magmarock-small + rotate: false + xy: 1990, 393 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-magmarock-tiny + rotate: false + xy: 1657, 174 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-magmarock-xlarge + rotate: false + xy: 151, 308 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-mass-driver-large + rotate: false + xy: 1027, 765 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-mass-driver-medium + rotate: false + xy: 1297, 584 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-mass-driver-small + rotate: false + xy: 2016, 445 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-mass-driver-tiny + rotate: false + xy: 1675, 192 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-mass-driver-xlarge + rotate: false + xy: 201, 358 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-mechanical-drill-large + rotate: false + xy: 1069, 807 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-mechanical-drill-medium + rotate: false + xy: 1331, 584 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-mechanical-drill-small + rotate: false + xy: 2016, 419 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-mechanical-drill-tiny + rotate: false + xy: 1693, 210 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-mechanical-drill-xlarge + rotate: false + xy: 151, 258 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-mechanical-pump-large + rotate: false + xy: 1111, 849 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-mechanical-pump-medium + rotate: false + xy: 1365, 584 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-mechanical-pump-small + rotate: false + xy: 2016, 393 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-mechanical-pump-tiny + rotate: false + xy: 1711, 228 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-mechanical-pump-xlarge + rotate: false + xy: 201, 308 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-meltdown-large + rotate: false + xy: 985, 681 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-meltdown-medium + rotate: false + xy: 1399, 584 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-meltdown-small + rotate: false + xy: 1964, 367 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-meltdown-tiny + rotate: false + xy: 1639, 138 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-meltdown-xlarge + rotate: false + xy: 151, 208 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-melter-large + rotate: false + xy: 1027, 723 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-melter-medium + rotate: false + xy: 1433, 584 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-melter-small + rotate: false + xy: 1990, 367 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-melter-tiny + rotate: false + xy: 1657, 156 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-melter-xlarge + rotate: false + xy: 201, 258 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-mend-projector-large + rotate: false + xy: 1069, 765 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-mend-projector-medium + rotate: false + xy: 1467, 584 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-mend-projector-small + rotate: false + xy: 2016, 367 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-mend-projector-tiny + rotate: false + xy: 1675, 174 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-mend-projector-xlarge + rotate: false + xy: 151, 158 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-mender-large + rotate: false + xy: 1111, 807 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-mender-medium + rotate: false + xy: 1501, 584 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-mender-small + rotate: false + xy: 1473, 220 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-mender-tiny + rotate: false + xy: 1693, 192 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-mender-xlarge + rotate: false + xy: 201, 208 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-message-large + rotate: false + xy: 1153, 849 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-message-medium + rotate: false + xy: 1535, 584 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-message-small + rotate: false + xy: 1473, 194 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-message-tiny + rotate: false + xy: 1711, 210 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-message-xlarge + rotate: false + xy: 151, 108 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-metal-floor-2-large + rotate: false + xy: 1027, 681 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-metal-floor-2-medium + rotate: false + xy: 1569, 584 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-metal-floor-2-small + rotate: false + xy: 1447, 188 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-metal-floor-2-tiny + rotate: false + xy: 1657, 138 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-metal-floor-2-xlarge + rotate: false + xy: 201, 158 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-metal-floor-3-large + rotate: false + xy: 1069, 723 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-metal-floor-3-medium + rotate: false + xy: 1603, 584 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-metal-floor-3-small + rotate: false + xy: 1499, 222 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-metal-floor-3-tiny + rotate: false + xy: 1675, 156 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-metal-floor-3-xlarge + rotate: false + xy: 151, 58 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-metal-floor-5-large + rotate: false + xy: 1111, 765 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-metal-floor-5-medium + rotate: false + xy: 1637, 584 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-metal-floor-5-small + rotate: false + xy: 1499, 196 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-metal-floor-5-tiny + rotate: false + xy: 1693, 174 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-metal-floor-5-xlarge + rotate: false + xy: 201, 108 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-metal-floor-damaged-large + rotate: false + xy: 1153, 807 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-metal-floor-damaged-medium + rotate: false + xy: 1671, 584 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-metal-floor-damaged-small + rotate: false + xy: 1473, 168 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-metal-floor-damaged-tiny + rotate: false + xy: 1711, 192 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-metal-floor-damaged-xlarge + rotate: false + xy: 201, 58 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-metal-floor-large + rotate: false + xy: 1195, 849 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-metal-floor-medium + rotate: false + xy: 1705, 584 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-metal-floor-small + rotate: false + xy: 1499, 170 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-metal-floor-tiny + rotate: false + xy: 1675, 138 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-metal-floor-xlarge + rotate: false + xy: 251, 508 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-moss-large + rotate: false + xy: 1069, 681 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-moss-medium + rotate: false + xy: 1739, 584 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-moss-small + rotate: false + xy: 1447, 162 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-moss-tiny + rotate: false + xy: 1693, 156 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-moss-xlarge + rotate: false + xy: 251, 458 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-multi-press-large + rotate: false + xy: 1111, 723 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-multi-press-medium + rotate: false + xy: 1773, 584 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-multi-press-small + rotate: false + xy: 1473, 142 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-multi-press-tiny + rotate: false + xy: 1711, 174 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-multi-press-xlarge + rotate: false + xy: 251, 408 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-oil-extractor-large + rotate: false + xy: 1153, 765 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-oil-extractor-medium + rotate: false + xy: 969, 542 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-oil-extractor-small + rotate: false + xy: 1499, 144 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-oil-extractor-tiny + rotate: false + xy: 1693, 138 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-oil-extractor-xlarge + rotate: false + xy: 251, 358 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-omega-mech-pad-large + rotate: false + xy: 1195, 807 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-omega-mech-pad-medium + rotate: false + xy: 969, 508 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-omega-mech-pad-small + rotate: false + xy: 1447, 136 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-omega-mech-pad-tiny + rotate: false + xy: 1711, 156 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-omega-mech-pad-xlarge + rotate: false + xy: 251, 308 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-overdrive-projector-large + rotate: false + xy: 1237, 849 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-overdrive-projector-medium + rotate: false + xy: 969, 474 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-overdrive-projector-small + rotate: false + xy: 1473, 116 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-overdrive-projector-tiny + rotate: false + xy: 1711, 138 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-overdrive-projector-xlarge + rotate: false + xy: 251, 258 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-overflow-gate-large + rotate: false + xy: 1111, 681 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-overflow-gate-medium + rotate: false + xy: 969, 440 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-overflow-gate-small + rotate: false + xy: 1499, 118 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-overflow-gate-tiny + rotate: false + xy: 1729, 222 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-overflow-gate-xlarge + rotate: false + xy: 251, 208 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-pebbles-large + rotate: false + xy: 1153, 723 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-pebbles-medium + rotate: false + xy: 969, 406 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-pebbles-small + rotate: false + xy: 1447, 110 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-pebbles-tiny + rotate: false + xy: 1729, 204 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-pebbles-xlarge + rotate: false + xy: 251, 158 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-phantom-factory-large + rotate: false + xy: 1195, 765 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-phantom-factory-medium + rotate: false + xy: 969, 372 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-phantom-factory-small + rotate: false + xy: 1473, 90 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-phantom-factory-tiny + rotate: false + xy: 1747, 222 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-phantom-factory-xlarge + rotate: false + xy: 251, 108 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-phase-conduit-large + rotate: false + xy: 1237, 807 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-phase-conduit-medium + rotate: false + xy: 969, 338 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-phase-conduit-small + rotate: false + xy: 1499, 92 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-phase-conduit-tiny + rotate: false + xy: 1765, 222 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-phase-conduit-xlarge + rotate: false + xy: 251, 58 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-phase-conveyor-large + rotate: false + xy: 1279, 849 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-phase-conveyor-medium + rotate: false + xy: 969, 304 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-phase-conveyor-small + rotate: false + xy: 1447, 84 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-phase-conveyor-tiny + rotate: false + xy: 1729, 186 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-phase-conveyor-xlarge + rotate: false + xy: 151, 8 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-phase-wall-large + rotate: false + xy: 1153, 681 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-phase-wall-large-large + rotate: false + xy: 1195, 723 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-phase-wall-large-medium + rotate: false + xy: 969, 270 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-phase-wall-large-small + rotate: false + xy: 1435, 58 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-phase-wall-large-tiny + rotate: false + xy: 1747, 204 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-phase-wall-large-xlarge + rotate: false + xy: 201, 8 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-phase-wall-medium + rotate: false + xy: 969, 236 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-phase-wall-small + rotate: false + xy: 1461, 58 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-phase-wall-tiny + rotate: false + xy: 1729, 168 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-phase-wall-xlarge + rotate: false + xy: 251, 8 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-phase-weaver-large + rotate: false + xy: 1237, 765 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-phase-weaver-medium + rotate: false + xy: 969, 202 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-phase-weaver-small + rotate: false + xy: 1447, 32 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-phase-weaver-tiny + rotate: false + xy: 1747, 186 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-phase-weaver-xlarge + rotate: false + xy: 281, 619 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-pine-large + rotate: false + xy: 1279, 807 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-pine-medium + rotate: false + xy: 969, 168 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-pine-small + rotate: false + xy: 1447, 6 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-pine-tiny + rotate: false + xy: 1765, 204 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-pine-xlarge + rotate: false + xy: 281, 569 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-plastanium-compressor-large + rotate: false + xy: 1321, 849 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-plastanium-compressor-medium + rotate: false + xy: 969, 134 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-plastanium-compressor-small + rotate: false + xy: 1473, 32 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-plastanium-compressor-tiny + rotate: false + xy: 1783, 221 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-plastanium-compressor-xlarge + rotate: false + xy: 301, 519 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-plastanium-wall-large + rotate: false + xy: 1195, 681 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-plastanium-wall-large-large + rotate: false + xy: 1237, 723 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-plastanium-wall-large-medium + rotate: false + xy: 969, 100 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-plastanium-wall-large-small + rotate: false + xy: 1473, 6 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-plastanium-wall-large-tiny + rotate: false + xy: 1729, 150 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-plastanium-wall-large-xlarge + rotate: false + xy: 301, 469 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-plastanium-wall-medium + rotate: false + xy: 1003, 550 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-plastanium-wall-small + rotate: false + xy: 1487, 64 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-plastanium-wall-tiny + rotate: false + xy: 1747, 168 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-plastanium-wall-xlarge + rotate: false + xy: 301, 419 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-plated-conduit-large + rotate: false + xy: 1279, 765 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-plated-conduit-medium + rotate: false + xy: 1003, 516 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-plated-conduit-small + rotate: false + xy: 1513, 66 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-plated-conduit-tiny + rotate: false + xy: 1765, 186 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-plated-conduit-xlarge + rotate: false + xy: 301, 369 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-pneumatic-drill-large + rotate: false + xy: 1321, 807 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-pneumatic-drill-medium + rotate: false + xy: 1037, 550 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-pneumatic-drill-small + rotate: false + xy: 1499, 38 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-pneumatic-drill-tiny + rotate: false + xy: 1783, 203 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-pneumatic-drill-xlarge + rotate: false + xy: 301, 319 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-power-node-large + rotate: false + xy: 1363, 849 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-power-node-large-large + rotate: false + xy: 1237, 681 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-power-node-large-medium + rotate: false + xy: 1003, 482 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-power-node-large-small + rotate: false + xy: 1499, 12 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-power-node-large-tiny + rotate: false + xy: 1747, 150 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-power-node-large-xlarge + rotate: false + xy: 301, 269 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-power-node-medium + rotate: false + xy: 1037, 516 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-power-node-small + rotate: false + xy: 1525, 40 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-power-node-tiny + rotate: false + xy: 1765, 168 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-power-node-xlarge + rotate: false + xy: 301, 219 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-power-source-large + rotate: false + xy: 1279, 723 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-power-source-medium + rotate: false + xy: 1071, 550 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-power-source-small + rotate: false + xy: 1525, 14 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-power-source-tiny + rotate: false + xy: 1783, 185 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-power-source-xlarge + rotate: false + xy: 301, 169 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-power-void-large + rotate: false + xy: 1321, 765 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-power-void-medium + rotate: false + xy: 1003, 448 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-power-void-small + rotate: false + xy: 1575, 322 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-power-void-tiny + rotate: false + xy: 1765, 150 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-power-void-xlarge + rotate: false + xy: 301, 119 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-pulse-conduit-large + rotate: false + xy: 1363, 807 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-pulse-conduit-medium + rotate: false + xy: 1037, 482 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-pulse-conduit-small + rotate: false + xy: 1575, 296 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-pulse-conduit-tiny + rotate: false + xy: 1783, 167 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-pulse-conduit-xlarge + rotate: false + xy: 301, 69 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-pulverizer-large + rotate: false + xy: 1405, 849 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-pulverizer-medium + rotate: false + xy: 1071, 516 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-pulverizer-small + rotate: false + xy: 1601, 324 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-pulverizer-tiny + rotate: false + xy: 1783, 149 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-pulverizer-xlarge + rotate: false + xy: 301, 19 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-pyratite-mixer-large + rotate: false + xy: 1279, 681 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-pyratite-mixer-medium + rotate: false + xy: 1105, 550 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-pyratite-mixer-small + rotate: false + xy: 1601, 298 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-pyratite-mixer-tiny + rotate: false + xy: 1729, 132 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-pyratite-mixer-xlarge + rotate: false + xy: 795, 878 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-repair-point-large + rotate: false + xy: 1321, 723 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-repair-point-medium + rotate: false + xy: 1003, 414 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-repair-point-small + rotate: false + xy: 1730, 370 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-repair-point-tiny + rotate: false + xy: 1747, 132 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-repair-point-xlarge + rotate: false + xy: 309, 816 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-revenant-factory-large + rotate: false + xy: 1363, 765 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-revenant-factory-medium + rotate: false + xy: 1037, 448 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-revenant-factory-small + rotate: false + xy: 1756, 370 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-revenant-factory-tiny + rotate: false + xy: 1765, 132 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-revenant-factory-xlarge + rotate: false + xy: 309, 766 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-ripple-large + rotate: false + xy: 1405, 807 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-ripple-medium + rotate: false + xy: 1071, 482 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-ripple-small + rotate: false + xy: 1782, 370 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-ripple-tiny + rotate: false + xy: 1783, 131 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-ripple-xlarge + rotate: false + xy: 359, 816 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-rock-large + rotate: false + xy: 1447, 849 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-rock-medium + rotate: false + xy: 1105, 516 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-rock-small + rotate: false + xy: 1808, 366 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-rock-tiny + rotate: false + xy: 1621, 120 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-rock-xlarge + rotate: false + xy: 309, 716 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-rocks-large + rotate: false + xy: 1321, 681 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-rocks-medium + rotate: false + xy: 1139, 550 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-rocks-small + rotate: false + xy: 1834, 363 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-rocks-tiny + rotate: false + xy: 1639, 120 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-rocks-xlarge + rotate: false + xy: 359, 766 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-rotary-pump-large + rotate: false + xy: 1363, 723 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-rotary-pump-medium + rotate: false + xy: 1003, 380 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-rotary-pump-small + rotate: false + xy: 1860, 363 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-rotary-pump-tiny + rotate: false + xy: 1657, 120 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-rotary-pump-xlarge + rotate: false + xy: 409, 816 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-router-large + rotate: false + xy: 1405, 765 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-router-medium + rotate: false + xy: 1037, 414 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-router-small + rotate: false + xy: 1886, 363 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-router-tiny + rotate: false + xy: 1675, 120 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-router-xlarge + rotate: false + xy: 359, 716 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-rtg-generator-large + rotate: false + xy: 1447, 807 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-rtg-generator-medium + rotate: false + xy: 1071, 448 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-rtg-generator-small + rotate: false + xy: 1912, 363 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-rtg-generator-tiny + rotate: false + xy: 1693, 120 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-rtg-generator-xlarge + rotate: false + xy: 409, 766 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-salt-large + rotate: false + xy: 1489, 849 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-salt-medium + rotate: false + xy: 1105, 482 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-salt-small + rotate: false + xy: 1938, 359 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-salt-tiny + rotate: false + xy: 1711, 120 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-salt-xlarge + rotate: false + xy: 459, 816 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-saltrocks-large + rotate: false + xy: 1363, 681 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-saltrocks-medium + rotate: false + xy: 1139, 516 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-saltrocks-small + rotate: false + xy: 1964, 341 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-saltrocks-tiny + rotate: false + xy: 1729, 114 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-saltrocks-xlarge + rotate: false + xy: 409, 716 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-salvo-large + rotate: false + xy: 1405, 723 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-salvo-medium + rotate: false + xy: 1173, 550 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-salvo-small + rotate: false + xy: 1990, 341 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-salvo-tiny + rotate: false + xy: 1747, 114 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-salvo-xlarge + rotate: false + xy: 459, 766 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-sand-boulder-large + rotate: false + xy: 1447, 765 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-sand-boulder-medium + rotate: false + xy: 1003, 346 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-sand-boulder-small + rotate: false + xy: 2016, 341 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-sand-boulder-tiny + rotate: false + xy: 1765, 114 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-sand-boulder-xlarge + rotate: false + xy: 509, 816 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-sand-large + rotate: false + xy: 1489, 807 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-sand-medium + rotate: false + xy: 1037, 380 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-sand-small + rotate: false + xy: 1375, 184 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-sand-tiny + rotate: false + xy: 1783, 113 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-sand-water-large + rotate: false + xy: 1531, 849 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-sand-water-medium + rotate: false + xy: 1071, 414 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-sand-water-small + rotate: false + xy: 1401, 186 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-sand-water-tiny + rotate: false + xy: 1603, 110 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-sand-water-xlarge + rotate: false + xy: 459, 716 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-sand-xlarge + rotate: false + xy: 509, 766 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-sandrocks-large + rotate: false + xy: 1405, 681 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-sandrocks-medium + rotate: false + xy: 1105, 448 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-sandrocks-small + rotate: false + xy: 1375, 158 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-sandrocks-tiny + rotate: false + xy: 1621, 102 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-sandrocks-xlarge + rotate: false + xy: 559, 816 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-scatter-large + rotate: false + xy: 1447, 723 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-scatter-medium + rotate: false + xy: 1139, 482 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-scatter-small + rotate: false + xy: 1401, 160 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-scatter-tiny + rotate: false + xy: 1639, 102 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-scatter-xlarge + rotate: false + xy: 509, 716 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-scorch-large + rotate: false + xy: 1489, 765 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-scorch-medium + rotate: false + xy: 1173, 516 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-scorch-small + rotate: false + xy: 1403, 134 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-scorch-tiny + rotate: false + xy: 1657, 102 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-scorch-xlarge + rotate: false + xy: 559, 766 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-scrap-wall-gigantic-large + rotate: false + xy: 1531, 807 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-scrap-wall-gigantic-medium + rotate: false + xy: 1207, 550 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-scrap-wall-gigantic-small + rotate: false + xy: 1507, 254 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-scrap-wall-gigantic-tiny + rotate: false + xy: 1675, 102 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-scrap-wall-gigantic-xlarge + rotate: false + xy: 609, 816 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-scrap-wall-huge-large + rotate: false + xy: 1573, 849 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-scrap-wall-huge-medium + rotate: false + xy: 1003, 312 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-scrap-wall-huge-small + rotate: false + xy: 1533, 256 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-scrap-wall-huge-tiny + rotate: false + xy: 1693, 102 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-scrap-wall-huge-xlarge + rotate: false + xy: 559, 716 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-scrap-wall-large + rotate: false + xy: 1447, 681 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-scrap-wall-large-large + rotate: false + xy: 1489, 723 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-scrap-wall-large-medium + rotate: false + xy: 1037, 346 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-scrap-wall-large-small + rotate: false + xy: 1613, 394 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-scrap-wall-large-tiny + rotate: false + xy: 1711, 102 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-scrap-wall-large-xlarge + rotate: false + xy: 609, 766 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-scrap-wall-medium + rotate: false + xy: 1071, 380 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-scrap-wall-small + rotate: false + xy: 1611, 368 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-scrap-wall-tiny + rotate: false + xy: 1729, 96 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-scrap-wall-xlarge + rotate: false + xy: 659, 816 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-separator-large + rotate: false + xy: 1531, 765 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-separator-medium + rotate: false + xy: 1105, 414 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-separator-small + rotate: false + xy: 1601, 272 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-separator-tiny + rotate: false + xy: 1747, 96 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-separator-xlarge + rotate: false + xy: 609, 716 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-shale-boulder-large + rotate: false + xy: 1573, 807 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-shale-boulder-medium + rotate: false + xy: 1139, 448 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-shale-boulder-small + rotate: false + xy: 1525, 228 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-shale-boulder-tiny + rotate: false + xy: 1765, 96 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-shale-boulder-xlarge + rotate: false + xy: 659, 766 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-shale-large + rotate: false + xy: 1615, 849 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-shale-medium + rotate: false + xy: 1173, 482 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-shale-small + rotate: false + xy: 1525, 202 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-shale-tiny + rotate: false + xy: 1783, 95 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-shale-xlarge + rotate: false + xy: 709, 816 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-shalerocks-large + rotate: false + xy: 1489, 681 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-shalerocks-medium + rotate: false + xy: 1207, 516 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-shalerocks-small + rotate: false + xy: 1525, 176 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-shalerocks-tiny + rotate: false + xy: 1801, 311 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-shalerocks-xlarge + rotate: false + xy: 659, 716 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-shock-mine-large + rotate: false + xy: 1531, 723 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-shock-mine-medium + rotate: false + xy: 1241, 550 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-shock-mine-small + rotate: false + xy: 1525, 150 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-shock-mine-tiny + rotate: false + xy: 1801, 293 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-shock-mine-xlarge + rotate: false + xy: 709, 766 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-shrubs-large + rotate: false + xy: 1573, 765 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-shrubs-medium + rotate: false + xy: 1003, 278 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-shrubs-small + rotate: false + xy: 1525, 124 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-shrubs-tiny + rotate: false + xy: 1801, 275 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-shrubs-xlarge + rotate: false + xy: 709, 716 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-silicon-smelter-large + rotate: false + xy: 1615, 807 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-silicon-smelter-medium + rotate: false + xy: 1037, 312 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-silicon-smelter-small + rotate: false + xy: 1525, 98 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-silicon-smelter-tiny + rotate: false + xy: 1801, 257 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-silicon-smelter-xlarge + rotate: false + xy: 759, 816 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-snow-large + rotate: false + xy: 1657, 849 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-snow-medium + rotate: false + xy: 1071, 346 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-snow-pine-large + rotate: false + xy: 1531, 681 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-snow-pine-medium + rotate: false + xy: 1105, 380 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-snow-pine-small + rotate: false + xy: 1551, 230 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-snow-pine-tiny + rotate: false + xy: 1801, 239 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-snow-pine-xlarge + rotate: false + xy: 759, 766 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-snow-small + rotate: false + xy: 1551, 204 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-snow-tiny + rotate: false + xy: 1801, 221 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-snow-xlarge + rotate: false + xy: 759, 716 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-snowrock-large + rotate: false + xy: 1573, 723 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-snowrock-medium + rotate: false + xy: 1139, 414 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-snowrock-small + rotate: false + xy: 1551, 178 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-snowrock-tiny + rotate: false + xy: 1801, 203 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-snowrock-xlarge + rotate: false + xy: 809, 828 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-snowrocks-large + rotate: false + xy: 1615, 765 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-snowrocks-medium + rotate: false + xy: 1173, 448 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-snowrocks-small + rotate: false + xy: 1551, 152 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-snowrocks-tiny + rotate: false + xy: 1801, 185 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-snowrocks-xlarge + rotate: false + xy: 809, 778 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-solar-panel-large + rotate: false + xy: 1657, 807 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-solar-panel-large-large + rotate: false + xy: 1699, 849 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-solar-panel-large-medium + rotate: false + xy: 1207, 482 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-solar-panel-large-small + rotate: false + xy: 1551, 126 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-solar-panel-large-tiny + rotate: false + xy: 1801, 167 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-solar-panel-large-xlarge + rotate: false + xy: 809, 728 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-solar-panel-medium + rotate: false + xy: 1241, 516 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-solar-panel-small + rotate: false + xy: 1551, 100 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-solar-panel-tiny + rotate: false + xy: 1801, 149 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-solar-panel-xlarge + rotate: false + xy: 809, 678 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-sorter-large + rotate: false + xy: 1573, 681 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-sorter-medium + rotate: false + xy: 1275, 550 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-sorter-small + rotate: false + xy: 1539, 72 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-sorter-tiny + rotate: false + xy: 1801, 131 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-sorter-xlarge + rotate: false + xy: 331, 666 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-spawn-large + rotate: false + xy: 1615, 723 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-spawn-medium + rotate: false + xy: 1003, 244 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-spawn-small + rotate: false + xy: 1565, 74 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-spawn-tiny + rotate: false + xy: 1801, 113 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-spawn-xlarge + rotate: false + xy: 331, 616 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-spectre-large + rotate: false + xy: 1657, 765 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-spectre-medium + rotate: false + xy: 1037, 278 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-spectre-small + rotate: false + xy: 1551, 46 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-spectre-tiny + rotate: false + xy: 1801, 95 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-spectre-xlarge + rotate: false + xy: 381, 666 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-spirit-factory-large + rotate: false + xy: 1699, 807 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-spirit-factory-medium + rotate: false + xy: 1071, 312 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-spirit-factory-small + rotate: false + xy: 1551, 20 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-spirit-factory-tiny + rotate: false + xy: 1819, 309 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-spirit-factory-xlarge + rotate: false + xy: 381, 616 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-spore-cluster-large + rotate: false + xy: 1741, 849 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-spore-cluster-medium + rotate: false + xy: 1105, 346 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-spore-cluster-small + rotate: false + xy: 1577, 48 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-spore-cluster-tiny + rotate: false + xy: 1819, 291 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-spore-cluster-xlarge + rotate: false + xy: 431, 666 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-spore-moss-large + rotate: false + xy: 1615, 681 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-spore-moss-medium + rotate: false + xy: 1139, 380 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-spore-moss-small + rotate: false + xy: 1577, 22 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-spore-moss-tiny + rotate: false + xy: 1837, 309 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-spore-moss-xlarge + rotate: false + xy: 431, 616 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-spore-pine-large + rotate: false + xy: 1657, 723 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-spore-pine-medium + rotate: false + xy: 1173, 414 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-spore-pine-small + rotate: false + xy: 1541, 288 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-spore-pine-tiny + rotate: false + xy: 1819, 273 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-spore-pine-xlarge + rotate: false + xy: 481, 666 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-spore-press-large + rotate: false + xy: 1699, 765 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-spore-press-medium + rotate: false + xy: 1207, 448 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-spore-press-small + rotate: false + xy: 1637, 368 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-spore-press-tiny + rotate: false + xy: 1837, 291 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-spore-press-xlarge + rotate: false + xy: 481, 616 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-sporerocks-large + rotate: false + xy: 1741, 807 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-sporerocks-medium + rotate: false + xy: 1241, 482 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-sporerocks-small + rotate: false + xy: 1663, 368 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-sporerocks-tiny + rotate: false + xy: 1855, 309 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-sporerocks-xlarge + rotate: false + xy: 531, 666 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-stone-large + rotate: false + xy: 1783, 849 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-stone-medium + rotate: false + xy: 1275, 516 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-stone-small + rotate: false + xy: 1689, 368 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-stone-tiny + rotate: false + xy: 1819, 255 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-stone-xlarge + rotate: false + xy: 531, 616 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-surge-tower-large + rotate: false + xy: 1657, 681 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-surge-tower-medium + rotate: false + xy: 1309, 550 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-surge-tower-small + rotate: false + xy: 1627, 342 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-surge-tower-tiny + rotate: false + xy: 1837, 273 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-surge-tower-xlarge + rotate: false + xy: 581, 666 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-surge-wall-large + rotate: false + xy: 1699, 723 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-surge-wall-large-large + rotate: false + xy: 1741, 765 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-surge-wall-large-medium + rotate: false + xy: 1003, 210 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-surge-wall-large-small + rotate: false + xy: 1627, 316 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-surge-wall-large-tiny + rotate: false + xy: 1855, 291 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-surge-wall-large-xlarge + rotate: false + xy: 581, 616 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-surge-wall-medium + rotate: false + xy: 1037, 244 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-surge-wall-small + rotate: false + xy: 1653, 342 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-surge-wall-tiny + rotate: false + xy: 1873, 309 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-surge-wall-xlarge + rotate: false + xy: 631, 666 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-swarmer-large + rotate: false + xy: 1783, 807 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-swarmer-medium + rotate: false + xy: 1071, 278 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-swarmer-small + rotate: false + xy: 1627, 290 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-swarmer-tiny + rotate: false + xy: 1819, 237 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-swarmer-xlarge + rotate: false + xy: 631, 616 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-tainted-water-large + rotate: false + xy: 1825, 849 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-tainted-water-medium + rotate: false + xy: 1105, 312 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-tainted-water-small + rotate: false + xy: 1653, 316 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-tainted-water-tiny + rotate: false + xy: 1837, 255 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-tainted-water-xlarge + rotate: false + xy: 681, 666 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-tar-large + rotate: false + xy: 1699, 681 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-tar-medium + rotate: false + xy: 1139, 346 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-tar-small + rotate: false + xy: 1679, 342 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-tar-tiny + rotate: false + xy: 1855, 273 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-tar-xlarge + rotate: false + xy: 681, 616 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-tau-mech-pad-large + rotate: false + xy: 1741, 723 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-tau-mech-pad-medium + rotate: false + xy: 1173, 380 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-tau-mech-pad-small + rotate: false + xy: 1653, 290 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-tau-mech-pad-tiny + rotate: false + xy: 1873, 291 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-tau-mech-pad-xlarge + rotate: false + xy: 731, 666 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-tendrils-large + rotate: false + xy: 1783, 765 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-tendrils-medium + rotate: false + xy: 1207, 414 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-tendrils-small + rotate: false + xy: 1679, 316 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-tendrils-tiny + rotate: false + xy: 1891, 309 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-tendrils-xlarge + rotate: false + xy: 731, 616 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-thermal-generator-large + rotate: false + xy: 1825, 807 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-thermal-generator-medium + rotate: false + xy: 1241, 448 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-thermal-generator-small + rotate: false + xy: 1679, 290 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-thermal-generator-tiny + rotate: false + xy: 1819, 219 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-thermal-generator-xlarge + rotate: false + xy: 781, 628 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-thermal-pump-large + rotate: false + xy: 1867, 849 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-thermal-pump-medium + rotate: false + xy: 1275, 482 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-thermal-pump-small + rotate: false + xy: 1627, 264 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-thermal-pump-tiny + rotate: false + xy: 1837, 237 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-thermal-pump-xlarge + rotate: false + xy: 831, 628 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-thorium-reactor-large + rotate: false + xy: 1741, 681 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-thorium-reactor-medium + rotate: false + xy: 1309, 516 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-thorium-reactor-small + rotate: false + xy: 1653, 264 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-thorium-reactor-tiny + rotate: false + xy: 1855, 255 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-thorium-reactor-xlarge + rotate: false + xy: 781, 578 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-thorium-wall-large + rotate: false + xy: 1783, 723 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-thorium-wall-large-large + rotate: false + xy: 1825, 765 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-thorium-wall-large-medium + rotate: false + xy: 1343, 550 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-thorium-wall-large-small + rotate: false + xy: 1679, 264 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-thorium-wall-large-tiny + rotate: false + xy: 1873, 273 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-thorium-wall-large-xlarge + rotate: false + xy: 831, 578 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-thorium-wall-medium + rotate: false + xy: 1003, 176 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-thorium-wall-small + rotate: false + xy: 1705, 342 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-thorium-wall-tiny + rotate: false + xy: 1891, 291 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-thorium-wall-xlarge + rotate: false + xy: 351, 566 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-thruster-large + rotate: false + xy: 1867, 807 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-thruster-medium + rotate: false + xy: 1037, 210 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-thruster-small + rotate: false + xy: 1705, 316 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-thruster-tiny + rotate: false + xy: 1909, 309 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-thruster-xlarge + rotate: false + xy: 351, 516 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-titan-factory-large + rotate: false + xy: 1909, 849 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-titan-factory-medium + rotate: false + xy: 1071, 244 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-titan-factory-small + rotate: false + xy: 1705, 290 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-titan-factory-tiny + rotate: false + xy: 1819, 201 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-titan-factory-xlarge + rotate: false + xy: 401, 566 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-titanium-conveyor-large + rotate: false + xy: 1783, 681 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-titanium-conveyor-medium + rotate: false + xy: 1105, 278 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-titanium-conveyor-small + rotate: false + xy: 1705, 264 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-titanium-conveyor-tiny + rotate: false + xy: 1837, 219 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-titanium-conveyor-xlarge + rotate: false + xy: 351, 466 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-titanium-wall-large + rotate: false + xy: 1825, 723 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-titanium-wall-large-large + rotate: false + xy: 1867, 765 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-titanium-wall-large-medium + rotate: false + xy: 1139, 312 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-titanium-wall-large-small + rotate: false + xy: 1731, 344 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-titanium-wall-large-tiny + rotate: false + xy: 1855, 237 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-titanium-wall-large-xlarge + rotate: false + xy: 401, 516 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-titanium-wall-medium + rotate: false + xy: 1173, 346 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-titanium-wall-small + rotate: false + xy: 1757, 344 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-titanium-wall-tiny + rotate: false + xy: 1873, 255 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-titanium-wall-xlarge + rotate: false + xy: 451, 566 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-trident-ship-pad-large + rotate: false + xy: 1909, 807 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-trident-ship-pad-medium + rotate: false + xy: 1207, 380 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-trident-ship-pad-small + rotate: false + xy: 1731, 318 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-trident-ship-pad-tiny + rotate: false + xy: 1891, 273 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-trident-ship-pad-xlarge + rotate: false + xy: 351, 416 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-turbine-generator-large + rotate: false + xy: 1825, 681 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-turbine-generator-medium + rotate: false + xy: 1241, 414 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-turbine-generator-small + rotate: false + xy: 1731, 292 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-turbine-generator-tiny + rotate: false + xy: 1909, 291 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-turbine-generator-xlarge + rotate: false + xy: 401, 466 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-unloader-large + rotate: false + xy: 1867, 723 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-unloader-medium + rotate: false + xy: 1275, 448 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-unloader-small + rotate: false + xy: 1757, 318 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-unloader-tiny + rotate: false + xy: 1819, 183 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-unloader-xlarge + rotate: false + xy: 451, 516 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-vault-large + rotate: false + xy: 1909, 765 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-vault-medium + rotate: false + xy: 1309, 482 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-vault-small + rotate: false + xy: 1731, 266 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-vault-tiny + rotate: false + xy: 1837, 201 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-vault-xlarge + rotate: false + xy: 501, 566 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-water-extractor-large + rotate: false + xy: 1867, 681 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-water-extractor-medium + rotate: false + xy: 1343, 516 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-water-extractor-small + rotate: false + xy: 1757, 292 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-water-extractor-tiny + rotate: false + xy: 1855, 219 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-water-extractor-xlarge + rotate: false + xy: 351, 366 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-water-large + rotate: false + xy: 1909, 723 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-water-medium + rotate: false + xy: 1377, 550 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-water-small + rotate: false + xy: 1757, 266 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-water-tiny + rotate: false + xy: 1873, 237 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-water-xlarge + rotate: false + xy: 401, 416 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-wave-large + rotate: false + xy: 1909, 681 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-wave-medium + rotate: false + xy: 1003, 142 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-wave-small + rotate: false + xy: 1559, 262 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-wave-tiny + rotate: false + xy: 1891, 255 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-wave-xlarge + rotate: false + xy: 451, 466 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-white-tree-dead-large + rotate: false + xy: 881, 639 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-white-tree-dead-medium + rotate: false + xy: 1037, 176 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-white-tree-dead-small + rotate: false + xy: 1731, 240 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-white-tree-dead-tiny + rotate: false + xy: 1909, 273 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-white-tree-dead-xlarge + rotate: false + xy: 501, 516 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-white-tree-large + rotate: false + xy: 881, 597 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-white-tree-medium + rotate: false + xy: 1071, 210 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-white-tree-small + rotate: false + xy: 1757, 240 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-white-tree-tiny + rotate: false + xy: 1819, 165 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-white-tree-xlarge + rotate: false + xy: 551, 566 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-wraith-factory-large + rotate: false + xy: 923, 639 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-wraith-factory-medium + rotate: false + xy: 1105, 244 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-wraith-factory-small + rotate: false + xy: 1577, 236 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-wraith-factory-tiny + rotate: false + xy: 1837, 183 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-wraith-factory-xlarge + rotate: false + xy: 351, 316 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +button + rotate: false + xy: 1535, 652 + size: 36, 27 + split: 12, 12, 12, 12 + orig: 36, 27 + offset: 0, 0 + index: -1 +button-disabled + rotate: false + xy: 965, 652 + size: 36, 27 + split: 12, 12, 12, 12 + orig: 36, 27 + offset: 0, 0 + index: -1 +button-down + rotate: false + xy: 923, 610 + size: 36, 27 + split: 12, 12, 12, 12 + orig: 36, 27 + offset: 0, 0 + index: -1 +button-edge-1 + rotate: false + xy: 1003, 652 + size: 36, 27 + split: 12, 12, 12, 12 + orig: 36, 27 + offset: 0, 0 + index: -1 +button-edge-2 + rotate: false + xy: 1041, 652 + size: 36, 27 + split: 12, 12, 12, 12 + orig: 36, 27 + offset: 0, 0 + index: -1 +button-edge-3 + rotate: false + xy: 1079, 652 + size: 36, 27 + split: 12, 12, 12, 12 + orig: 36, 27 + offset: 0, 0 + index: -1 +button-edge-4 + rotate: false + xy: 1117, 652 + size: 36, 27 + split: 12, 12, 12, 12 + orig: 36, 27 + offset: 0, 0 + index: -1 +button-edge-over-4 + rotate: false + xy: 1155, 652 + size: 36, 27 + split: 12, 12, 12, 12 + orig: 36, 27 + offset: 0, 0 + index: -1 +button-over + rotate: false + xy: 1193, 652 + size: 36, 27 + split: 12, 12, 12, 12 + orig: 36, 27 + offset: 0, 0 + index: -1 +button-red + rotate: false + xy: 1231, 652 + size: 36, 27 + split: 12, 12, 12, 12 + orig: 36, 27 + offset: 0, 0 + index: -1 +button-right + rotate: false + xy: 1345, 652 + size: 36, 27 + split: 12, 12, 12, 12 + orig: 36, 27 + offset: 0, 0 + index: -1 +button-right-down + rotate: false + xy: 1269, 652 + size: 36, 27 + split: 12, 12, 12, 12 + orig: 36, 27 + offset: 0, 0 + index: -1 +button-right-over + rotate: false + xy: 1307, 652 + size: 36, 27 + split: 12, 12, 12, 12 + orig: 36, 27 + offset: 0, 0 + index: -1 +button-select + rotate: false + xy: 1577, 210 + size: 24, 24 + split: 4, 4, 4, 4 + orig: 24, 24 + offset: 0, 0 + index: -1 +button-square + rotate: false + xy: 1459, 652 + size: 36, 27 + split: 12, 12, 12, 12 + orig: 36, 27 + offset: 0, 0 + index: -1 +button-square-down + rotate: false + xy: 1383, 652 + size: 36, 27 + split: 12, 12, 12, 12 + orig: 36, 27 + offset: 0, 0 + index: -1 +button-square-over + rotate: false + xy: 1421, 652 + size: 36, 27 + split: 12, 12, 12, 12 + orig: 36, 27 + offset: 0, 0 + index: -1 +button-trans + rotate: false + xy: 1497, 652 + size: 36, 27 + split: 12, 12, 12, 12 + orig: 36, 27 + offset: 0, 0 + index: -1 +check-disabled + rotate: false + xy: 1139, 278 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +check-off + rotate: false + xy: 1173, 312 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +check-on + rotate: false + xy: 1207, 346 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +check-on-disabled + rotate: false + xy: 1241, 380 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +check-on-over + rotate: false + xy: 1275, 414 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +check-over + rotate: false + xy: 1309, 448 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +clear + rotate: false + xy: 771, 916 + size: 10, 10 + orig: 10, 10 + offset: 0, 0 + index: -1 +cursor + rotate: false + xy: 1979, 893 + size: 4, 4 + orig: 4, 4 + offset: 0, 0 + index: -1 +discord-banner + rotate: false + xy: 771, 978 + size: 84, 45 + orig: 84, 45 + offset: 0, 0 + index: -1 +flat-down-base + rotate: false + xy: 1573, 652 + size: 36, 27 + split: 12, 12, 12, 12 + orig: 36, 27 + offset: 0, 0 + index: -1 +icon-about + rotate: false + xy: 401, 366 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +icon-about-small + rotate: false + xy: 1343, 482 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +icon-about-smaller + rotate: false + xy: 1615, 484 + size: 30, 30 + orig: 30, 30 + offset: 0, 0 + index: -1 +icon-about-tiny + rotate: false + xy: 1855, 201 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +icon-add + rotate: false + xy: 451, 416 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +icon-add-small + rotate: false + xy: 1377, 516 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +icon-add-smaller + rotate: false + xy: 1649, 518 + size: 30, 30 + orig: 30, 30 + offset: 0, 0 + index: -1 +icon-add-tiny + rotate: false + xy: 1873, 219 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +icon-admin + rotate: false + xy: 501, 466 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +icon-admin-badge + rotate: false + xy: 551, 516 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +icon-admin-badge-small + rotate: false + xy: 1411, 550 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +icon-admin-badge-smaller + rotate: false + xy: 1683, 552 + size: 30, 30 + orig: 30, 30 + offset: 0, 0 + index: -1 +icon-admin-badge-tiny + rotate: false + xy: 1891, 237 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +icon-admin-small + rotate: false + xy: 1003, 108 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +icon-admin-smaller + rotate: false + xy: 1275, 110 + size: 30, 30 + orig: 30, 30 + offset: 0, 0 + index: -1 +icon-admin-tiny + rotate: false + xy: 1909, 255 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +icon-arrow + rotate: false + xy: 601, 566 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +icon-arrow-16 + rotate: false + xy: 601, 566 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +icon-arrow-16-small + rotate: false + xy: 1037, 142 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +icon-arrow-small + rotate: false + xy: 1037, 142 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +icon-arrow-16-smaller + rotate: false + xy: 1309, 144 + size: 30, 30 + orig: 30, 30 + offset: 0, 0 + index: -1 +icon-arrow-smaller + rotate: false + xy: 1309, 144 + size: 30, 30 + orig: 30, 30 + offset: 0, 0 + index: -1 +icon-arrow-16-tiny + rotate: false + xy: 1819, 147 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +icon-arrow-tiny + rotate: false + xy: 1819, 147 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +icon-arrow-down + rotate: false + xy: 351, 266 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +icon-arrow-down-small + rotate: false + xy: 1071, 176 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +icon-arrow-down-smaller + rotate: false + xy: 1343, 178 + size: 30, 30 + orig: 30, 30 + offset: 0, 0 + index: -1 +icon-arrow-down-tiny + rotate: false + xy: 1837, 165 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +icon-arrow-left + rotate: false + xy: 401, 316 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +icon-arrow-left-small + rotate: false + xy: 1105, 210 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +icon-arrow-left-smaller + rotate: false + xy: 1377, 212 + size: 30, 30 + orig: 30, 30 + offset: 0, 0 + index: -1 +icon-arrow-left-tiny + rotate: false + xy: 1855, 183 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +icon-arrow-right + rotate: false + xy: 451, 366 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +icon-arrow-right-small + rotate: false + xy: 1139, 244 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +icon-arrow-right-smaller + rotate: false + xy: 1411, 246 + size: 30, 30 + orig: 30, 30 + offset: 0, 0 + index: -1 +icon-arrow-right-tiny + rotate: false + xy: 1873, 201 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +icon-arrow-up + rotate: false + xy: 501, 416 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +icon-arrow-up-small + rotate: false + xy: 1173, 278 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +icon-arrow-up-smaller + rotate: false + xy: 1445, 280 + size: 30, 30 + orig: 30, 30 + offset: 0, 0 + index: -1 +icon-arrow-up-tiny + rotate: false + xy: 1891, 219 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +icon-back + rotate: false + xy: 551, 466 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +icon-back-small + rotate: false + xy: 1207, 312 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +icon-back-smaller + rotate: false + xy: 1479, 314 + size: 30, 30 + orig: 30, 30 + offset: 0, 0 + index: -1 +icon-back-tiny + rotate: false + xy: 1909, 237 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +icon-ban + rotate: false + xy: 601, 516 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +icon-ban-small + rotate: false + xy: 1241, 346 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +icon-ban-smaller + rotate: false + xy: 1513, 348 + size: 30, 30 + orig: 30, 30 + offset: 0, 0 + index: -1 +icon-ban-tiny + rotate: false + xy: 1819, 129 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +icon-break + rotate: false + xy: 651, 566 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +icon-break-small + rotate: false + xy: 1275, 380 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +icon-break-smaller + rotate: false + xy: 1547, 382 + size: 30, 30 + orig: 30, 30 + offset: 0, 0 + index: -1 +icon-break-tiny + rotate: false + xy: 1837, 147 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +icon-cancel + rotate: false + xy: 351, 216 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +icon-cancel-small + rotate: false + xy: 1309, 414 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +icon-cancel-smaller + rotate: false + xy: 1581, 416 + size: 30, 30 + orig: 30, 30 + offset: 0, 0 + index: -1 +icon-cancel-tiny + rotate: false + xy: 1855, 165 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +icon-quit-tiny + rotate: false + xy: 1855, 165 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +icon-changelog + rotate: false + xy: 401, 266 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +icon-changelog-small + rotate: false + xy: 1343, 448 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +icon-changelog-smaller + rotate: false + xy: 1615, 452 + size: 30, 30 + orig: 30, 30 + offset: 0, 0 + index: -1 +icon-changelog-tiny + rotate: false + xy: 1873, 183 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +icon-chat + rotate: false + xy: 451, 316 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +icon-chat-small + rotate: false + xy: 1377, 482 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +icon-chat-smaller + rotate: false + xy: 1715, 552 + size: 30, 30 + orig: 30, 30 + offset: 0, 0 + index: -1 +icon-chat-tiny + rotate: false + xy: 1891, 201 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +icon-check + rotate: false + xy: 501, 366 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +icon-check-small + rotate: false + xy: 1411, 516 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +icon-check-smaller + rotate: false + xy: 1747, 552 + size: 30, 30 + orig: 30, 30 + offset: 0, 0 + index: -1 +icon-check-tiny + rotate: false + xy: 1909, 219 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +icon-command-attack + rotate: false + xy: 551, 416 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +icon-command-attack-small + rotate: false + xy: 1445, 550 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +icon-command-attack-smaller + rotate: false + xy: 1779, 552 + size: 30, 30 + orig: 30, 30 + offset: 0, 0 + index: -1 +icon-command-attack-tiny + rotate: false + xy: 1819, 111 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +icon-command-patrol + rotate: false + xy: 601, 466 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +icon-command-patrol-small + rotate: false + xy: 1037, 108 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +icon-command-patrol-smaller + rotate: false + xy: 1941, 649 + size: 30, 30 + orig: 30, 30 + offset: 0, 0 + index: -1 +icon-command-patrol-tiny + rotate: false + xy: 1837, 129 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +icon-command-rally + rotate: false + xy: 651, 516 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +icon-command-rally-small + rotate: false + xy: 1071, 142 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +icon-command-rally-smaller + rotate: false + xy: 935, 68 + size: 30, 30 + orig: 30, 30 + offset: 0, 0 + index: -1 +icon-command-rally-tiny + rotate: false + xy: 1855, 147 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +icon-command-retreat + rotate: false + xy: 701, 566 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +icon-command-retreat-small + rotate: false + xy: 1105, 176 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +icon-command-retreat-smaller + rotate: false + xy: 935, 36 + size: 30, 30 + orig: 30, 30 + offset: 0, 0 + index: -1 +icon-command-retreat-tiny + rotate: false + xy: 1873, 165 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +icon-copy + rotate: false + xy: 351, 166 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +icon-copy-small + rotate: false + xy: 1139, 210 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +icon-copy-smaller + rotate: false + xy: 967, 68 + size: 30, 30 + orig: 30, 30 + offset: 0, 0 + index: -1 +icon-copy-tiny + rotate: false + xy: 1891, 183 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +icon-crafting + rotate: false + xy: 401, 216 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +icon-crafting-small + rotate: false + xy: 1173, 244 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +icon-crafting-smaller + rotate: false + xy: 967, 36 + size: 30, 30 + orig: 30, 30 + offset: 0, 0 + index: -1 +icon-crafting-tiny + rotate: false + xy: 1909, 201 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +icon-cursor + rotate: false + xy: 451, 266 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +icon-cursor-small + rotate: false + xy: 1207, 278 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +icon-cursor-smaller + rotate: false + xy: 851, 4 + size: 30, 30 + orig: 30, 30 + offset: 0, 0 + index: -1 +icon-cursor-tiny + rotate: false + xy: 1837, 111 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +icon-database + rotate: false + xy: 501, 316 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +icon-database-small + rotate: false + xy: 1241, 312 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +icon-database-smaller + rotate: false + xy: 883, 4 + size: 30, 30 + orig: 30, 30 + offset: 0, 0 + index: -1 +icon-database-tiny + rotate: false + xy: 1855, 129 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +icon-defense + rotate: false + xy: 551, 366 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +icon-defense-small + rotate: false + xy: 1275, 346 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +icon-defense-smaller + rotate: false + xy: 915, 4 + size: 30, 30 + orig: 30, 30 + offset: 0, 0 + index: -1 +icon-defense-tiny + rotate: false + xy: 1873, 147 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +icon-dev-builds + rotate: false + xy: 601, 416 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +icon-dev-builds-small + rotate: false + xy: 1309, 380 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +icon-dev-builds-smaller + rotate: false + xy: 947, 4 + size: 30, 30 + orig: 30, 30 + offset: 0, 0 + index: -1 +icon-dev-builds-tiny + rotate: false + xy: 1891, 165 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +icon-diagonal + rotate: false + xy: 651, 466 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +icon-diagonal-small + rotate: false + xy: 1343, 414 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +icon-diagonal-smaller + rotate: false + xy: 979, 4 + size: 30, 30 + orig: 30, 30 + offset: 0, 0 + index: -1 +icon-diagonal-tiny + rotate: false + xy: 1909, 183 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +icon-discord + rotate: false + xy: 701, 516 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +icon-discord-small + rotate: false + xy: 1377, 448 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +icon-discord-smaller + rotate: false + xy: 1985, 663 + size: 30, 30 + orig: 30, 30 + offset: 0, 0 + index: -1 +icon-discord-tiny + rotate: false + xy: 1855, 111 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +icon-distribution + rotate: false + xy: 351, 116 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +icon-distribution-small + rotate: false + xy: 1411, 482 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +icon-distribution-smaller + rotate: false + xy: 2017, 663 + size: 30, 30 + orig: 30, 30 + offset: 0, 0 + index: -1 +icon-distribution-tiny + rotate: false + xy: 1873, 129 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +icon-donate + rotate: false + xy: 401, 166 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +icon-donate-small + rotate: false + xy: 1445, 516 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +icon-donate-smaller + rotate: false + xy: 1807, 586 + size: 30, 30 + orig: 30, 30 + offset: 0, 0 + index: -1 +icon-donate-tiny + rotate: false + xy: 1891, 147 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +icon-dots + rotate: false + xy: 451, 216 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +icon-dots-small + rotate: false + xy: 1479, 550 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +icon-dots-smaller + rotate: false + xy: 1811, 554 + size: 30, 30 + orig: 30, 30 + offset: 0, 0 + index: -1 +icon-dots-tiny + rotate: false + xy: 1909, 165 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +icon-editor + rotate: false + xy: 501, 266 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +icon-editor-small + rotate: false + xy: 1071, 108 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +icon-editor-smaller + rotate: false + xy: 1003, 76 + size: 30, 30 + orig: 30, 30 + offset: 0, 0 + index: -1 +icon-editor-tiny + rotate: false + xy: 1873, 111 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +icon-effect + rotate: false + xy: 551, 316 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +icon-effect-small + rotate: false + xy: 1105, 142 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +icon-effect-smaller + rotate: false + xy: 1035, 76 + size: 30, 30 + orig: 30, 30 + offset: 0, 0 + index: -1 +icon-effect-tiny + rotate: false + xy: 1891, 129 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +icon-elevation + rotate: false + xy: 601, 366 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +icon-elevation-small + rotate: false + xy: 1139, 176 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +icon-elevation-smaller + rotate: false + xy: 1067, 76 + size: 30, 30 + orig: 30, 30 + offset: 0, 0 + index: -1 +icon-elevation-tiny + rotate: false + xy: 1909, 147 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +icon-eraser + rotate: false + xy: 651, 416 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +icon-eraser-small + rotate: false + xy: 1173, 210 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +icon-eraser-smaller + rotate: false + xy: 1099, 76 + size: 30, 30 + orig: 30, 30 + offset: 0, 0 + index: -1 +icon-eraser-tiny + rotate: false + xy: 1891, 111 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +icon-exit + rotate: false + xy: 701, 466 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +icon-exit-small + rotate: false + xy: 1207, 244 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +icon-exit-smaller + rotate: false + xy: 1131, 76 + size: 30, 30 + orig: 30, 30 + offset: 0, 0 + index: -1 +icon-exit-tiny + rotate: false + xy: 1909, 129 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +icon-f-droid + rotate: false + xy: 351, 66 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +icon-f-droid-small + rotate: false + xy: 1241, 278 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +icon-f-droid-smaller + rotate: false + xy: 1163, 76 + size: 30, 30 + orig: 30, 30 + offset: 0, 0 + index: -1 +icon-f-droid-tiny + rotate: false + xy: 1909, 111 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +icon-fdroid + rotate: false + xy: 401, 116 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +icon-fdroid-small + rotate: false + xy: 1275, 312 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +icon-fdroid-smaller + rotate: false + xy: 1195, 76 + size: 30, 30 + orig: 30, 30 + offset: 0, 0 + index: -1 +icon-fdroid-tiny + rotate: false + xy: 1819, 93 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +icon-file + rotate: false + xy: 451, 166 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +icon-file-image + rotate: false + xy: 501, 216 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +icon-file-image-small + rotate: false + xy: 1309, 346 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +icon-file-image-smaller + rotate: false + xy: 1227, 76 + size: 30, 30 + orig: 30, 30 + offset: 0, 0 + index: -1 +icon-file-image-tiny + rotate: false + xy: 1837, 93 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +icon-file-small + rotate: false + xy: 1343, 380 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +icon-file-smaller + rotate: false + xy: 999, 44 + size: 30, 30 + orig: 30, 30 + offset: 0, 0 + index: -1 +icon-file-text + rotate: false + xy: 551, 266 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +icon-file-text-small + rotate: false + xy: 1377, 414 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +icon-file-text-smaller + rotate: false + xy: 1031, 44 + size: 30, 30 + orig: 30, 30 + offset: 0, 0 + index: -1 +icon-file-text-tiny + rotate: false + xy: 1855, 93 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +icon-file-tiny + rotate: false + xy: 1873, 93 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +icon-fill + rotate: false + xy: 601, 316 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +icon-fill-small + rotate: false + xy: 1411, 448 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +icon-fill-smaller + rotate: false + xy: 1063, 44 + size: 30, 30 + orig: 30, 30 + offset: 0, 0 + index: -1 +icon-fill-tiny + rotate: false + xy: 1891, 93 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +icon-flip + rotate: false + xy: 651, 366 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +icon-flip-small + rotate: false + xy: 1445, 482 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +icon-flip-smaller + rotate: false + xy: 1095, 44 + size: 30, 30 + orig: 30, 30 + offset: 0, 0 + index: -1 +icon-flip-tiny + rotate: false + xy: 1909, 93 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +icon-floppy + rotate: false + xy: 701, 416 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +icon-floppy-16 + rotate: false + xy: 401, 66 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +icon-floppy-16-small + rotate: false + xy: 1479, 516 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +icon-floppy-16-smaller + rotate: false + xy: 1127, 44 + size: 30, 30 + orig: 30, 30 + offset: 0, 0 + index: -1 +icon-floppy-16-tiny + rotate: false + xy: 1927, 305 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +icon-floppy-small + rotate: false + xy: 1513, 550 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +icon-floppy-smaller + rotate: false + xy: 1159, 44 + size: 30, 30 + orig: 30, 30 + offset: 0, 0 + index: -1 +icon-floppy-tiny + rotate: false + xy: 1927, 287 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +icon-folder + rotate: false + xy: 451, 116 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +icon-folder-parent + rotate: false + xy: 501, 166 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +icon-folder-parent-small + rotate: false + xy: 1105, 108 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +icon-folder-parent-smaller + rotate: false + xy: 1191, 44 + size: 30, 30 + orig: 30, 30 + offset: 0, 0 + index: -1 +icon-folder-parent-tiny + rotate: false + xy: 1927, 269 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +icon-folder-small + rotate: false + xy: 1139, 142 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +icon-folder-smaller + rotate: false + xy: 1223, 44 + size: 30, 30 + orig: 30, 30 + offset: 0, 0 + index: -1 +icon-folder-tiny + rotate: false + xy: 1927, 251 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +icon-github + rotate: false + xy: 551, 216 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +icon-github-small + rotate: false + xy: 1173, 176 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +icon-github-smaller + rotate: false + xy: 1011, 12 + size: 30, 30 + orig: 30, 30 + offset: 0, 0 + index: -1 +icon-github-tiny + rotate: false + xy: 1927, 233 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +icon-google-play + rotate: false + xy: 601, 266 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +icon-google-play-small + rotate: false + xy: 1207, 210 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +icon-google-play-smaller + rotate: false + xy: 1043, 12 + size: 30, 30 + orig: 30, 30 + offset: 0, 0 + index: -1 +icon-google-play-tiny + rotate: false + xy: 1927, 215 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +icon-grid + rotate: false + xy: 651, 316 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +icon-grid-small + rotate: false + xy: 1241, 244 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +icon-grid-smaller + rotate: false + xy: 1075, 12 + size: 30, 30 + orig: 30, 30 + offset: 0, 0 + index: -1 +icon-grid-tiny + rotate: false + xy: 1927, 197 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +icon-home + rotate: false + xy: 701, 366 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +icon-home-small + rotate: false + xy: 1275, 278 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +icon-home-smaller + rotate: false + xy: 1107, 12 + size: 30, 30 + orig: 30, 30 + offset: 0, 0 + index: -1 +icon-home-tiny + rotate: false + xy: 1927, 179 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +icon-host + rotate: false + xy: 451, 66 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +icon-host-small + rotate: false + xy: 1309, 312 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +icon-host-smaller + rotate: false + xy: 1139, 12 + size: 30, 30 + orig: 30, 30 + offset: 0, 0 + index: -1 +icon-host-tiny + rotate: false + xy: 1927, 161 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +icon-info + rotate: false + xy: 501, 116 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +icon-info-small + rotate: false + xy: 1343, 346 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +icon-info-smaller + rotate: false + xy: 1171, 12 + size: 30, 30 + orig: 30, 30 + offset: 0, 0 + index: -1 +icon-info-tiny + rotate: false + xy: 1927, 143 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +icon-itch.io + rotate: false + xy: 551, 166 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +icon-itch.io-small + rotate: false + xy: 1377, 380 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +icon-itch.io-smaller + rotate: false + xy: 1203, 12 + size: 30, 30 + orig: 30, 30 + offset: 0, 0 + index: -1 +icon-itch.io-tiny + rotate: false + xy: 1927, 125 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +icon-item + rotate: false + xy: 601, 216 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +icon-item-small + rotate: false + xy: 1411, 414 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +icon-item-smaller + rotate: false + xy: 1235, 12 + size: 30, 30 + orig: 30, 30 + offset: 0, 0 + index: -1 +icon-item-tiny + rotate: false + xy: 1927, 107 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +icon-line + rotate: false + xy: 651, 266 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +icon-line-small + rotate: false + xy: 1445, 448 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +icon-line-smaller + rotate: false + xy: 1259, 76 + size: 30, 30 + orig: 30, 30 + offset: 0, 0 + index: -1 +icon-line-tiny + rotate: false + xy: 1927, 89 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +icon-link + rotate: false + xy: 701, 316 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +icon-link-small + rotate: false + xy: 1479, 482 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +icon-link-smaller + rotate: false + xy: 1255, 44 + size: 30, 30 + orig: 30, 30 + offset: 0, 0 + index: -1 +icon-link-tiny + rotate: false + xy: 1603, 92 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +icon-liquid + rotate: false + xy: 501, 66 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +icon-liquid-consume + rotate: false + xy: 551, 116 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +icon-liquid-consume-small + rotate: false + xy: 1513, 516 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +icon-liquid-consume-smaller + rotate: false + xy: 1267, 12 + size: 30, 30 + orig: 30, 30 + offset: 0, 0 + index: -1 +icon-liquid-consume-tiny + rotate: false + xy: 1591, 74 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +icon-liquid-small + rotate: false + xy: 1547, 550 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +icon-liquid-smaller + rotate: false + xy: 1287, 44 + size: 30, 30 + orig: 30, 30 + offset: 0, 0 + index: -1 +icon-liquid-tiny + rotate: false + xy: 1609, 74 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +icon-load + rotate: false + xy: 601, 166 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +icon-load-image + rotate: false + xy: 651, 216 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +icon-load-image-small + rotate: false + xy: 1139, 108 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +icon-load-image-smaller + rotate: false + xy: 1299, 12 + size: 30, 30 + orig: 30, 30 + offset: 0, 0 + index: -1 +icon-load-image-tiny + rotate: false + xy: 1603, 56 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +icon-load-map + rotate: false + xy: 701, 266 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +icon-load-map-small + rotate: false + xy: 1173, 142 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +icon-load-map-smaller + rotate: false + xy: 1291, 78 + size: 30, 30 + orig: 30, 30 + offset: 0, 0 + index: -1 +icon-load-map-tiny + rotate: false + xy: 1603, 38 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +icon-load-small + rotate: false + xy: 1207, 176 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +icon-load-smaller + rotate: false + xy: 1307, 110 + size: 30, 30 + orig: 30, 30 + offset: 0, 0 + index: -1 +icon-load-tiny + rotate: false + xy: 1603, 20 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +icon-loading + rotate: false + xy: 551, 66 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +icon-loading-small + rotate: false + xy: 1241, 210 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +icon-loading-smaller + rotate: false + xy: 1323, 78 + size: 30, 30 + orig: 30, 30 + offset: 0, 0 + index: -1 +icon-loading-tiny + rotate: false + xy: 1945, 305 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +icon-locked + rotate: false + xy: 601, 116 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +icon-locked-small + rotate: false + xy: 1275, 244 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +icon-locked-smaller + rotate: false + xy: 1319, 46 + size: 30, 30 + orig: 30, 30 + offset: 0, 0 + index: -1 +icon-locked-tiny + rotate: false + xy: 1945, 287 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +icon-map + rotate: false + xy: 651, 166 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +icon-map-small + rotate: false + xy: 1309, 278 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +icon-map-smaller + rotate: false + xy: 1331, 14 + size: 30, 30 + orig: 30, 30 + offset: 0, 0 + index: -1 +icon-map-tiny + rotate: false + xy: 1945, 269 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +icon-menu + rotate: false + xy: 701, 216 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +icon-menu-large + rotate: false + xy: 601, 66 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +icon-menu-large-small + rotate: false + xy: 1343, 312 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +icon-menu-large-smaller + rotate: false + xy: 1351, 46 + size: 30, 30 + orig: 30, 30 + offset: 0, 0 + index: -1 +icon-menu-large-tiny + rotate: false + xy: 1945, 251 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +icon-menu-small + rotate: false + xy: 1377, 346 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +icon-menu-smaller + rotate: false + xy: 1363, 14 + size: 30, 30 + orig: 30, 30 + offset: 0, 0 + index: -1 +icon-menu-tiny + rotate: false + xy: 1945, 233 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +icon-missing + rotate: false + xy: 651, 116 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +icon-missing-small + rotate: false + xy: 1411, 380 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +icon-missing-smaller + rotate: false + xy: 1615, 420 + size: 30, 30 + orig: 30, 30 + offset: 0, 0 + index: -1 +icon-missing-tiny + rotate: false + xy: 1945, 215 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +icon-mode-attack + rotate: false + xy: 701, 166 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +icon-mode-attack-small + rotate: false + xy: 1445, 414 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +icon-mode-attack-smaller + rotate: false + xy: 1839, 615 + size: 30, 30 + orig: 30, 30 + offset: 0, 0 + index: -1 +icon-mode-attack-tiny + rotate: false + xy: 1945, 197 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +icon-mode-pvp + rotate: false + xy: 651, 66 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +icon-mode-pvp-small + rotate: false + xy: 1479, 448 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +icon-mode-pvp-smaller + rotate: false + xy: 1871, 615 + size: 30, 30 + orig: 30, 30 + offset: 0, 0 + index: -1 +icon-mode-pvp-tiny + rotate: false + xy: 1945, 179 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +icon-mode-survival + rotate: false + xy: 701, 116 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +icon-mode-survival-small + rotate: false + xy: 1513, 482 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +icon-mode-survival-smaller + rotate: false + xy: 1903, 615 + size: 30, 30 + orig: 30, 30 + offset: 0, 0 + index: -1 +icon-mode-survival-tiny + rotate: false + xy: 1945, 161 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +icon-none + rotate: false + xy: 701, 66 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +icon-none-small + rotate: false + xy: 1547, 516 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +icon-none-smaller + rotate: false + xy: 1935, 615 + size: 30, 30 + orig: 30, 30 + offset: 0, 0 + index: -1 +icon-none-tiny + rotate: false + xy: 1945, 143 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +icon-paste + rotate: false + xy: 351, 16 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +icon-paste-small + rotate: false + xy: 1581, 550 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +icon-paste-smaller + rotate: false + xy: 1967, 617 + size: 30, 30 + orig: 30, 30 + offset: 0, 0 + index: -1 +icon-paste-tiny + rotate: false + xy: 1945, 125 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +icon-pause + rotate: false + xy: 401, 16 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +icon-pause-small + rotate: false + xy: 1173, 108 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +icon-pause-smaller + rotate: false + xy: 1999, 631 + size: 30, 30 + orig: 30, 30 + offset: 0, 0 + index: -1 +icon-pause-tiny + rotate: false + xy: 1945, 107 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +icon-pencil + rotate: false + xy: 451, 16 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +icon-pencil-small + rotate: false + xy: 1207, 142 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +icon-pencil-smaller + rotate: false + xy: 1999, 599 + size: 30, 30 + orig: 30, 30 + offset: 0, 0 + index: -1 +icon-pencil-tiny + rotate: false + xy: 1945, 89 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +icon-pick + rotate: false + xy: 501, 16 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +icon-pick-small + rotate: false + xy: 1241, 176 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +icon-pick-smaller + rotate: false + xy: 1967, 585 + size: 30, 30 + orig: 30, 30 + offset: 0, 0 + index: -1 +icon-pick-tiny + rotate: false + xy: 1953, 323 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +icon-play + rotate: false + xy: 551, 16 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +icon-play-2 + rotate: false + xy: 601, 16 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +icon-play-2-small + rotate: false + xy: 1275, 210 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +icon-play-2-smaller + rotate: false + xy: 1999, 567 + size: 30, 30 + orig: 30, 30 + offset: 0, 0 + index: -1 +icon-play-2-tiny + rotate: false + xy: 1971, 323 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +icon-play-tiny + rotate: false + xy: 1971, 323 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +icon-play-custom + rotate: false + xy: 651, 16 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +icon-play-custom-small + rotate: false + xy: 1309, 244 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +icon-play-custom-smaller + rotate: false + xy: 1843, 583 + size: 30, 30 + orig: 30, 30 + offset: 0, 0 + index: -1 +icon-play-custom-tiny + rotate: false + xy: 1963, 305 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +icon-play-small + rotate: false + xy: 1343, 278 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +icon-play-smaller + rotate: false + xy: 1875, 583 + size: 30, 30 + orig: 30, 30 + offset: 0, 0 + index: -1 +icon-players + rotate: false + xy: 701, 16 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +icon-players-small + rotate: false + xy: 1377, 312 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +icon-players-smaller + rotate: false + xy: 1907, 583 + size: 30, 30 + orig: 30, 30 + offset: 0, 0 + index: -1 +icon-players-tiny + rotate: false + xy: 1989, 323 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +icon-power + rotate: false + xy: 751, 528 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +icon-power-small + rotate: false + xy: 1411, 346 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +icon-power-smaller + rotate: false + xy: 1843, 551 + size: 30, 30 + orig: 30, 30 + offset: 0, 0 + index: -1 +icon-power-tiny + rotate: false + xy: 1963, 287 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +icon-production + rotate: false + xy: 751, 478 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +icon-production-small + rotate: false + xy: 1445, 380 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +icon-production-smaller + rotate: false + xy: 1875, 551 + size: 30, 30 + orig: 30, 30 + offset: 0, 0 + index: -1 +icon-production-tiny + rotate: false + xy: 1981, 305 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +icon-quit + rotate: false + xy: 801, 528 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +icon-quit-small + rotate: false + xy: 1479, 414 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +icon-quit-smaller + rotate: false + xy: 1907, 551 + size: 30, 30 + orig: 30, 30 + offset: 0, 0 + index: -1 +icon-reddit + rotate: false + xy: 751, 428 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +icon-reddit-small + rotate: false + xy: 1513, 448 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +icon-reddit-smaller + rotate: false + xy: 1811, 522 + size: 30, 30 + orig: 30, 30 + offset: 0, 0 + index: -1 +icon-reddit-tiny + rotate: false + xy: 2007, 323 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +icon-redo + rotate: false + xy: 801, 478 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +icon-redo-small + rotate: false + xy: 1547, 482 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +icon-redo-smaller + rotate: false + xy: 1843, 519 + size: 30, 30 + orig: 30, 30 + offset: 0, 0 + index: -1 +icon-redo-tiny + rotate: false + xy: 1963, 269 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +icon-refresh + rotate: false + xy: 751, 378 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +icon-refresh-small + rotate: false + xy: 1581, 516 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +icon-refresh-smaller + rotate: false + xy: 1875, 519 + size: 30, 30 + orig: 30, 30 + offset: 0, 0 + index: -1 +icon-refresh-tiny + rotate: false + xy: 1981, 287 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +icon-rename + rotate: false + xy: 801, 428 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +icon-rename-small + rotate: false + xy: 1615, 550 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +icon-rename-smaller + rotate: false + xy: 1907, 519 + size: 30, 30 + orig: 30, 30 + offset: 0, 0 + index: -1 +icon-rename-tiny + rotate: false + xy: 1999, 305 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +icon-resize + rotate: false + xy: 751, 328 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +icon-resize-small + rotate: false + xy: 1207, 108 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +icon-resize-smaller + rotate: false + xy: 1939, 553 + size: 30, 30 + orig: 30, 30 + offset: 0, 0 + index: -1 +icon-resize-tiny + rotate: false + xy: 1963, 251 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +icon-rotate + rotate: false + xy: 801, 378 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +icon-rotate-arrow + rotate: false + xy: 751, 278 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +icon-rotate-arrow-small + rotate: false + xy: 1241, 142 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +icon-rotate-arrow-smaller + rotate: false + xy: 1939, 521 + size: 30, 30 + orig: 30, 30 + offset: 0, 0 + index: -1 +icon-rotate-arrow-tiny + rotate: false + xy: 1981, 269 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +icon-rotate-left + rotate: false + xy: 801, 328 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +icon-rotate-left-small + rotate: false + xy: 1275, 176 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +icon-rotate-left-smaller + rotate: false + xy: 1971, 535 + size: 30, 30 + orig: 30, 30 + offset: 0, 0 + index: -1 +icon-rotate-left-tiny + rotate: false + xy: 1999, 287 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +icon-rotate-right + rotate: false + xy: 751, 228 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +icon-rotate-right-small + rotate: false + xy: 1309, 210 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +icon-rotate-right-smaller + rotate: false + xy: 2003, 535 + size: 30, 30 + orig: 30, 30 + offset: 0, 0 + index: -1 +icon-rotate-right-tiny + rotate: false + xy: 1963, 233 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +icon-rotate-small + rotate: false + xy: 1343, 244 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +icon-rotate-smaller + rotate: false + xy: 1971, 503 + size: 30, 30 + orig: 30, 30 + offset: 0, 0 + index: -1 +icon-rotate-tiny + rotate: false + xy: 1981, 251 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +icon-save + rotate: false + xy: 801, 278 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +icon-save-image + rotate: false + xy: 751, 178 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +icon-save-image-small + rotate: false + xy: 1377, 278 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +icon-save-image-smaller + rotate: false + xy: 2003, 503 + size: 30, 30 + orig: 30, 30 + offset: 0, 0 + index: -1 +icon-save-image-tiny + rotate: false + xy: 1999, 269 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +icon-save-map + rotate: false + xy: 801, 228 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +icon-save-map-small + rotate: false + xy: 1411, 312 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +icon-save-map-smaller + rotate: false + xy: 1939, 489 + size: 30, 30 + orig: 30, 30 + offset: 0, 0 + index: -1 +icon-save-map-tiny + rotate: false + xy: 1963, 215 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +icon-save-small + rotate: false + xy: 1445, 346 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +icon-save-smaller + rotate: false + xy: 1971, 471 + size: 30, 30 + orig: 30, 30 + offset: 0, 0 + index: -1 +icon-save-tiny + rotate: false + xy: 1981, 233 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +icon-settings + rotate: false + xy: 751, 128 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +icon-settings-small + rotate: false + xy: 1479, 380 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +icon-settings-smaller + rotate: false + xy: 2003, 471 + size: 30, 30 + orig: 30, 30 + offset: 0, 0 + index: -1 +icon-settings-tiny + rotate: false + xy: 1999, 251 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +icon-spray + rotate: false + xy: 801, 178 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +icon-spray-small + rotate: false + xy: 1513, 414 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +icon-spray-smaller + rotate: false + xy: 1409, 212 + size: 30, 30 + orig: 30, 30 + offset: 0, 0 + index: -1 +icon-spray-tiny + rotate: false + xy: 1963, 197 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +icon-terrain + rotate: false + xy: 751, 78 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +icon-terrain-small + rotate: false + xy: 1547, 448 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +icon-terrain-smaller + rotate: false + xy: 1443, 246 + size: 30, 30 + orig: 30, 30 + offset: 0, 0 + index: -1 +icon-terrain-tiny + rotate: false + xy: 1981, 215 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +icon-tools + rotate: false + xy: 801, 128 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +icon-tools-small + rotate: false + xy: 1581, 482 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +icon-tools-smaller + rotate: false + xy: 1441, 214 + size: 30, 30 + orig: 30, 30 + offset: 0, 0 + index: -1 +icon-tools-tiny + rotate: false + xy: 1999, 233 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +icon-trash + rotate: false + xy: 751, 28 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +icon-trash-16 + rotate: false + xy: 801, 78 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +icon-trash-16-small + rotate: false + xy: 1615, 516 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +icon-trash-16-smaller + rotate: false + xy: 1477, 280 + size: 30, 30 + orig: 30, 30 + offset: 0, 0 + index: -1 +icon-trash-16-tiny + rotate: false + xy: 1963, 179 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +icon-trash-small + rotate: false + xy: 1649, 550 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +icon-trash-smaller + rotate: false + xy: 1475, 248 + size: 30, 30 + orig: 30, 30 + offset: 0, 0 + index: -1 +icon-trash-tiny + rotate: false + xy: 1981, 197 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +icon-tree + rotate: false + xy: 801, 28 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +icon-tree-small + rotate: false + xy: 1241, 108 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +icon-tree-smaller + rotate: false + xy: 1511, 314 + size: 30, 30 + orig: 30, 30 + offset: 0, 0 + index: -1 +icon-tree-tiny + rotate: false + xy: 1999, 215 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +icon-trello + rotate: false + xy: 851, 528 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +icon-trello-small + rotate: false + xy: 1275, 142 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +icon-trello-smaller + rotate: false + xy: 1509, 282 + size: 30, 30 + orig: 30, 30 + offset: 0, 0 + index: -1 +icon-trello-tiny + rotate: false + xy: 1963, 161 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +icon-turret + rotate: false + xy: 851, 478 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +icon-turret-small + rotate: false + xy: 1309, 176 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +icon-turret-smaller + rotate: false + xy: 1545, 348 + size: 30, 30 + orig: 30, 30 + offset: 0, 0 + index: -1 +icon-turret-tiny + rotate: false + xy: 1981, 179 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +icon-tutorial + rotate: false + xy: 851, 428 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +icon-tutorial-small + rotate: false + xy: 1343, 210 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +icon-tutorial-smaller + rotate: false + xy: 1543, 316 + size: 30, 30 + orig: 30, 30 + offset: 0, 0 + index: -1 +icon-tutorial-tiny + rotate: false + xy: 1999, 197 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +icon-undo + rotate: false + xy: 851, 378 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +icon-undo-small + rotate: false + xy: 1377, 244 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +icon-undo-smaller + rotate: false + xy: 1579, 382 + size: 30, 30 + orig: 30, 30 + offset: 0, 0 + index: -1 +icon-undo-tiny + rotate: false + xy: 1963, 143 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +icon-units + rotate: false + xy: 851, 328 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +icon-units-small + rotate: false + xy: 1411, 278 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +icon-units-smaller + rotate: false + xy: 1577, 350 + size: 30, 30 + orig: 30, 30 + offset: 0, 0 + index: -1 +icon-units-tiny + rotate: false + xy: 1981, 161 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +icon-unlocks + rotate: false + xy: 851, 278 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +icon-unlocks-small + rotate: false + xy: 1445, 312 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +icon-unlocks-smaller + rotate: false + xy: 1341, 144 + size: 30, 30 + orig: 30, 30 + offset: 0, 0 + index: -1 +icon-unlocks-tiny + rotate: false + xy: 1999, 179 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +icon-upgrade + rotate: false + xy: 851, 228 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +icon-upgrade-small + rotate: false + xy: 1479, 346 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +icon-upgrade-smaller + rotate: false + xy: 1339, 112 + size: 30, 30 + orig: 30, 30 + offset: 0, 0 + index: -1 +icon-upgrade-tiny + rotate: false + xy: 1963, 125 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +icon-wiki + rotate: false + xy: 851, 178 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +icon-wiki-small + rotate: false + xy: 1513, 380 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +icon-wiki-smaller + rotate: false + xy: 1355, 80 + size: 30, 30 + orig: 30, 30 + offset: 0, 0 + index: -1 +icon-wiki-tiny + rotate: false + xy: 1981, 143 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +icon-workshop + rotate: false + xy: 851, 128 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +icon-workshop-small + rotate: false + xy: 1547, 414 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +icon-workshop-smaller + rotate: false + xy: 1371, 112 + size: 30, 30 + orig: 30, 30 + offset: 0, 0 + index: -1 +icon-workshop-tiny + rotate: false + xy: 1999, 161 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +icon-zoom + rotate: false + xy: 851, 78 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +icon-zoom-small + rotate: false + xy: 1581, 448 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +icon-zoom-smaller + rotate: false + xy: 1387, 80 + size: 30, 30 + orig: 30, 30 + offset: 0, 0 + index: -1 +icon-zoom-tiny + rotate: false + xy: 1963, 107 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +info-banner + rotate: false + xy: 259, 869 + size: 84, 45 + orig: 84, 45 + offset: 0, 0 + index: -1 +inventory + rotate: false + xy: 1577, 168 + size: 24, 40 + split: 10, 10, 10, 14 + orig: 24, 40 + offset: 0, 0 + index: -1 +logo + rotate: false + xy: 1, 916 + size: 768, 107 + orig: 768, 107 + offset: 0, 0 + index: -1 +nomap + rotate: false + xy: 1, 658 + size: 256, 256 + orig: 256, 256 + offset: 0, 0 + index: -1 +pane + rotate: false + xy: 1649, 652 + size: 36, 27 + split: 12, 12, 12, 12 + orig: 36, 27 + offset: 0, 0 + index: -1 +pane-2 + rotate: false + xy: 1611, 652 + size: 36, 27 + split: 12, 12, 12, 12 + orig: 36, 27 + offset: 0, 0 + index: -1 +scroll + rotate: false + xy: 1783, 329 + size: 24, 35 + split: 10, 10, 6, 5 + orig: 24, 35 + offset: 0, 0 + index: -1 +scroll-horizontal + rotate: false + xy: 43, 2 + size: 35, 24 + split: 6, 5, 10, 10 + orig: 35, 24 + offset: 0, 0 + index: -1 +scroll-knob-horizontal-black + rotate: false + xy: 1, 2 + size: 40, 24 + orig: 40, 24 + offset: 0, 0 + index: -1 +scroll-knob-vertical-black + rotate: false + xy: 1577, 126 + size: 24, 40 + orig: 24, 40 + offset: 0, 0 + index: -1 +scroll-knob-vertical-thin + rotate: false + xy: 2035, 531 + size: 12, 40 + orig: 12, 40 + offset: 0, 0 + index: -1 +selection + rotate: false + xy: 1834, 493 + size: 1, 1 + orig: 1, 1 + offset: 0, 0 + index: -1 +slider + rotate: false + xy: 1678, 508 + size: 1, 8 + orig: 1, 8 + offset: 0, 0 + index: -1 +slider-knob + rotate: false + xy: 1647, 476 + size: 29, 38 + orig: 29, 38 + offset: 0, 0 + index: -1 +slider-knob-down + rotate: false + xy: 1647, 436 + size: 29, 38 + orig: 29, 38 + offset: 0, 0 + index: -1 +slider-knob-over + rotate: false + xy: 1647, 396 + size: 29, 38 + orig: 29, 38 + offset: 0, 0 + index: -1 +slider-vertical + rotate: false + xy: 309, 866 + size: 8, 1 + orig: 8, 1 + offset: 0, 0 + index: -1 +underline + rotate: false + xy: 1801, 652 + size: 36, 27 + split: 12, 12, 12, 12 + orig: 36, 27 + offset: 0, 0 + index: -1 +underline-2 + rotate: false + xy: 1687, 652 + size: 36, 27 + split: 12, 12, 12, 12 + orig: 36, 27 + offset: 0, 0 + index: -1 +underline-disabled + rotate: false + xy: 1725, 652 + size: 36, 27 + split: 12, 12, 12, 12 + orig: 36, 27 + offset: 0, 0 + index: -1 +underline-red + rotate: false + xy: 1763, 652 + size: 36, 27 + split: 12, 12, 12, 12 + orig: 36, 27 + offset: 0, 0 + index: -1 +whiteui + rotate: false + xy: 821, 928 + size: 3, 3 + orig: 3, 3 + offset: 0, 0 + index: -1 +window-empty + rotate: false + xy: 2019, 806 + size: 27, 61 + split: 4, 4, 2, 2 + orig: 27, 61 + offset: 0, 0 + index: -1 diff --git a/core/assets/sprites/sprites.png b/core/assets/sprites/sprites.png index 3953f9b778..da21708541 100644 Binary files a/core/assets/sprites/sprites.png and b/core/assets/sprites/sprites.png differ diff --git a/core/assets/sprites/sprites2.png b/core/assets/sprites/sprites2.png index a2f0c3ed64..1776b09b12 100644 Binary files a/core/assets/sprites/sprites2.png and b/core/assets/sprites/sprites2.png differ diff --git a/core/assets/sprites/sprites3.png b/core/assets/sprites/sprites3.png index d987c76119..41b7b27af0 100644 Binary files a/core/assets/sprites/sprites3.png and b/core/assets/sprites/sprites3.png differ diff --git a/core/assets/sprites/sprites4.png b/core/assets/sprites/sprites4.png index 190523262b..9c08c17bf7 100644 Binary files a/core/assets/sprites/sprites4.png and b/core/assets/sprites/sprites4.png differ diff --git a/core/assets/sprites/sprites5.png b/core/assets/sprites/sprites5.png index 3526fee659..8f762bfdb1 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 6abff04782..08363a67be 100644 --- a/core/src/io/anuke/mindustry/ClientLauncher.java +++ b/core/src/io/anuke/mindustry/ClientLauncher.java @@ -32,8 +32,8 @@ public abstract class ClientLauncher extends ApplicationCore implements Platform @Override public void setup(){ + Vars.loadLogger(); Vars.platform = this; - Log.setUseColors(false); beginTime = Time.millis(); Time.setDeltaProvider(() -> { @@ -70,8 +70,11 @@ public abstract class ClientLauncher extends ApplicationCore implements Platform Sounds.load(); assets.loadRun("contentcreate", Content.class, () -> { - content.createContent(); + content.createBaseContent(); content.loadColors(); + }, () -> { + mods.loadScripts(); + content.createModContent(); }); add(logic = new Logic()); @@ -193,7 +196,8 @@ 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("mod") ? "mods" : name.contains("msav") || name.contains("maps") ? "map" : name.contains("ogg") || name.contains("mp3") ? "sound" : name.contains("png") ? "image" : "system"; + String key = name.contains("script") ? "scripts" : 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 efae707bf8..8d9f04d045 100644 --- a/core/src/io/anuke/mindustry/Vars.java +++ b/core/src/io/anuke/mindustry/Vars.java @@ -15,6 +15,7 @@ import io.anuke.mindustry.entities.effect.*; import io.anuke.mindustry.entities.traits.*; 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.input.*; import io.anuke.mindustry.maps.*; @@ -25,14 +26,14 @@ import io.anuke.mindustry.world.blocks.defense.ForceProjector.*; import java.nio.charset.*; import java.util.*; -import static io.anuke.arc.Core.*; +import static io.anuke.arc.Core.settings; @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; + /** Whether the logger is loaded. */ + public static boolean loadedLogger = false; /** Maximum schematic size.*/ public static final int maxSchematicSize = 32; /** All schematic base64 starts with this string.*/ @@ -48,13 +49,15 @@ public class Vars implements Loadable{ /** URL for discord invite. */ 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"; + public static final String crashReportURL = "http://192.99.169.18/report"; /** URL the links to the wiki's modding guide.*/ public static final String modGuideURL = "https://mindustrygame.github.io/wiki/modding/"; + /** URL to the JSON file containing all the global, public servers. */ + public static final String serverJsonURL = "https://raw.githubusercontent.com/Anuken/Mindustry/master/servers.json"; /** 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"*/); + public static final Array defaultServers = Array.with(); /** maximum distance between mine and core that supports automatic transferring */ public static final float mineTransferRange = 220f; /** team of the player by default */ @@ -118,6 +121,8 @@ public class Vars implements Loadable{ public static boolean headless; /** whether steam is enabled for this game */ public static boolean steam; + /** whether typing into the console is enabled - developers only */ + public static boolean enableConsole = false; /** application data directory, equivalent to {@link io.anuke.arc.Settings#getDataDirectory()} */ public static FileHandle dataDirectory; /** data subdirectory used for screenshots */ @@ -268,6 +273,31 @@ public class Vars implements Loadable{ maps.load(); } + public static void loadLogger(){ + if(loadedLogger) return; + + String[] tags = {"[green][D][]", "[royal][I][]", "[yellow][W][]", "[scarlet][E][]", ""}; + String[] stags = {"&lc&fb[D]", "&lg&fb[I]", "&ly&fb[W]", "&lr&fb[E]", ""}; + + Array logBuffer = new Array<>(); + Log.setLogger((level, text, args) -> { + String result = Log.format(text, args); + System.out.println(Log.format(stags[level.ordinal()] + "&fr " + text, args)); + + result = tags[level.ordinal()] + " " + result; + + if(!headless && (ui == null || ui.scriptfrag == null)){ + logBuffer.add(result); + }else if(!headless){ + ui.scriptfrag.addMessage(result); + } + }); + + Events.on(ClientLoadEvent.class, e -> logBuffer.each(ui.scriptfrag::addMessage)); + + loadedLogger = true; + } + public static void loadSettings(){ Core.settings.setAppName(appName); @@ -275,7 +305,7 @@ public class Vars implements Loadable{ Core.settings.setDataDirectory(Core.files.local("saves/")); } - Core.settings.defaults("locale", "default"); + Core.settings.defaults("locale", "default", "blocksync", true); Core.keybinds.setDefaults(Binding.values()); Core.settings.load(); diff --git a/core/src/io/anuke/mindustry/content/Blocks.java b/core/src/io/anuke/mindustry/content/Blocks.java index 9add2d5e8c..10769bd53d 100644 --- a/core/src/io/anuke/mindustry/content/Blocks.java +++ b/core/src/io/anuke/mindustry/content/Blocks.java @@ -7,7 +7,7 @@ import io.anuke.arc.graphics.g2d.*; import io.anuke.arc.math.*; import io.anuke.arc.util.*; import io.anuke.mindustry.*; -import io.anuke.mindustry.ctype.ContentList; +import io.anuke.mindustry.ctype.*; import io.anuke.mindustry.entities.*; import io.anuke.mindustry.entities.bullet.*; import io.anuke.mindustry.entities.type.*; @@ -19,8 +19,7 @@ import io.anuke.mindustry.world.blocks.*; import io.anuke.mindustry.world.blocks.defense.*; import io.anuke.mindustry.world.blocks.defense.turrets.*; import io.anuke.mindustry.world.blocks.distribution.*; -import io.anuke.mindustry.world.blocks.liquid.Conduit; -import io.anuke.mindustry.world.blocks.liquid.LiquidTank; +import io.anuke.mindustry.world.blocks.liquid.*; import io.anuke.mindustry.world.blocks.logic.*; import io.anuke.mindustry.world.blocks.power.*; import io.anuke.mindustry.world.blocks.production.*; @@ -485,7 +484,7 @@ public class Blocks implements ContentList{ drawer = tile -> { Draw.rect(region, tile.drawx(), tile.drawy()); - GenericCrafterEntity entity = tile.entity(); + GenericCrafterEntity entity = tile.ent(); Draw.alpha(Mathf.absin(entity.totalProgress, 3f, 0.9f) * entity.warmup); Draw.rect(reg(topRegion), tile.drawx(), tile.drawy()); @@ -507,10 +506,10 @@ public class Blocks implements ContentList{ int bottomRegion = reg("-bottom"), weaveRegion = reg("-weave"); - drawIcons = () -> new TextureRegion[]{Core.atlas.find(name + "-bottom"), Core.atlas.find(name)}; + drawIcons = () -> new TextureRegion[]{Core.atlas.find(name + "-bottom"), Core.atlas.find(name), Core.atlas.find(name + "-weave")}; drawer = tile -> { - GenericCrafterEntity entity = tile.entity(); + GenericCrafterEntity entity = tile.ent(); Draw.rect(reg(bottomRegion), tile.drawx(), tile.drawy()); Draw.rect(reg(weaveRegion), tile.drawx(), tile.drawy(), entity.totalProgress); @@ -660,7 +659,7 @@ public class Blocks implements ContentList{ drawIcons = () -> new TextureRegion[]{Core.atlas.find(name), Core.atlas.find(name + "-top")}; drawer = tile -> { - GenericCrafterEntity entity = tile.entity(); + GenericCrafterEntity entity = tile.ent(); Draw.rect(region, tile.drawx(), tile.drawy()); Draw.rect(reg(frameRegions[(int)Mathf.absin(entity.totalProgress, 5f, 2.999f)]), tile.drawx(), tile.drawy()); @@ -687,7 +686,7 @@ public class Blocks implements ContentList{ drawIcons = () -> new TextureRegion[]{Core.atlas.find(name), Core.atlas.find(name + "-rotator")}; drawer = tile -> { - GenericCrafterEntity entity = tile.entity(); + GenericCrafterEntity entity = tile.ent(); Draw.rect(region, tile.drawx(), tile.drawy()); Draw.rect(reg(rotatorRegion), tile.drawx(), tile.drawy(), entity.totalProgress * 2f); @@ -915,6 +914,7 @@ public class Blocks implements ContentList{ phaseConveyor = new ItemBridge("phase-conveyor"){{ requirements(Category.distribution, ItemStack.with(Items.phasefabric, 5, Items.silicon, 7, Items.lead, 10, Items.graphite, 10)); range = 12; + canOverdrive = false; hasPower = true; consumes.power(0.30f); }}; @@ -977,7 +977,7 @@ public class Blocks implements ContentList{ size = 3; }}; - conduit = new io.anuke.mindustry.world.blocks.liquid.Conduit("conduit"){{ + conduit = new Conduit("conduit"){{ requirements(Category.liquid, ItemStack.with(Items.metaglass, 1)); health = 45; }}; @@ -989,14 +989,14 @@ public class Blocks implements ContentList{ health = 90; }}; - platedConduit = new io.anuke.mindustry.world.blocks.liquid.ArmoredConduit("plated-conduit"){{ - requirements(Category.liquid, ItemStack.with(Items.thorium, 2, Items.metaglass, 1)); + platedConduit = new ArmoredConduit("plated-conduit"){{ + requirements(Category.liquid, ItemStack.with(Items.thorium, 2, Items.metaglass, 1, Items.plastanium, 1)); liquidCapacity = 16f; liquidPressure = 1.025f; health = 220; }}; - liquidRouter = new io.anuke.mindustry.world.blocks.liquid.LiquidRouter("liquid-router"){{ + liquidRouter = new LiquidRouter("liquid-router"){{ requirements(Category.liquid, ItemStack.with(Items.graphite, 4, Items.metaglass, 2)); liquidCapacity = 20f; }}; @@ -1008,20 +1008,21 @@ public class Blocks implements ContentList{ health = 500; }}; - liquidJunction = new io.anuke.mindustry.world.blocks.liquid.LiquidJunction("liquid-junction"){{ + liquidJunction = new LiquidJunction("liquid-junction"){{ requirements(Category.liquid, ItemStack.with(Items.graphite, 2, Items.metaglass, 2)); }}; - bridgeConduit = new io.anuke.mindustry.world.blocks.liquid.LiquidExtendingBridge("bridge-conduit"){{ + bridgeConduit = new LiquidExtendingBridge("bridge-conduit"){{ requirements(Category.liquid, ItemStack.with(Items.graphite, 4, Items.metaglass, 8)); range = 4; hasPower = false; }}; - phaseConduit = new io.anuke.mindustry.world.blocks.liquid.LiquidBridge("phase-conduit"){{ + phaseConduit = new LiquidBridge("phase-conduit"){{ requirements(Category.liquid, ItemStack.with(Items.phasefabric, 5, Items.silicon, 7, Items.metaglass, 20, Items.titanium, 10)); range = 12; hasPower = true; + canOverdrive = false; consumes.power(0.30f); }}; @@ -1359,7 +1360,7 @@ public class Blocks implements ContentList{ ammo( Items.graphite, Bullets.artilleryDense, Items.silicon, Bullets.artilleryHoming, - Items.pyratite, Bullets.artlleryIncendiary + Items.pyratite, Bullets.artilleryIncendiary ); reload = 60f; recoil = 2f; @@ -1539,7 +1540,7 @@ public class Blocks implements ContentList{ ammo( Items.graphite, Bullets.artilleryDense, Items.silicon, Bullets.artilleryHoming, - Items.pyratite, Bullets.artlleryIncendiary, + Items.pyratite, Bullets.artilleryIncendiary, Items.blastCompound, Bullets.artilleryExplosive, Items.plastanium, Bullets.arilleryPlastic ); diff --git a/core/src/io/anuke/mindustry/content/Bullets.java b/core/src/io/anuke/mindustry/content/Bullets.java index 3071c59f49..75b6b763f3 100644 --- a/core/src/io/anuke/mindustry/content/Bullets.java +++ b/core/src/io/anuke/mindustry/content/Bullets.java @@ -18,7 +18,7 @@ public class Bullets implements ContentList{ public static BulletType //artillery - artilleryDense, arilleryPlastic, artilleryPlasticFrag, artilleryHoming, artlleryIncendiary, artilleryExplosive, artilleryUnit, + artilleryDense, arilleryPlastic, artilleryPlasticFrag, artilleryHoming, artilleryIncendiary, artilleryExplosive, artilleryUnit, //flak flakScrap, flakLead, flakPlastic, flakExplosive, flakSurge, flakGlass, glassFrag, @@ -91,7 +91,7 @@ public class Bullets implements ContentList{ homingRange = 50f; }}; - artlleryIncendiary = new ArtilleryBulletType(3f, 0, "shell"){{ + artilleryIncendiary = new ArtilleryBulletType(3f, 0, "shell"){{ hitEffect = Fx.blastExplosion; knockback = 0.8f; lifetime = 60f; diff --git a/core/src/io/anuke/mindustry/content/Fx.java b/core/src/io/anuke/mindustry/content/Fx.java index d7aeed4c65..4c31f0bd1a 100644 --- a/core/src/io/anuke/mindustry/content/Fx.java +++ b/core/src/io/anuke/mindustry/content/Fx.java @@ -48,28 +48,24 @@ public class Fx implements ContentList{ Draw.rect(unit.getIconRegion(), e.x, e.y, unit.getIconRegion().getWidth() * Draw.scl * scl, unit.getIconRegion().getWidth() * Draw.scl * scl, 180f); - Draw.reset(); }); commandSend = new Effect(28, e -> { Draw.color(Pal.command); Lines.stroke(e.fout() * 2f); Lines.circle(e.x, e.y, 4f + e.finpow() * 120f); - Draw.color(); }); placeBlock = new Effect(16, e -> { Draw.color(Pal.accent); Lines.stroke(3f - e.fin() * 2f); Lines.square(e.x, e.y, tilesize / 2f * e.rotation + e.fin() * 3f); - Draw.reset(); }); tapBlock = new Effect(12, e -> { Draw.color(Pal.accent); Lines.stroke(3f - e.fin() * 2f); Lines.circle(e.x, e.y, 4f + (tilesize / 1.5f * e.rotation) * e.fin()); - Draw.reset(); }); breakBlock = new Effect(12, e -> { @@ -80,41 +76,35 @@ public class Fx implements ContentList{ Angles.randLenVectors(e.id, 3 + (int)(e.rotation * 3), e.rotation * 2f + (tilesize * e.rotation) * e.finpow(), (x, y) -> { Fill.square(e.x + x, e.y + y, 1f + e.fout() * (3f + e.rotation)); }); - Draw.reset(); }); select = new Effect(23, e -> { Draw.color(Pal.accent); Lines.stroke(e.fout() * 3f); Lines.circle(e.x, e.y, 3f + e.fin() * 14f); - Draw.reset(); }); smoke = new Effect(100, e -> { Draw.color(Color.gray, Pal.darkishGray, e.fin()); float size = 7f - e.fin() * 7f; Draw.rect("circle", e.x, e.y, size, size); - Draw.reset(); }); magmasmoke = new Effect(110, e -> { Draw.color(Color.gray); Fill.circle(e.x, e.y, e.fslope() * 6f); - Draw.reset(); }); spawn = new Effect(30, e -> { Lines.stroke(2f * e.fout()); Draw.color(Pal.accent); Lines.poly(e.x, e.y, 4, 5f + e.fin() * 12f); - Draw.reset(); }); padlaunch = new Effect(10, e -> { Lines.stroke(4f * e.fout()); Draw.color(Pal.accent); Lines.poly(e.x, e.y, 4, 5f + e.fin() * 60f); - Draw.reset(); }); vtolHover = new Effect(40f, e -> { @@ -122,7 +112,6 @@ public class Fx implements ContentList{ float ang = e.rotation + Mathf.randomSeedRange(e.id, 30f); Draw.color(Pal.lightFlame, Pal.lightOrange, e.fin()); Fill.circle(e.x + Angles.trnsx(ang, len), e.y + Angles.trnsy(ang, len), 2f * e.fout()); - Draw.reset(); }); unitDrop = new GroundEffect(30, e -> { @@ -130,7 +119,6 @@ public class Fx implements ContentList{ Angles.randLenVectors(e.id, 9, 3 + 20f * e.finpow(), (x, y) -> { Fill.circle(e.x + x, e.y + y, e.fout() * 4f + 0.4f); }); - Draw.reset(); }); unitLand = new GroundEffect(30, e -> { @@ -138,42 +126,36 @@ public class Fx implements ContentList{ Angles.randLenVectors(e.id, 6, 17f * e.finpow(), (x, y) -> { Fill.circle(e.x + x, e.y + y, e.fout() * 4f + 0.3f); }); - Draw.reset(); }); unitPickup = new GroundEffect(18, e -> { Draw.color(Pal.lightishGray); Lines.stroke(e.fin() * 2f); Lines.poly(e.x, e.y, 4, 13f * e.fout()); - Draw.reset(); }); landShock = new GroundEffect(12, e -> { Draw.color(Pal.lancerLaser); Lines.stroke(e.fout() * 3f); Lines.poly(e.x, e.y, 12, 20f * e.fout()); - Draw.reset(); }); pickup = new Effect(18, e -> { Draw.color(Pal.lightishGray); Lines.stroke(e.fout() * 2f); Lines.spikes(e.x, e.y, 1f + e.fin() * 6f, e.fout() * 4f, 6); - Draw.reset(); }); healWave = new Effect(22, e -> { Draw.color(Pal.heal); Lines.stroke(e.fout() * 2f); Lines.circle(e.x, e.y, 4f + e.finpow() * 60f); - Draw.color(); }); heal = new Effect(11, e -> { Draw.color(Pal.heal); Lines.stroke(e.fout() * 2f); Lines.circle(e.x, e.y, 2f + e.finpow() * 7f); - Draw.color(); }); @@ -193,7 +175,6 @@ public class Fx implements ContentList{ Lines.lineAngle(e.x + x, e.y + y, ang, e.fout() * 3 + 1f); }); - Draw.reset(); }); hitFuse = new Effect(14, e -> { @@ -212,7 +193,6 @@ public class Fx implements ContentList{ Lines.lineAngle(e.x + x, e.y + y, ang, e.fout() * 3 + 1f); }); - Draw.reset(); }); hitBulletBig = new Effect(13, e -> { @@ -224,7 +204,6 @@ public class Fx implements ContentList{ Lines.lineAngle(e.x + x, e.y + y, ang, e.fout() * 4 + 1.5f); }); - Draw.reset(); }); hitFlameSmall = new Effect(14, e -> { @@ -236,7 +215,6 @@ public class Fx implements ContentList{ Lines.lineAngle(e.x + x, e.y + y, ang, e.fout() * 3 + 1f); }); - Draw.reset(); }); hitLiquid = new Effect(16, e -> { @@ -246,7 +224,6 @@ public class Fx implements ContentList{ Fill.circle(e.x + x, e.y + y, e.fout() * 2f); }); - Draw.reset(); }); hitLancer = new Effect(12, e -> { @@ -258,7 +235,6 @@ public class Fx implements ContentList{ Lines.lineAngle(e.x + x, e.y + y, ang, e.fout() * 4 + 1f); }); - Draw.reset(); }); hitMeltdown = new Effect(12, e -> { @@ -270,14 +246,12 @@ public class Fx implements ContentList{ Lines.lineAngle(e.x + x, e.y + y, ang, e.fout() * 4 + 1f); }); - Draw.reset(); }); hitLaser = new Effect(8, e -> { Draw.color(Color.white, Pal.heal, e.fin()); Lines.stroke(0.5f + e.fout()); Lines.circle(e.x, e.y, e.fin() * 5f); - Draw.reset(); }); despawn = new Effect(12, e -> { @@ -289,7 +263,6 @@ public class Fx implements ContentList{ Lines.lineAngle(e.x + x, e.y + y, ang, e.fout() * 2 + 1f); }); - Draw.reset(); }); flakExplosion = new Effect(20, e -> { @@ -313,7 +286,6 @@ public class Fx implements ContentList{ Lines.lineAngle(e.x + x, e.y + y, Mathf.angle(x, y), 1f + e.fout() * 3f); }); - Draw.reset(); }); plasticExplosion = new Effect(24, e -> { @@ -337,7 +309,6 @@ public class Fx implements ContentList{ Lines.lineAngle(e.x + x, e.y + y, Mathf.angle(x, y), 1f + e.fout() * 3f); }); - Draw.reset(); }); plasticExplosionFlak = new Effect(28, e -> { @@ -361,7 +332,6 @@ public class Fx implements ContentList{ Lines.lineAngle(e.x + x, e.y + y, Mathf.angle(x, y), 1f + e.fout() * 3f); }); - Draw.reset(); }); blastExplosion = new Effect(22, e -> { @@ -385,32 +355,27 @@ public class Fx implements ContentList{ Lines.lineAngle(e.x + x, e.y + y, Mathf.angle(x, y), 1f + e.fout() * 3f); }); - Draw.reset(); }); artilleryTrail = new Effect(50, e -> { Draw.color(e.color); Fill.circle(e.x, e.y, e.rotation * e.fout()); - Draw.reset(); }); incendTrail = new Effect(50, e -> { Draw.color(Pal.lightOrange); Fill.circle(e.x, e.y, e.rotation * e.fout()); - Draw.reset(); }); missileTrail = new Effect(50, e -> { Draw.color(e.color); Fill.circle(e.x, e.y, e.rotation * e.fout()); - Draw.reset(); }); absorb = new Effect(12, e -> { Draw.color(Pal.accent); Lines.stroke(2f * e.fout()); Lines.circle(e.x, e.y, 5f * e.fout()); - Draw.reset(); }); flakExplosionBig = new Effect(30, e -> { @@ -434,7 +399,6 @@ public class Fx implements ContentList{ Lines.lineAngle(e.x + x, e.y + y, Mathf.angle(x, y), 1f + e.fout() * 3f); }); - Draw.reset(); }); @@ -445,7 +409,6 @@ public class Fx implements ContentList{ Fill.circle(e.x + x, e.y + y, 0.1f + e.fout() * 1.4f); }); - Draw.color(); }); fire = new Effect(50f, e -> { @@ -467,7 +430,6 @@ public class Fx implements ContentList{ Fill.circle(e.x + x, e.y + y, 0.2f + e.fslope() * 1.5f); }); - Draw.color(); }); steam = new Effect(35f, e -> { @@ -477,7 +439,6 @@ public class Fx implements ContentList{ Fill.circle(e.x + x, e.y + y, 0.2f + e.fslope() * 1.5f); }); - Draw.color(); }); fireballsmoke = new Effect(25f, e -> { @@ -487,7 +448,6 @@ public class Fx implements ContentList{ Fill.circle(e.x + x, e.y + y, 0.2f + e.fout() * 1.5f); }); - Draw.color(); }); ballfire = new Effect(25f, e -> { @@ -497,7 +457,6 @@ public class Fx implements ContentList{ Fill.circle(e.x + x, e.y + y, 0.2f + e.fout() * 1.5f); }); - Draw.color(); }); freezing = new Effect(40f, e -> { @@ -507,7 +466,6 @@ public class Fx implements ContentList{ Fill.circle(e.x + x, e.y + y, e.fout() * 1.2f); }); - Draw.color(); }); melting = new Effect(40f, e -> { @@ -517,7 +475,6 @@ public class Fx implements ContentList{ Fill.circle(e.x + x, e.y + y, .2f + e.fout() * 1.2f); }); - Draw.color(); }); wet = new Effect(40f, e -> { @@ -527,7 +484,6 @@ public class Fx implements ContentList{ Fill.circle(e.x + x, e.y + y, e.fout() * 1f); }); - Draw.color(); }); oily = new Effect(42f, e -> { @@ -537,7 +493,6 @@ public class Fx implements ContentList{ Fill.circle(e.x + x, e.y + y, e.fout() * 1f); }); - Draw.color(); }); overdriven = new Effect(20f, e -> { @@ -547,7 +502,6 @@ public class Fx implements ContentList{ Fill.square(e.x + x, e.y + y, e.fout() * 2.3f + 0.5f); }); - Draw.color(); }); dropItem = new Effect(20f, e -> { @@ -562,35 +516,30 @@ public class Fx implements ContentList{ Draw.color(Color.white, Color.lightGray, e.fin()); Lines.stroke(e.fout() * 2f + 0.2f); Lines.circle(e.x, e.y, e.fin() * 28f); - Draw.reset(); }); bigShockwave = new Effect(10f, 80f, e -> { Draw.color(Color.white, Color.lightGray, e.fin()); Lines.stroke(e.fout() * 3f); Lines.circle(e.x, e.y, e.fin() * 50f); - Draw.reset(); }); nuclearShockwave = new Effect(10f, 200f, e -> { Draw.color(Color.white, Color.lightGray, e.fin()); Lines.stroke(e.fout() * 3f + 0.2f); Lines.circle(e.x, e.y, e.fin() * 140f); - Draw.reset(); }); impactShockwave = new Effect(13f, 300f, e -> { Draw.color(Pal.lighterOrange, Color.lightGray, e.fin()); Lines.stroke(e.fout() * 4f + 0.2f); Lines.circle(e.x, e.y, e.fin() * 200f); - Draw.reset(); }); spawnShockwave = new Effect(20f, 400f, e -> { Draw.color(Color.white, Color.lightGray, e.fin()); Lines.stroke(e.fout() * 3f + 0.5f); Lines.circle(e.x, e.y, e.fin() * (e.rotation + 50f)); - Draw.reset(); }); explosion = new Effect(30, e -> { @@ -613,7 +562,6 @@ public class Fx implements ContentList{ Lines.lineAngle(e.x + x, e.y + y, Mathf.angle(x, y), 1f + e.fout() * 3f); }); - Draw.reset(); }); dynamicExplosion = new Effect(30, e -> { @@ -638,7 +586,6 @@ public class Fx implements ContentList{ Lines.lineAngle(e.x + x, e.y + y, Mathf.angle(x, y), 1f + out * 4 * (3f + intensity)); }); - Draw.reset(); }); blockExplosion = new Effect(30, e -> { @@ -661,7 +608,6 @@ public class Fx implements ContentList{ Lines.lineAngle(e.x + x, e.y + y, Mathf.angle(x, y), 1f + e.fout() * 3f); }); - Draw.reset(); }); blockExplosionSmoke = new Effect(30, e -> { @@ -672,7 +618,6 @@ public class Fx implements ContentList{ Fill.circle(e.x + x / 2f, e.y + y / 2f, e.fout() * 1f); }); - Draw.reset(); }); @@ -681,7 +626,6 @@ public class Fx implements ContentList{ float w = 1f + 5 * e.fout(); Drawf.tri(e.x, e.y, w, 15f * e.fout(), e.rotation); Drawf.tri(e.x, e.y, w, 3f * e.fout(), e.rotation + 180f); - Draw.reset(); }); shootHeal = new Effect(8, e -> { @@ -689,7 +633,6 @@ public class Fx implements ContentList{ float w = 1f + 5 * e.fout(); Drawf.tri(e.x, e.y, w, 17f * e.fout(), e.rotation); Drawf.tri(e.x, e.y, w, 4f * e.fout(), e.rotation + 180f); - Draw.reset(); }); shootSmallSmoke = new Effect(20f, e -> { @@ -699,7 +642,6 @@ public class Fx implements ContentList{ Fill.circle(e.x + x, e.y + y, e.fout() * 1.5f); }); - Draw.reset(); }); shootBig = new Effect(9, e -> { @@ -707,7 +649,6 @@ public class Fx implements ContentList{ float w = 1.2f + 7 * e.fout(); Drawf.tri(e.x, e.y, w, 25f * e.fout(), e.rotation); Drawf.tri(e.x, e.y, w, 4f * e.fout(), e.rotation + 180f); - Draw.reset(); }); shootBig2 = new Effect(10, e -> { @@ -715,7 +656,6 @@ public class Fx implements ContentList{ float w = 1.2f + 8 * e.fout(); Drawf.tri(e.x, e.y, w, 29f * e.fout(), e.rotation); Drawf.tri(e.x, e.y, w, 5f * e.fout(), e.rotation + 180f); - Draw.reset(); }); shootBigSmoke = new Effect(17f, e -> { @@ -725,7 +665,6 @@ public class Fx implements ContentList{ Fill.circle(e.x + x, e.y + y, e.fout() * 2f + 0.2f); }); - Draw.reset(); }); shootBigSmoke2 = new Effect(18f, e -> { @@ -735,7 +674,6 @@ public class Fx implements ContentList{ Fill.circle(e.x + x, e.y + y, e.fout() * 2.4f + 0.2f); }); - Draw.reset(); }); shootSmallFlame = new Effect(32f, e -> { @@ -745,7 +683,6 @@ public class Fx implements ContentList{ Fill.circle(e.x + x, e.y + y, 0.65f + e.fout() * 1.5f); }); - Draw.reset(); }); shootPyraFlame = new Effect(33f, e -> { @@ -755,7 +692,6 @@ public class Fx implements ContentList{ Fill.circle(e.x + x, e.y + y, 0.65f + e.fout() * 1.6f); }); - Draw.reset(); }); shootLiquid = new Effect(40f, e -> { @@ -765,7 +701,6 @@ public class Fx implements ContentList{ Fill.circle(e.x + x, e.y + y, 0.5f + e.fout() * 2.5f); }); - Draw.reset(); }); shellEjectSmall = new GroundEffect(30f, 400f, e -> { @@ -780,7 +715,6 @@ public class Fx implements ContentList{ e.y + Angles.trnsy(lr, len) + Mathf.randomSeedRange(e.id + i + 8, 3f * e.fin()), 1f, 2f, rot + e.fin() * 50f * i); - Draw.color(); }); shellEjectMedium = new GroundEffect(34f, 400f, e -> { @@ -804,7 +738,6 @@ public class Fx implements ContentList{ }); } - Draw.color(); }); shellEjectBig = new GroundEffect(22f, 400f, e -> { @@ -829,7 +762,6 @@ public class Fx implements ContentList{ }); } - Draw.color(); }); lancerLaserShoot = new Effect(21f, e -> { @@ -839,7 +771,6 @@ public class Fx implements ContentList{ Drawf.tri(e.x, e.y, 4f * e.fout(), 29f, e.rotation + 90f * i); } - Draw.reset(); }); lancerLaserShootSmoke = new Effect(26f, e -> { @@ -849,7 +780,6 @@ public class Fx implements ContentList{ Lines.lineAngle(e.x + x, e.y + y, Mathf.angle(x, y), e.fout() * 9f); }); - Draw.reset(); }); lancerLaserCharge = new Effect(38f, e -> { @@ -859,7 +789,6 @@ public class Fx implements ContentList{ Lines.lineAngle(e.x + x, e.y + y, Mathf.angle(x, y), e.fslope() * 3f + 1f); }); - Draw.reset(); }); lancerLaserChargeBegin = new Effect(71f, e -> { @@ -877,7 +806,6 @@ public class Fx implements ContentList{ Drawf.tri(e.x + x, e.y + y, e.fslope() * 3f + 1, e.fslope() * 3f + 1, Mathf.angle(x, y)); }); - Draw.reset(); }); lightningShoot = new Effect(12f, e -> { @@ -888,7 +816,6 @@ public class Fx implements ContentList{ Lines.lineAngle(e.x + x, e.y + y, Mathf.angle(x, y), e.fin() * 5f + 2f); }); - Draw.reset(); }); @@ -897,7 +824,6 @@ public class Fx implements ContentList{ float size = 1f + e.fout() * 5f; Draw.color(Color.lightGray, Color.gray, e.fin()); Draw.rect("circle", e.x + x, e.y + y, size, size); - Draw.reset(); }); }); nuclearsmoke = new Effect(40, e -> { @@ -905,7 +831,6 @@ public class Fx implements ContentList{ float size = e.fslope() * 4f; Draw.color(Color.lightGray, Color.gray, e.fin()); Draw.rect("circle", e.x + x, e.y + y, size, size); - Draw.reset(); }); }); nuclearcloud = new Effect(90, 200f, e -> { @@ -913,7 +838,6 @@ public class Fx implements ContentList{ float size = e.fout() * 14f; Draw.color(Color.lime, Color.gray, e.fin()); Draw.rect("circle", e.x + x, e.y + y, size, size); - Draw.reset(); }); }); impactsmoke = new Effect(60, e -> { @@ -921,7 +845,6 @@ public class Fx implements ContentList{ float size = e.fslope() * 4f; Draw.color(Color.lightGray, Color.gray, e.fin()); Draw.rect("circle", e.x + x, e.y + y, size, size); - Draw.reset(); }); }); impactcloud = new Effect(140, 400f, e -> { @@ -929,7 +852,6 @@ public class Fx implements ContentList{ float size = e.fout() * 15f; Draw.color(Pal.lighterOrange, Color.lightGray, e.fin()); Draw.rect("circle", e.x + x, e.y + y, size, size); - Draw.reset(); }); }); redgeneratespark = new Effect(18, e -> { @@ -937,7 +859,6 @@ public class Fx implements ContentList{ float len = e.fout() * 4f; Draw.color(Pal.redSpark, Color.gray, e.fin()); Draw.rect("circle", e.x + x, e.y + y, len, len); - Draw.reset(); }); }); generatespark = new Effect(18, e -> { @@ -945,7 +866,6 @@ public class Fx implements ContentList{ float len = e.fout() * 4f; Draw.color(Pal.orangeSpark, Color.gray, e.fin()); Draw.rect("circle", e.x + x, e.y + y, len, len); - Draw.reset(); }); }); fuelburn = new Effect(23, e -> { @@ -953,70 +873,60 @@ public class Fx implements ContentList{ float len = e.fout() * 4f; Draw.color(Color.lightGray, Color.gray, e.fin()); Draw.rect("circle", e.x + x, e.y + y, len, len); - Draw.reset(); }); }); plasticburn = new Effect(40, e -> { Angles.randLenVectors(e.id, 5, 3f + e.fin() * 5f, (x, y) -> { Draw.color(Color.valueOf("e9ead3"), Color.gray, e.fin()); Fill.circle(e.x + x, e.y + y, e.fout() * 1f); - Draw.reset(); }); }); pulverize = new Effect(40, e -> { Angles.randLenVectors(e.id, 5, 3f + e.fin() * 8f, (x, y) -> { Draw.color(Pal.stoneGray); Fill.square(e.x + x, e.y + y, e.fout() * 2f + 0.5f, 45); - Draw.reset(); }); }); pulverizeRed = new Effect(40, e -> { Angles.randLenVectors(e.id, 5, 3f + e.fin() * 8f, (x, y) -> { Draw.color(Pal.redDust, Pal.stoneGray, e.fin()); Fill.square(e.x + x, e.y + y, e.fout() * 2f + 0.5f, 45); - Draw.reset(); }); }); pulverizeRedder = new Effect(40, e -> { Angles.randLenVectors(e.id, 5, 3f + e.fin() * 9f, (x, y) -> { Draw.color(Pal.redderDust, Pal.stoneGray, e.fin()); Fill.square(e.x + x, e.y + y, e.fout() * 2.5f + 0.5f, 45); - Draw.reset(); }); }); pulverizeSmall = new Effect(30, e -> { Angles.randLenVectors(e.id, 3, e.fin() * 5f, (x, y) -> { Draw.color(Pal.stoneGray); Fill.square(e.x + x, e.y + y, e.fout() * 1f + 0.5f, 45); - Draw.reset(); }); }); pulverizeMedium = new Effect(30, e -> { Angles.randLenVectors(e.id, 5, 3f + e.fin() * 8f, (x, y) -> { Draw.color(Pal.stoneGray); Fill.square(e.x + x, e.y + y, e.fout() * 1f + 0.5f, 45); - Draw.reset(); }); }); producesmoke = new Effect(12, e -> { Angles.randLenVectors(e.id, 8, 4f + e.fin() * 18f, (x, y) -> { Draw.color(Color.white, Pal.accent, e.fin()); Fill.square(e.x + x, e.y + y, 1f + e.fout() * 3f, 45); - Draw.reset(); }); }); smeltsmoke = new Effect(15, e -> { Angles.randLenVectors(e.id, 6, 4f + e.fin() * 5f, (x, y) -> { Draw.color(Color.white, e.color, e.fin()); Fill.square(e.x + x, e.y + y, 0.5f + e.fout() * 2f, 45); - Draw.reset(); }); }); formsmoke = new Effect(40, e -> { Angles.randLenVectors(e.id, 6, 5f + e.fin() * 8f, (x, y) -> { Draw.color(Pal.plasticSmoke, Color.lightGray, e.fin()); Fill.square(e.x + x, e.y + y, 0.2f + e.fout() * 2f, 45); - Draw.reset(); }); }); blastsmoke = new Effect(26, e -> { @@ -1024,7 +934,6 @@ public class Fx implements ContentList{ float size = 2f + e.fout() * 6f; Draw.color(Color.lightGray, Color.darkGray, e.fin()); Draw.rect("circle", e.x + x, e.y + y, size, size); - Draw.reset(); }); }); lava = new Effect(18, e -> { @@ -1032,79 +941,66 @@ public class Fx implements ContentList{ float size = e.fslope() * 4f; Draw.color(Color.orange, Color.gray, e.fin()); Draw.rect("circle", e.x + x, e.y + y, size, size); - Draw.reset(); }); }); dooropen = new Effect(10, e -> { Lines.stroke(e.fout() * 1.6f); Lines.square(e.x, e.y, tilesize / 2f + e.fin() * 2f); - Draw.reset(); }); doorclose = new Effect(10, e -> { Lines.stroke(e.fout() * 1.6f); Lines.square(e.x, e.y, tilesize / 2f + e.fout() * 2f); - Draw.reset(); }); dooropenlarge = new Effect(10, e -> { Lines.stroke(e.fout() * 1.6f); Lines.square(e.x, e.y, tilesize + e.fin() * 2f); - Draw.reset(); }); doorcloselarge = new Effect(10, e -> { Lines.stroke(e.fout() * 1.6f); Lines.square(e.x, e.y, tilesize + e.fout() * 2f); - Draw.reset(); }); purify = new Effect(10, e -> { Draw.color(Color.royal, Color.gray, e.fin()); Lines.stroke(2f); Lines.spikes(e.x, e.y, e.fin() * 4f, 2, 6); - Draw.reset(); }); purifyoil = new Effect(10, e -> { Draw.color(Color.black, Color.gray, e.fin()); Lines.stroke(2f); Lines.spikes(e.x, e.y, e.fin() * 4f, 2, 6); - Draw.reset(); }); purifystone = new Effect(10, e -> { Draw.color(Color.orange, Color.gray, e.fin()); Lines.stroke(2f); Lines.spikes(e.x, e.y, e.fin() * 4f, 2, 6); - Draw.reset(); }); generate = new Effect(11, e -> { Draw.color(Color.orange, Color.yellow, e.fin()); Lines.stroke(1f); Lines.spikes(e.x, e.y, e.fin() * 5f, 2, 8); - Draw.reset(); }); mine = new Effect(20, e -> { Angles.randLenVectors(e.id, 6, 3f + e.fin() * 6f, (x, y) -> { Draw.color(e.color, Color.lightGray, e.fin()); Fill.square(e.x + x, e.y + y, e.fout() * 2f, 45); - Draw.reset(); }); }); mineBig = new Effect(30, e -> { Angles.randLenVectors(e.id, 6, 4f + e.fin() * 8f, (x, y) -> { Draw.color(e.color, Color.lightGray, e.fin()); Fill.square(e.x + x, e.y + y, e.fout() * 2f + 0.2f, 45); - Draw.reset(); }); }); mineHuge = new Effect(40, e -> { Angles.randLenVectors(e.id, 8, 5f + e.fin() * 10f, (x, y) -> { Draw.color(e.color, Color.lightGray, e.fin()); Fill.square(e.x + x, e.y + y, e.fout() * 2f + 0.5f, 45); - Draw.reset(); }); }); smelt = new Effect(20, e -> { Angles.randLenVectors(e.id, 6, 2f + e.fin() * 5f, (x, y) -> { Draw.color(Color.white, e.color, e.fin()); Fill.square(e.x + x, e.y + y, 0.5f + e.fout() * 2f, 45); - Draw.reset(); }); }); teleportActivate = new Effect(50, e -> { @@ -1121,7 +1017,6 @@ public class Fx implements ContentList{ Lines.lineAngle(e.x + x, e.y + y, Mathf.angle(x, y), e.fin() * 4f + 1f); }); - Draw.reset(); }); teleport = new Effect(60, e -> { Draw.color(e.color); @@ -1132,7 +1027,6 @@ public class Fx implements ContentList{ Lines.lineAngle(e.x + x, e.y + y, Mathf.angle(x, y), e.fin() * 4f + 1f); }); - Draw.reset(); }); teleportOut = new Effect(20, e -> { Draw.color(e.color); @@ -1143,13 +1037,11 @@ public class Fx implements ContentList{ Lines.lineAngle(e.x + x, e.y + y, Mathf.angle(x, y), e.fslope() * 4f + 1f); }); - Draw.reset(); }); ripple = new GroundEffect(false, 30, e -> { Draw.color(Tmp.c1.set(e.color).mul(1.2f)); Lines.stroke(e.fout() + 0.4f); Lines.circle(e.x, e.y, 2f + e.fin() * 4f); - Draw.reset(); }); bubble = new Effect(20, e -> { @@ -1158,56 +1050,47 @@ public class Fx implements ContentList{ Angles.randLenVectors(e.id, 2, 8f, (x, y) -> { Lines.circle(e.x + x, e.y + y, 1f + e.fin() * 3f); }); - Draw.reset(); }); launch = new Effect(28, e -> { Draw.color(Pal.command); Lines.stroke(e.fout() * 2f); Lines.circle(e.x, e.y, 4f + e.finpow() * 120f); - Draw.color(); }); healWaveMend = new Effect(40, e -> { Draw.color(e.color); Lines.stroke(e.fout() * 2f); Lines.circle(e.x, e.y, e.finpow() * e.rotation); - Draw.color(); }); overdriveWave = new Effect(50, e -> { Draw.color(e.color); Lines.stroke(e.fout() * 1f); Lines.circle(e.x, e.y, e.finpow() * e.rotation); - Draw.color(); }); healBlock = new Effect(20, e -> { Draw.color(Pal.heal); Lines.stroke(2f * e.fout() + 0.5f); Lines.square(e.x, e.y, 1f + (e.fin() * e.rotation * tilesize / 2f - 1f)); - Draw.color(); }); healBlockFull = new Effect(20, e -> { Draw.color(e.color); Draw.alpha(e.fout()); - Fill.square(e.x, e.y, e.rotation * tilesize / 2f); - Draw.color(); }); overdriveBlockFull = new Effect(60, e -> { Draw.color(e.color); Draw.alpha(e.fslope() * 0.4f); Fill.square(e.x, e.y, e.rotation * tilesize); - Draw.color(); }); shieldBreak = new Effect(40, e -> { Draw.color(Pal.accent); Lines.stroke(3f * e.fout()); Lines.poly(e.x, e.y, 6, e.rotation + e.fin(), 90); - Draw.reset(); }); coreLand = new Effect(120f, e -> { diff --git a/core/src/io/anuke/mindustry/content/StatusEffects.java b/core/src/io/anuke/mindustry/content/StatusEffects.java index c4342ec82c..4dc980869d 100644 --- a/core/src/io/anuke/mindustry/content/StatusEffects.java +++ b/core/src/io/anuke/mindustry/content/StatusEffects.java @@ -15,61 +15,71 @@ public class StatusEffects implements ContentList{ @Override public void load(){ - none = new StatusEffect(); + none = new StatusEffect("none"); - burning = new StatusEffect(){{ + burning = new StatusEffect("burning"){{ damage = 0.06f; effect = Fx.burning; - opposite(() -> wet, () -> freezing); - trans(() -> tarred, ((unit, time, newTime, result) -> { - unit.damage(1f); - Effects.effect(Fx.burning, unit.x + Mathf.range(unit.getSize() / 2f), unit.y + Mathf.range(unit.getSize() / 2f)); - result.set(this, Math.min(time + newTime, 300f)); - })); + init(() -> { + opposite(wet,freezing); + trans(tarred, ((unit, time, newTime, result) -> { + unit.damage(1f); + Effects.effect(Fx.burning, unit.x + Mathf.range(unit.getSize() / 2f), unit.y + Mathf.range(unit.getSize() / 2f)); + result.set(this, Math.min(time + newTime, 300f)); + })); + }); }}; - freezing = new StatusEffect(){{ + freezing = new StatusEffect("freezing"){{ speedMultiplier = 0.6f; armorMultiplier = 0.8f; effect = Fx.freezing; - opposite(() -> melting, () -> burning); + init(() -> { + opposite(melting, burning); + }); }}; - wet = new StatusEffect(){{ + wet = new StatusEffect("wet"){{ speedMultiplier = 0.9f; effect = Fx.wet; - trans(() -> shocked, ((unit, time, newTime, result) -> { - unit.damage(20f); - if(unit.getTeam() == waveTeam){ - Events.fire(Trigger.shock); - } - result.set(this, time); - })); - opposite(() -> burning); + init(() -> { + trans(shocked, ((unit, time, newTime, result) -> { + unit.damage(20f); + if(unit.getTeam() == waveTeam){ + Events.fire(Trigger.shock); + } + result.set(this, time); + })); + opposite(burning); + }); }}; - melting = new StatusEffect(){{ + melting = new StatusEffect("melting"){{ speedMultiplier = 0.8f; armorMultiplier = 0.8f; damage = 0.3f; effect = Fx.melting; - trans(() -> tarred, ((unit, time, newTime, result) -> result.set(this, Math.min(time + newTime / 2f, 140f)))); - opposite(() -> wet, () -> freezing); + init(() -> { + trans(tarred, ((unit, time, newTime, result) -> result.set(this, Math.min(time + newTime / 2f, 140f)))); + opposite(wet, freezing); + }); }}; - tarred = new StatusEffect(){{ + tarred = new StatusEffect("tarred"){{ speedMultiplier = 0.6f; effect = Fx.oily; - trans(() -> melting, ((unit, time, newTime, result) -> result.set(burning, newTime + time))); - trans(() -> burning, ((unit, time, newTime, result) -> result.set(burning, newTime + time))); + init(() -> { + trans(melting, ((unit, time, newTime, result) -> result.set(burning, newTime + time))); + trans(burning, ((unit, time, newTime, result) -> result.set(burning, newTime + time))); + }); }}; - overdrive = new StatusEffect(){{ + overdrive = new StatusEffect("overdrive"){{ armorMultiplier = 0.95f; speedMultiplier = 1.15f; damageMultiplier = 1.4f; @@ -77,20 +87,20 @@ public class StatusEffects implements ContentList{ effect = Fx.overdriven; }}; - shielded = new StatusEffect(){{ + shielded = new StatusEffect("shielded"){{ armorMultiplier = 3f; }}; - boss = new StatusEffect(){{ + boss = new StatusEffect("boss"){{ armorMultiplier = 3f; damageMultiplier = 3f; speedMultiplier = 1.1f; }}; - shocked = new StatusEffect(); + shocked = new StatusEffect("shocked"); //no effects, just small amounts of damage. - corroded = new StatusEffect(){{ + corroded = new StatusEffect("corroded"){{ damage = 0.1f; }}; } diff --git a/core/src/io/anuke/mindustry/content/UnitTypes.java b/core/src/io/anuke/mindustry/content/UnitTypes.java index 35eb9890bd..d6e1dd232a 100644 --- a/core/src/io/anuke/mindustry/content/UnitTypes.java +++ b/core/src/io/anuke/mindustry/content/UnitTypes.java @@ -17,7 +17,7 @@ public class UnitTypes implements ContentList{ @Override public void load(){ - draug = new UnitType("draug", Draug::new){{ + draug = new UnitType("draug", MinerDrone::new){{ flying = true; drag = 0.01f; speed = 0.3f; @@ -32,7 +32,7 @@ public class UnitTypes implements ContentList{ }}; }}; - spirit = new UnitType("spirit", Spirit::new){{ + spirit = new UnitType("spirit", RepairDrone::new){{ flying = true; drag = 0.01f; speed = 0.42f; @@ -53,7 +53,7 @@ public class UnitTypes implements ContentList{ }}; }}; - phantom = new UnitType("phantom", Phantom::new){{ + phantom = new UnitType("phantom", BuilderDrone::new){{ flying = true; drag = 0.01f; mass = 2f; @@ -76,7 +76,7 @@ public class UnitTypes implements ContentList{ }}; }}; - dagger = new UnitType("dagger", Dagger::new){{ + dagger = new UnitType("dagger", GroundUnit::new){{ maxVelocity = 1.1f; speed = 0.2f; drag = 0.4f; @@ -92,7 +92,7 @@ public class UnitTypes implements ContentList{ }}; }}; - crawler = new UnitType("crawler", Crawler::new){{ + crawler = new UnitType("crawler", GroundUnit::new){{ maxVelocity = 1.27f; speed = 0.285f; drag = 0.4f; @@ -123,7 +123,7 @@ public class UnitTypes implements ContentList{ }}; }}; - titan = new UnitType("titan", Titan::new){{ + titan = new UnitType("titan", GroundUnit::new){{ maxVelocity = 0.8f; speed = 0.22f; drag = 0.4f; @@ -145,7 +145,7 @@ public class UnitTypes implements ContentList{ }}; }}; - fortress = new UnitType("fortress", Fortress::new){{ + fortress = new UnitType("fortress", GroundUnit::new){{ maxVelocity = 0.78f; speed = 0.15f; drag = 0.4f; @@ -167,7 +167,7 @@ public class UnitTypes implements ContentList{ }}; }}; - eruptor = new UnitType("eruptor", Eruptor::new){{ + eruptor = new UnitType("eruptor", GroundUnit::new){{ maxVelocity = 0.81f; speed = 0.16f; drag = 0.4f; @@ -189,7 +189,7 @@ public class UnitTypes implements ContentList{ }}; }}; - chaosArray = new UnitType("chaos-array", Dagger::new){{ + chaosArray = new UnitType("chaos-array", GroundUnit::new){{ maxVelocity = 0.68f; speed = 0.12f; drag = 0.4f; @@ -213,7 +213,7 @@ public class UnitTypes implements ContentList{ }}; }}; - eradicator = new UnitType("eradicator", Dagger::new){{ + eradicator = new UnitType("eradicator", GroundUnit::new){{ maxVelocity = 0.68f; speed = 0.12f; drag = 0.4f; @@ -238,7 +238,7 @@ public class UnitTypes implements ContentList{ }}; }}; - wraith = new UnitType("wraith", Wraith::new){{ + wraith = new UnitType("wraith", FlyingUnit::new){{ speed = 0.3f; maxVelocity = 1.9f; drag = 0.01f; @@ -257,7 +257,7 @@ public class UnitTypes implements ContentList{ }}; }}; - ghoul = new UnitType("ghoul", Ghoul::new){{ + ghoul = new UnitType("ghoul", FlyingUnit::new){{ health = 220; speed = 0.2f; maxVelocity = 1.4f; @@ -281,7 +281,7 @@ public class UnitTypes implements ContentList{ }}; }}; - revenant = new UnitType("revenant", Revenant::new){{ + revenant = new UnitType("revenant", HoverUnit::new){{ health = 1000; mass = 5f; hitsize = 20f; @@ -312,7 +312,7 @@ public class UnitTypes implements ContentList{ }}; }}; - lich = new UnitType("lich", Revenant::new){{ + lich = new UnitType("lich", HoverUnit::new){{ health = 6000; mass = 20f; hitsize = 40f; @@ -345,7 +345,7 @@ public class UnitTypes implements ContentList{ }}; }}; - reaper = new UnitType("reaper", Revenant::new){{ + reaper = new UnitType("reaper", HoverUnit::new){{ health = 11000; mass = 30f; hitsize = 56f; diff --git a/core/src/io/anuke/mindustry/core/ContentLoader.java b/core/src/io/anuke/mindustry/core/ContentLoader.java index bc4d0dac81..a744b032e1 100644 --- a/core/src/io/anuke/mindustry/core/ContentLoader.java +++ b/core/src/io/anuke/mindustry/core/ContentLoader.java @@ -3,6 +3,7 @@ package io.anuke.mindustry.core; import io.anuke.arc.collection.*; import io.anuke.arc.func.*; import io.anuke.arc.graphics.*; +import io.anuke.arc.util.ArcAnnotate.*; import io.anuke.arc.util.*; import io.anuke.mindustry.content.*; import io.anuke.mindustry.ctype.*; @@ -20,10 +21,10 @@ import static io.anuke.mindustry.Vars.mods; */ @SuppressWarnings("unchecked") public class ContentLoader{ - private boolean loaded = false; private ObjectMap[] contentNameMap = new ObjectMap[ContentType.values().length]; private Array[] contentMap = new Array[ContentType.values().length]; private MappableContent[][] temporaryMapper; + private @Nullable LoadedMod currentMod; private ObjectSet> initialization = new ObjectSet<>(); private ContentList[] content = { new Fx(), @@ -43,35 +44,40 @@ public class ContentLoader{ new LegacyColorMapper(), }; + public ContentLoader(){ + clear(); + } + /** 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){ - Log.info("Content already loaded, skipping."); - return; - } for(ContentType type : ContentType.values()){ contentMap[type.ordinal()] = new Array<>(); contentNameMap[type.ordinal()] = new ObjectMap<>(); } + } + + /** Creates all base types. */ + public void createBaseContent(){ for(ContentList list : content){ list.load(); } + } + /** Creates mod content, if applicable. */ + public void createModContent(){ if(mods != null){ mods.loadContent(); } + } - //check up ID mapping, make sure it's linear + /** Logs content statistics.*/ + public void logContent(){ + //check up ID mapping, make sure it's linear (debug only) for(Array arr : contentMap){ for(int i = 0; i < arr.size; i++){ int id = arr.get(i).id; @@ -81,17 +87,12 @@ public class ContentLoader{ } } - loaded = true; - } - - /** Logs content statistics.*/ - public void logContent(){ - Log.info("--- CONTENT INFO ---"); + Log.debug("--- CONTENT INFO ---"); for(int k = 0; k < contentMap.length; k++){ - Log.info("[{0}]: loaded {1}", ContentType.values()[k].name(), contentMap[k].size); + Log.debug("[{0}]: loaded {1}", ContentType.values()[k].name(), contentMap[k].size); } - Log.info("Total content loaded: {0}", Array.with(ContentType.values()).mapInt(c -> contentMap[c.ordinal()].size).sum()); - Log.info("-------------------"); + Log.debug("Total content loaded: {0}", Array.with(ContentType.values()).mapInt(c -> contentMap[c.ordinal()].size).sum()); + Log.debug("-------------------"); } /** Calls Content#init() on everything. Use only after all modules have been created.*/ @@ -147,13 +148,23 @@ public class ContentLoader{ public void handleContent(Content content){ contentMap[content.getContentType().ordinal()].add(content); + } + public void setCurrentMod(LoadedMod mod){ + this.currentMod = mod; + } + + public String transformName(String name){ + return currentMod == null ? name : currentMod.name + "-" + name; } 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 + "')"); } + if(currentMod != null){ + content.mod = currentMod; + } contentNameMap[content.getContentType().ordinal()].put(content.name, content); } diff --git a/core/src/io/anuke/mindustry/core/Control.java b/core/src/io/anuke/mindustry/core/Control.java index b38cc63297..c7a04955ca 100644 --- a/core/src/io/anuke/mindustry/core/Control.java +++ b/core/src/io/anuke/mindustry/core/Control.java @@ -451,12 +451,12 @@ public class Control implements ApplicationListener, Loadable{ platform.updateRPC(); } - if(Core.input.keyTap(Binding.pause) && !scene.hasDialog() && !ui.restart.isShown() && (state.is(State.paused) || state.is(State.playing))){ + if(Core.input.keyTap(Binding.pause) && !scene.hasDialog() && !scene.hasKeyboard() && !ui.restart.isShown() && (state.is(State.paused) || state.is(State.playing))){ state.set(state.is(State.playing) ? State.paused : State.playing); } if(Core.input.keyTap(Binding.menu) && !ui.restart.isShown()){ - if(ui.chatfrag.chatOpen()){ + if(ui.chatfrag.shown()){ ui.chatfrag.hide(); }else if(!ui.paused.isShown() && !scene.hasDialog()){ ui.paused.show(); @@ -464,7 +464,7 @@ public class Control implements ApplicationListener, Loadable{ } } - if(!mobile && Core.input.keyTap(Binding.screenshot) && !(scene.getKeyboardFocus() instanceof TextField) && !ui.chatfrag.chatOpen()){ + if(!mobile && Core.input.keyTap(Binding.screenshot) && !(scene.getKeyboardFocus() instanceof TextField) && !scene.hasKeyboard()){ renderer.takeMapScreenshot(); } diff --git a/core/src/io/anuke/mindustry/core/Logic.java b/core/src/io/anuke/mindustry/core/Logic.java index a3f87727de..69c667e625 100644 --- a/core/src/io/anuke/mindustry/core/Logic.java +++ b/core/src/io/anuke/mindustry/core/Logic.java @@ -5,7 +5,7 @@ import io.anuke.arc.*; import io.anuke.arc.util.*; import io.anuke.mindustry.content.*; import io.anuke.mindustry.core.GameState.*; -import io.anuke.mindustry.ctype.UnlockableContent; +import io.anuke.mindustry.ctype.*; import io.anuke.mindustry.entities.*; import io.anuke.mindustry.entities.type.*; import io.anuke.mindustry.game.EventType.*; @@ -52,7 +52,7 @@ public class Logic implements ApplicationListener{ if(block instanceof BuildBlock){ - BuildEntity entity = tile.entity(); + BuildEntity entity = tile.ent(); //update block to reflect the fact that something was being constructed if(entity.cblock != null && entity.cblock.synthetic()){ @@ -189,6 +189,7 @@ public class Logic implements ApplicationListener{ for(Item item : content.items()){ if(tile == null || tile.entity == null || tile.entity.items == null) continue; data.addItem(item, tile.entity.items.get(item)); + Events.fire(new LaunchItemEvent(item, tile.entity.items.get(item))); } world.removeBlock(tile); } diff --git a/core/src/io/anuke/mindustry/core/NetClient.java b/core/src/io/anuke/mindustry/core/NetClient.java index a3b85facb0..f4cc17693b 100644 --- a/core/src/io/anuke/mindustry/core/NetClient.java +++ b/core/src/io/anuke/mindustry/core/NetClient.java @@ -342,6 +342,26 @@ public class NetClient implements ApplicationListener{ } } + @Remote(variants = Variant.both, priority = PacketPriority.low, unreliable = true) + public static void onBlockSnapshot(short amount, short dataLen, byte[] data){ + try{ + netClient.byteStream.setBytes(net.decompressSnapshot(data, dataLen)); + DataInputStream input = netClient.dataStream; + + for(int i = 0; i < amount; i++){ + int pos = input.readInt(); + Tile tile = world.tile(pos); + if(tile == null || tile.entity == null){ + Log.warn("Missing entity at {0}. Skipping block snapshot.", tile); + break; + } + tile.entity.read(input, tile.entity.version()); + } + }catch(Exception e){ + e.printStackTrace(); + } + } + @Remote(variants = Variant.one, priority = PacketPriority.low, unreliable = true) public static void onStateSnapshot(float waveTime, int wave, int enemies, short coreDataLen, byte[] coreData){ try{ @@ -471,7 +491,7 @@ public class NetClient implements ApplicationListener{ player.pointerX, player.pointerY, player.rotation, player.baseRotation, player.velocity().x, player.velocity().y, player.getMineTile(), - player.isBoosting, player.isShooting, ui.chatfrag.chatOpen(), player.isBuilding, + player.isBoosting, player.isShooting, ui.chatfrag.shown(), player.isBuilding, requests, Core.camera.position.x, Core.camera.position.y, Core.camera.width * viewScale, Core.camera.height * viewScale); diff --git a/core/src/io/anuke/mindustry/core/NetServer.java b/core/src/io/anuke/mindustry/core/NetServer.java index 8de0e91fe4..72d141576b 100644 --- a/core/src/io/anuke/mindustry/core/NetServer.java +++ b/core/src/io/anuke/mindustry/core/NetServer.java @@ -30,8 +30,8 @@ import java.util.zip.*; import static io.anuke.mindustry.Vars.*; public class NetServer implements ApplicationListener{ - public final static int maxSnapshotSize = 430; - private final static float serverSyncTime = 12, kickDuration = 30 * 1000; + private final static int maxSnapshotSize = 430, timerBlockSync = 0; + private final static float serverSyncTime = 12, kickDuration = 30 * 1000, blockSyncTime = 60 * 10; private final static Vector2 vector = new Vector2(); private final static Rectangle viewport = new Rectangle(); /** If a player goes away of their server-side coordinates by this distance, they get teleported back. */ @@ -41,6 +41,7 @@ public class NetServer implements ApplicationListener{ public final CommandHandler clientCommands = new CommandHandler("/"); private boolean closing = false; + private Interval timer = new Interval(); private ByteBuffer writeBuffer = ByteBuffer.allocate(127); private ByteBufferOutput outputBuffer = new ByteBufferOutput(writeBuffer); @@ -65,6 +66,10 @@ public class NetServer implements ApplicationListener{ }); net.handleServer(ConnectPacket.class, (con, packet) -> { + if(con.address.startsWith("steam:")){ + packet.uuid = con.address.substring("steam:".length()); + } + String uuid = packet.uuid; if(admins.isIPBanned(con.address)) return; @@ -612,7 +617,35 @@ public class NetServer implements ApplicationListener{ } } - public void writeSnapshot(Player player) throws IOException{ + /** Sends a block snapshot to all players. */ + public void writeBlockSnapshots() throws IOException{ + syncStream.reset(); + + short sent = 0; + for(TileEntity entity : tileGroup.all()){ + if(!entity.block.sync) continue; + sent ++; + + dataStream.writeInt(entity.tile.pos()); + entity.write(dataStream); + + if(syncStream.size() > maxSnapshotSize){ + dataStream.close(); + byte[] stateBytes = syncStream.toByteArray(); + Call.onBlockSnapshot(sent, (short)stateBytes.length, net.compressSnapshot(stateBytes)); + sent = 0; + syncStream.reset(); + } + } + + if(sent > 0){ + dataStream.close(); + byte[] stateBytes = syncStream.toByteArray(); + Call.onBlockSnapshot(sent, (short)stateBytes.length, net.compressSnapshot(stateBytes)); + } + } + + public void writeEntitySnapshot(Player player) throws IOException{ syncStream.reset(); ObjectSet cores = state.teams.get(player.getTeam()).cores; @@ -726,7 +759,6 @@ public class NetServer implements ApplicationListener{ void sync(){ try{ - //iterate through each player for(int i = 0; i < playerGroup.size(); i++){ Player player = playerGroup.all().get(i); @@ -741,7 +773,11 @@ public class NetServer implements ApplicationListener{ if(!player.timer.get(Player.timerSync, serverSyncTime) || !connection.hasConnected) continue; - writeSnapshot(player); + writeEntitySnapshot(player); + } + + if(playerGroup.size() > 0 && Core.settings.getBool("blocksync") && timer.get(timerBlockSync, blockSyncTime)){ + writeBlockSnapshots(); } }catch(IOException e){ diff --git a/core/src/io/anuke/mindustry/core/Platform.java b/core/src/io/anuke/mindustry/core/Platform.java index 50875d426d..e123406811 100644 --- a/core/src/io/anuke/mindustry/core/Platform.java +++ b/core/src/io/anuke/mindustry/core/Platform.java @@ -8,10 +8,12 @@ import io.anuke.arc.func.*; import io.anuke.arc.math.*; import io.anuke.arc.scene.ui.*; import io.anuke.arc.util.serialization.*; +import io.anuke.mindustry.mod.*; import io.anuke.mindustry.net.*; import io.anuke.mindustry.net.Net.*; import io.anuke.mindustry.type.*; import io.anuke.mindustry.ui.dialogs.*; +import org.mozilla.javascript.*; import static io.anuke.mindustry.Vars.mobile; @@ -42,7 +44,18 @@ public interface Platform{ /** Get the networking implementation.*/ default NetProvider getNet(){ - return new ArcNetImpl(); + return new ArcNetProvider(); + } + + /** Gets the scripting implementation. */ + default Scripts createScripts(){ + return new Scripts(); + } + + default Context getScriptContext(){ + Context c = Context.enter(); + c.setOptimizationLevel(9); + return c; } /** Add a text input dialog that should show up after the field is tapped. */ diff --git a/core/src/io/anuke/mindustry/core/UI.java b/core/src/io/anuke/mindustry/core/UI.java index c15917ec51..3eb530ac7f 100644 --- a/core/src/io/anuke/mindustry/core/UI.java +++ b/core/src/io/anuke/mindustry/core/UI.java @@ -42,6 +42,7 @@ public class UI implements ApplicationListener, Loadable{ public MenuFragment menufrag; public HudFragment hudfrag; public ChatFragment chatfrag; + public ScriptConsoleFragment scriptfrag; public PlayerListFragment listfrag; public LoadingFragment loadfrag; @@ -211,6 +212,7 @@ public class UI implements ApplicationListener, Loadable{ chatfrag = new ChatFragment(); listfrag = new PlayerListFragment(); loadfrag = new LoadingFragment(); + scriptfrag = new ScriptConsoleFragment(); picker = new ColorPicker(); editor = new MapEditorDialog(); @@ -253,6 +255,7 @@ public class UI implements ApplicationListener, Loadable{ menufrag.build(menuGroup); chatfrag.container().build(hudGroup); listfrag.build(hudGroup); + scriptfrag.container().build(hudGroup); loadfrag.build(group); new FadeInFragment().build(group); } @@ -429,12 +432,15 @@ public class UI implements ApplicationListener, Loadable{ } - public void showCustomConfirm(String title, String text, String yes, String no, Runnable confirmed){ + public void showCustomConfirm(String title, String text, String yes, String no, Runnable confirmed, Runnable denied){ FloatingDialog dialog = new FloatingDialog(title); dialog.cont.add(text).width(mobile ? 400f : 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(no, () -> { + dialog.hide(); + denied.run(); + }); dialog.buttons.addButton(yes, () -> { dialog.hide(); confirmed.run(); @@ -458,11 +464,11 @@ public class UI implements ApplicationListener, Loadable{ public String formatAmount(int number){ if(number >= 1000000){ - return Strings.fixed(number / 1000000f, 1) + "[gray]mil[]"; + return Strings.fixed(number / 1000000f, 1) + "[gray]" + Core.bundle.getOrNull("unit.millions") + "[]"; }else if(number >= 10000){ return number / 1000 + "[gray]k[]"; }else if(number >= 1000){ - return Strings.fixed(number / 1000f, 1) + "[gray]k[]"; + return Strings.fixed(number / 1000f, 1) + "[gray]" + Core.bundle.getOrNull("unit.thousands") + "[]"; }else{ return number + ""; } diff --git a/core/src/io/anuke/mindustry/ctype/MappableContent.java b/core/src/io/anuke/mindustry/ctype/MappableContent.java index 3063157c13..709e7652d4 100644 --- a/core/src/io/anuke/mindustry/ctype/MappableContent.java +++ b/core/src/io/anuke/mindustry/ctype/MappableContent.java @@ -6,7 +6,7 @@ public abstract class MappableContent extends Content{ public final String name; public MappableContent(String name){ - this.name = name; + this.name = Vars.content.transformName(name); Vars.content.handleMappableContent(this); } diff --git a/core/src/io/anuke/mindustry/ctype/UnlockableContent.java b/core/src/io/anuke/mindustry/ctype/UnlockableContent.java index 9c33b09fb6..ab1e4d9e4b 100644 --- a/core/src/io/anuke/mindustry/ctype/UnlockableContent.java +++ b/core/src/io/anuke/mindustry/ctype/UnlockableContent.java @@ -5,6 +5,7 @@ import io.anuke.arc.*; import io.anuke.arc.graphics.g2d.*; import io.anuke.arc.scene.ui.layout.*; import io.anuke.mindustry.*; +import io.anuke.mindustry.graphics.*; import io.anuke.mindustry.ui.Cicon; /** Base interface for an unlockable content type. */ @@ -19,13 +20,13 @@ public abstract class UnlockableContent extends MappableContent{ public UnlockableContent(String name){ super(name); - this.localizedName = Core.bundle.get(getContentType() + "." + name + ".name", name); - this.description = Core.bundle.getOrNull(getContentType() + "." + name + ".description"); + this.localizedName = Core.bundle.get(getContentType() + "." + this.name + ".name", this.name); + this.description = Core.bundle.getOrNull(getContentType() + "." + this.name + ".description"); } /** Generate any special icons for this content. Called asynchronously.*/ @CallSuper - public void createIcons(PixmapPacker out, PixmapPacker editor){ + public void createIcons(MultiPacker packer){ } @@ -41,11 +42,6 @@ public abstract class UnlockableContent extends MappableContent{ return cicons[icon.ordinal()]; } - /** Returns the localized name of this content. */ - public abstract String localizedName(); - - //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/entities/Damage.java b/core/src/io/anuke/mindustry/entities/Damage.java index 149bb9b4d8..e637c6081e 100644 --- a/core/src/io/anuke/mindustry/entities/Damage.java +++ b/core/src/io/anuke/mindustry/entities/Damage.java @@ -38,7 +38,7 @@ public class Damage{ } for(int i = 0; i < Mathf.clamp(flammability / 4, 0, 30); i++){ - Time.run(i / 2f, () -> Call.createBullet(Bullets.fireball, x, y, Mathf.random(360f))); + Time.run(i / 2f, () -> Call.createBullet(Bullets.fireball, Team.derelict, x, y, Mathf.random(360f), 1, 1)); } int waves = Mathf.clamp((int)(explosiveness / 4), 0, 30); diff --git a/core/src/io/anuke/mindustry/entities/Effects.java b/core/src/io/anuke/mindustry/entities/Effects.java index 2647fc2427..ca1492bdbf 100644 --- a/core/src/io/anuke/mindustry/entities/Effects.java +++ b/core/src/io/anuke/mindustry/entities/Effects.java @@ -4,6 +4,7 @@ import io.anuke.arc.Core; import io.anuke.arc.collection.Array; import io.anuke.arc.func.Cons; import io.anuke.arc.graphics.Color; +import io.anuke.arc.graphics.g2d.*; import io.anuke.arc.math.Mathf; import io.anuke.arc.math.geom.Position; import io.anuke.arc.util.pooling.Pools; @@ -36,6 +37,7 @@ public class Effects{ public static void renderEffect(int id, Effect render, Color color, float life, float rotation, float x, float y, Object data){ container.set(id, color, life, render.lifetime, rotation, x, y, data); render.draw.render(container); + Draw.reset(); } public static Effect getEffect(int id){ diff --git a/core/src/io/anuke/mindustry/entities/effect/Fire.java b/core/src/io/anuke/mindustry/entities/effect/Fire.java index 2c47550426..8546ec45e8 100644 --- a/core/src/io/anuke/mindustry/entities/effect/Fire.java +++ b/core/src/io/anuke/mindustry/entities/effect/Fire.java @@ -10,10 +10,10 @@ import io.anuke.mindustry.content.*; import io.anuke.mindustry.entities.*; import io.anuke.mindustry.entities.traits.*; import io.anuke.mindustry.entities.type.*; -import io.anuke.mindustry.entities.type.TimedEntity; import io.anuke.mindustry.game.EventType.*; +import io.anuke.mindustry.game.*; import io.anuke.mindustry.gen.*; -import io.anuke.mindustry.type.TypeID; +import io.anuke.mindustry.type.*; import io.anuke.mindustry.world.*; import java.io.*; @@ -144,7 +144,7 @@ public class Fire extends TimedEntity implements SaveTrait, SyncTrait{ create(other); if(Mathf.chance(fireballChance * Time.delta() * Mathf.clamp(flammability / 10f))){ - Call.createBullet(Bullets.fireball, x, y, Mathf.random(360f)); + Call.createBullet(Bullets.fireball, Team.derelict, x, y, Mathf.random(360f), 1, 1); } } diff --git a/core/src/io/anuke/mindustry/entities/effect/Puddle.java b/core/src/io/anuke/mindustry/entities/effect/Puddle.java index e7f1330a10..e53e40e8dc 100644 --- a/core/src/io/anuke/mindustry/entities/effect/Puddle.java +++ b/core/src/io/anuke/mindustry/entities/effect/Puddle.java @@ -1,25 +1,22 @@ package io.anuke.mindustry.entities.effect; -import io.anuke.annotations.Annotations.Loc; -import io.anuke.annotations.Annotations.Remote; -import io.anuke.arc.collection.IntMap; -import io.anuke.arc.graphics.Color; -import io.anuke.arc.graphics.g2d.Draw; -import io.anuke.arc.graphics.g2d.Fill; -import io.anuke.arc.math.Angles; -import io.anuke.arc.math.Mathf; +import io.anuke.annotations.Annotations.*; +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.math.geom.*; -import io.anuke.arc.util.Time; -import io.anuke.arc.util.pooling.Pool.Poolable; -import io.anuke.arc.util.pooling.Pools; +import io.anuke.arc.util.*; +import io.anuke.arc.util.pooling.Pool.*; +import io.anuke.arc.util.pooling.*; import io.anuke.mindustry.content.*; import io.anuke.mindustry.entities.*; -import io.anuke.mindustry.entities.type.SolidEntity; import io.anuke.mindustry.entities.traits.*; -import io.anuke.mindustry.type.TypeID; -import io.anuke.mindustry.gen.Call; -import io.anuke.mindustry.type.Liquid; -import io.anuke.mindustry.world.Tile; +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.*; import java.io.*; @@ -118,7 +115,7 @@ public class Puddle extends SolidEntity implements SaveTrait, Poolable, DrawTrai (liquid.flammability > 0.3f && dest.temperature > 0.7f)){ //flammable liquid + hot liquid Fire.create(tile); if(Mathf.chance(0.006 * amount)){ - Call.createBullet(Bullets.fireball, x, y, Mathf.random(360f)); + Call.createBullet(Bullets.fireball, Team.derelict, x, y, Mathf.random(360f), 1f, 1f); } }else if(dest.temperature > 0.7f && liquid.temperature < 0.55f){ //cold liquid poured onto hot puddle if(Mathf.chance(0.5f * amount)){ diff --git a/core/src/io/anuke/mindustry/entities/traits/BuilderTrait.java b/core/src/io/anuke/mindustry/entities/traits/BuilderTrait.java index bb02ed792d..c7ced76ec8 100644 --- a/core/src/io/anuke/mindustry/entities/traits/BuilderTrait.java +++ b/core/src/io/anuke/mindustry/entities/traits/BuilderTrait.java @@ -2,7 +2,6 @@ package io.anuke.mindustry.entities.traits; import io.anuke.arc.*; import io.anuke.arc.collection.Queue; -import io.anuke.arc.collection.*; import io.anuke.arc.graphics.g2d.*; import io.anuke.arc.math.*; import io.anuke.arc.math.geom.*; @@ -35,14 +34,14 @@ public interface BuilderTrait extends Entity, TeamTrait{ float finalPlaceDst = state.rules.infiniteResources ? Float.MAX_VALUE : placeDistance; Unit unit = (Unit)this; - //remove already completed build requests - removal.clear(); - removal.addAll(buildQueue()); - - Structs.filter(buildQueue(), req -> { + Iterator it = buildQueue().iterator(); + while(it.hasNext()){ + BuildRequest req = it.next(); Tile tile = world.tile(req.x, req.y); - return tile == null || (req.breaking && tile.block() == Blocks.air) || (!req.breaking && (tile.rotation() == req.rotation || !req.block.rotate) && tile.block() == req.block); - }); + if(tile == null || (req.breaking && tile.block() == Blocks.air) || (!req.breaking && (tile.rotation() == req.rotation || !req.block.rotate) && tile.block() == req.block)){ + it.remove(); + } + } TileEntity core = unit.getClosestCore(); @@ -62,6 +61,8 @@ public interface BuilderTrait extends Entity, TeamTrait{ BuildRequest current = buildRequest(); + if(dst(current.tile()) > finalPlaceDst) return; + Tile tile = world.tile(current.x, current.y); if(!(tile.block() instanceof BuildBlock)){ @@ -86,7 +87,7 @@ public interface BuilderTrait extends Entity, TeamTrait{ } //otherwise, update it. - BuildEntity entity = tile.entity(); + BuildEntity entity = tile.ent(); if(entity == null){ return; @@ -208,7 +209,7 @@ public interface BuilderTrait extends Entity, TeamTrait{ } Tile tile = world.tile(place.x, place.y); if(tile != null && tile.entity instanceof BuildEntity){ - place.progress = tile.entity().progress; + place.progress = tile.ent().progress; } if(tail){ buildQueue().addLast(place); @@ -228,7 +229,6 @@ public interface BuilderTrait extends Entity, TeamTrait{ //due to iOS weirdness, this is apparently required class BuildDataStatic{ - static Array removal = new Array<>(); static Vector2[] tmptr = new Vector2[]{new Vector2(), new Vector2(), new Vector2(), new Vector2()}; } diff --git a/core/src/io/anuke/mindustry/entities/type/BaseUnit.java b/core/src/io/anuke/mindustry/entities/type/BaseUnit.java index ab22a7933b..b0b741bacb 100644 --- a/core/src/io/anuke/mindustry/entities/type/BaseUnit.java +++ b/core/src/io/anuke/mindustry/entities/type/BaseUnit.java @@ -107,7 +107,7 @@ public abstract class BaseUnit extends Unit implements ShooterTrait{ public @Nullable UnitCommand getCommand(){ if(isCommanded()){ - return indexer.getAllied(team, BlockFlag.comandCenter).first().entity().command; + return indexer.getAllied(team, BlockFlag.comandCenter).first().ent().command; } return null; } diff --git a/core/src/io/anuke/mindustry/entities/type/Bullet.java b/core/src/io/anuke/mindustry/entities/type/Bullet.java index a5c3d21697..abf7952aeb 100644 --- a/core/src/io/anuke/mindustry/entities/type/Bullet.java +++ b/core/src/io/anuke/mindustry/entities/type/Bullet.java @@ -77,16 +77,9 @@ public class Bullet extends SolidEntity implements DamageTrait, ScaleTrait, Pool return create(type, parent.owner, parent.team, x, y, angle, velocityScl); } - /** Internal use only. */ @Remote(called = Loc.server, unreliable = true) - public static void createBullet(BulletType type, float x, float y, float angle){ - create(type, null, Team.derelict, x, y, angle); - } - - /** ok */ - @Remote(called = Loc.server, unreliable = true) - public static void createBullet(BulletType type, Team team, float x, float y, float angle){ - create(type, null, team, x, y, angle); + public static void createBullet(BulletType type, Team team, float x, float y, float angle, float velocityScl, float lifetimeScl){ + create(type, null, team, x, y, angle, velocityScl, lifetimeScl, null); } public Entity getOwner(){ diff --git a/core/src/io/anuke/mindustry/entities/type/Player.java b/core/src/io/anuke/mindustry/entities/type/Player.java index 4e83cd1091..73c0fc4dc0 100644 --- a/core/src/io/anuke/mindustry/entities/type/Player.java +++ b/core/src/io/anuke/mindustry/entities/type/Player.java @@ -556,7 +556,7 @@ public class Player extends Unit implements BuilderMinerTrait, ShooterTrait{ updateKeyboard(); } - isTyping = ui.chatfrag.chatOpen(); + isTyping = ui.chatfrag.shown(); updateMechanics(); @@ -604,7 +604,7 @@ public class Player extends Unit implements BuilderMinerTrait, ShooterTrait{ movement.limit(speed).scl(Time.delta()); - if(!ui.chatfrag.chatOpen()){ + if(!Core.scene.hasKeyboard()){ velocity.add(movement.x, movement.y); }else{ isShooting = false; @@ -613,7 +613,7 @@ public class Player extends Unit implements BuilderMinerTrait, ShooterTrait{ updateVelocityStatus(); moved = dst(prex, prey) > 0.001f; - if(!ui.chatfrag.chatOpen()){ + if(!Core.scene.hasKeyboard()){ float baseLerp = mech.getRotationAlpha(this); if(!isShooting() || !mech.turnCursor){ if(!movement.isZero()){ diff --git a/core/src/io/anuke/mindustry/entities/type/TileEntity.java b/core/src/io/anuke/mindustry/entities/type/TileEntity.java index 96d124f99b..8c9617b28b 100644 --- a/core/src/io/anuke/mindustry/entities/type/TileEntity.java +++ b/core/src/io/anuke/mindustry/entities/type/TileEntity.java @@ -15,6 +15,7 @@ import io.anuke.mindustry.game.*; import io.anuke.mindustry.game.EventType.BlockDestroyEvent; import io.anuke.mindustry.gen.*; import io.anuke.mindustry.world.*; +import io.anuke.mindustry.world.consumers.*; import io.anuke.mindustry.world.modules.*; import java.io.*; @@ -36,7 +37,7 @@ public class TileEntity extends BaseEntity implements TargetTrait, HealthTrait{ public PowerModule power; public ItemModule items; public LiquidModule liquids; - public ConsumeModule cons; + public @Nullable ConsumeModule cons; /** List of (cached) tiles with entities in proximity, used for outputting to */ private Array proximity = new Array<>(8); @@ -89,7 +90,7 @@ public class TileEntity extends BaseEntity implements TargetTrait, HealthTrait{ /** Base efficiency. If this entity has non-buffered power, returns the power %, otherwise returns 1. */ public float efficiency(){ - return power != null && !block.consumes.getPower().buffered ? power.status : 1f; + return power != null && (block.consumes.has(ConsumeType.power) && !block.consumes.getPower().buffered) ? power.status : 1f; } /** Call when nothing is happening to the entity. This increments the internal sleep timer. */ 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 06a3ceb60d..fdaaa049dd 100644 --- a/core/src/io/anuke/mindustry/entities/type/base/BuilderDrone.java +++ b/core/src/io/anuke/mindustry/entities/type/base/BuilderDrone.java @@ -24,6 +24,7 @@ public class BuilderDrone extends BaseDrone implements BuilderTrait{ private static final IntIntMap totals = new IntIntMap(); protected Queue placeQueue = new Queue<>(); + protected BuildRequest lastFound; protected boolean isBreaking; protected Player playerTarget; @@ -57,6 +58,9 @@ public class BuilderDrone extends BaseDrone implements BuilderTrait{ buildQueue().addLast(new BuildRequest(entity.tile.x, entity.tile.y)); }else{ buildQueue().addLast(new BuildRequest(entity.tile.x, entity.tile.y, entity.tile.rotation(), entity.cblock)); + if(lastFound != null && lastFound.hasConfig){ + buildQueue().last().configure(lastFound.config); + } } } @@ -171,9 +175,10 @@ public class BuilderDrone extends BaseDrone implements BuilderTrait{ BuildRequest req = player.buildRequest(); Tile tile = world.tile(req.x, req.y); if(tile != null && tile.entity instanceof BuildEntity){ - BuildEntity b = tile.entity(); + BuildEntity b = tile.ent(); float dist = Math.min(b.dst(x, y) - placeDistance, 0); if(dist / type.maxVelocity < b.buildCost * 0.9f){ + lastFound = req; target = b; this.isBreaking = req.breaking; 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 deleted file mode 100644 index 44da8bea5f..0000000000 --- a/core/src/io/anuke/mindustry/entities/type/base/Crawler.java +++ /dev/null @@ -1,4 +0,0 @@ -package io.anuke.mindustry.entities.type.base; - -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 deleted file mode 100644 index 09a39daaa7..0000000000 --- a/core/src/io/anuke/mindustry/entities/type/base/Dagger.java +++ /dev/null @@ -1,5 +0,0 @@ -package io.anuke.mindustry.entities.type.base; - -public class Dagger extends GroundUnit{ - -} diff --git a/core/src/io/anuke/mindustry/entities/type/base/Draug.java b/core/src/io/anuke/mindustry/entities/type/base/Draug.java deleted file mode 100644 index 47b7caed25..0000000000 --- a/core/src/io/anuke/mindustry/entities/type/base/Draug.java +++ /dev/null @@ -1,4 +0,0 @@ -package io.anuke.mindustry.entities.type.base; - -public class Draug extends MinerDrone{ -} diff --git a/core/src/io/anuke/mindustry/entities/type/base/Eruptor.java b/core/src/io/anuke/mindustry/entities/type/base/Eruptor.java deleted file mode 100644 index 4c86371811..0000000000 --- a/core/src/io/anuke/mindustry/entities/type/base/Eruptor.java +++ /dev/null @@ -1,4 +0,0 @@ -package io.anuke.mindustry.entities.type.base; - -public class Eruptor extends GroundUnit{ -} diff --git a/core/src/io/anuke/mindustry/entities/type/base/Fortress.java b/core/src/io/anuke/mindustry/entities/type/base/Fortress.java deleted file mode 100644 index c4f36dba69..0000000000 --- a/core/src/io/anuke/mindustry/entities/type/base/Fortress.java +++ /dev/null @@ -1,4 +0,0 @@ -package io.anuke.mindustry.entities.type.base; - -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 deleted file mode 100644 index 0c4294645a..0000000000 --- a/core/src/io/anuke/mindustry/entities/type/base/Ghoul.java +++ /dev/null @@ -1,5 +0,0 @@ -package io.anuke.mindustry.entities.type.base; - -public class Ghoul extends FlyingUnit{ - -} diff --git a/core/src/io/anuke/mindustry/entities/type/base/Revenant.java b/core/src/io/anuke/mindustry/entities/type/base/HoverUnit.java similarity index 96% rename from core/src/io/anuke/mindustry/entities/type/base/Revenant.java rename to core/src/io/anuke/mindustry/entities/type/base/HoverUnit.java index 393c134891..6aae538484 100644 --- a/core/src/io/anuke/mindustry/entities/type/base/Revenant.java +++ b/core/src/io/anuke/mindustry/entities/type/base/HoverUnit.java @@ -5,7 +5,7 @@ import io.anuke.arc.math.Angles; import io.anuke.arc.math.Mathf; import io.anuke.mindustry.entities.Units; -public class Revenant extends FlyingUnit{ +public class HoverUnit extends FlyingUnit{ @Override public void drawWeapons(){ diff --git a/core/src/io/anuke/mindustry/entities/type/base/Phantom.java b/core/src/io/anuke/mindustry/entities/type/base/Phantom.java deleted file mode 100644 index 1a50115647..0000000000 --- a/core/src/io/anuke/mindustry/entities/type/base/Phantom.java +++ /dev/null @@ -1,5 +0,0 @@ -package io.anuke.mindustry.entities.type.base; - -public class Phantom extends BuilderDrone{ - -} diff --git a/core/src/io/anuke/mindustry/entities/type/base/Spirit.java b/core/src/io/anuke/mindustry/entities/type/base/Spirit.java deleted file mode 100644 index d43fc658b0..0000000000 --- a/core/src/io/anuke/mindustry/entities/type/base/Spirit.java +++ /dev/null @@ -1,4 +0,0 @@ -package io.anuke.mindustry.entities.type.base; - -public class Spirit extends RepairDrone{ -} diff --git a/core/src/io/anuke/mindustry/entities/type/base/Titan.java b/core/src/io/anuke/mindustry/entities/type/base/Titan.java deleted file mode 100644 index 9324d4d215..0000000000 --- a/core/src/io/anuke/mindustry/entities/type/base/Titan.java +++ /dev/null @@ -1,5 +0,0 @@ -package io.anuke.mindustry.entities.type.base; - -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 deleted file mode 100644 index c8923e309f..0000000000 --- a/core/src/io/anuke/mindustry/entities/type/base/Wraith.java +++ /dev/null @@ -1,5 +0,0 @@ -package io.anuke.mindustry.entities.type.base; - -public class Wraith extends FlyingUnit{ - -} diff --git a/core/src/io/anuke/mindustry/game/EventType.java b/core/src/io/anuke/mindustry/game/EventType.java index ac56c86b6e..f631019729 100644 --- a/core/src/io/anuke/mindustry/game/EventType.java +++ b/core/src/io/anuke/mindustry/game/EventType.java @@ -37,6 +37,14 @@ public class EventType{ public static class LaunchEvent{} + public static class LaunchItemEvent{ + public final ItemStack stack; + + public LaunchItemEvent(Item item, int amount){ + this.stack = new ItemStack(item, amount); + } + } + public static class MapMakeEvent{} public static class MapPublishEvent{} @@ -87,6 +95,10 @@ public class EventType{ } + public static class ServerLoadEvent{ + + } + public static class ContentReloadEvent{ } @@ -138,7 +150,7 @@ public class EventType{ public final Player player; public final Item item; public final int amount; - + public DepositEvent(Tile tile, Player player, Item item, int amount){ this.tile = tile; this.player = player; @@ -146,7 +158,7 @@ public class EventType{ this.amount = amount; } } - + /** Called when the player taps a block. */ public static class TapEvent{ public final Tile tile; @@ -157,7 +169,7 @@ public class EventType{ this.player = player; } } - + /** Called when the player sets a specific block. */ public static class TapConfigEvent{ public final Tile tile; @@ -310,7 +322,7 @@ public class EventType{ /** Called after connecting; when a player recieves world data and is ready to play.*/ public static class PlayerJoin{ public final Player player; - + public PlayerJoin(Player player){ this.player = player; } @@ -327,11 +339,45 @@ public class EventType{ public static class PlayerLeave{ public final Player player; - + public PlayerLeave(Player player){ this.player = player; } } - + + public static class PlayerBanEvent{ + public final Player player; + + public PlayerBanEvent(Player player){ + this.player = player; + } + } + + public static class PlayerUnbanEvent{ + public final Player player; + + public PlayerUnbanEvent(Player player){ + this.player = player; + } + } + + public static class PlayerIpBanEvent{ + public final String ip; + + + public PlayerIpBanEvent(String ip){ + this.ip = ip; + } + } + + public static class PlayerIpUnbanEvent{ + public final String ip; + + + public PlayerIpUnbanEvent(String ip){ + this.ip = ip; + } + } + } diff --git a/core/src/io/anuke/mindustry/game/Schematic.java b/core/src/io/anuke/mindustry/game/Schematic.java index 1ff6efd77c..4c83623602 100644 --- a/core/src/io/anuke/mindustry/game/Schematic.java +++ b/core/src/io/anuke/mindustry/game/Schematic.java @@ -5,6 +5,7 @@ import io.anuke.arc.collection.IntIntMap.*; import io.anuke.arc.files.*; import io.anuke.arc.util.ArcAnnotate.*; import io.anuke.mindustry.*; +import io.anuke.mindustry.mod.Mods.*; import io.anuke.mindustry.type.*; import io.anuke.mindustry.world.*; import io.anuke.mindustry.world.blocks.storage.*; @@ -16,8 +17,10 @@ public class Schematic implements Publishable, Comparable{ public StringMap tags; public int width, height; public @Nullable FileHandle file; + /** Associated mod. If null, no mod is associated with this schematic. */ + public @Nullable LoadedMod mod; - public Schematic(Array tiles, StringMap tags, int width, int height){ + public Schematic(Array tiles, @NonNull StringMap tags, int width, int height){ this.tiles = tiles; this.tags = tags; this.width = width; diff --git a/core/src/io/anuke/mindustry/game/Schematics.java b/core/src/io/anuke/mindustry/game/Schematics.java index f6086b8b2e..078300bc52 100644 --- a/core/src/io/anuke/mindustry/game/Schematics.java +++ b/core/src/io/anuke/mindustry/game/Schematics.java @@ -8,6 +8,7 @@ import io.anuke.arc.graphics.*; import io.anuke.arc.graphics.g2d.*; import io.anuke.arc.graphics.glutils.*; import io.anuke.arc.util.*; +import io.anuke.arc.util.ArcAnnotate.*; import io.anuke.arc.util.io.Streams.*; import io.anuke.arc.util.serialization.*; import io.anuke.mindustry.*; @@ -74,6 +75,14 @@ public class Schematics implements Loadable{ platform.getWorkshopContent(Schematic.class).each(this::loadFile); + //mod-specific schematics, cannot be removed + mods.listFiles("schematics", (mod, file) -> { + Schematic s = loadFile(file); + if(s != null){ + s.mod = mod; + } + }); + all.sort(); if(shadowBuffer == null){ @@ -102,8 +111,8 @@ public class Schematics implements Loadable{ } } - private void loadFile(FileHandle file){ - if(!file.extension().equals(schematicExtension)) return; + private @Nullable Schematic loadFile(FileHandle file){ + if(!file.extension().equals(schematicExtension)) return null; try{ Schematic s = read(file); @@ -113,9 +122,12 @@ public class Schematics implements Loadable{ if(!s.file.parent().equals(schematicDirectory)){ s.tags.put("steamid", s.file.parent().name()); } + + return s; }catch(IOException e){ Log.err(e); } + return null; } public Array all(){ diff --git a/core/src/io/anuke/mindustry/game/Stats.java b/core/src/io/anuke/mindustry/game/Stats.java index aa152d377c..3c6847712e 100644 --- a/core/src/io/anuke/mindustry/game/Stats.java +++ b/core/src/io/anuke/mindustry/game/Stats.java @@ -9,7 +9,7 @@ import io.anuke.mindustry.type.*; @Serialize public class Stats{ /** Items delivered to global resoure counter. Zones only. */ - public transient ObjectIntMap itemsDelivered = new ObjectIntMap<>(); + public ObjectIntMap itemsDelivered = new ObjectIntMap<>(); /** Enemy (red team) units destroyed. */ public int enemyUnitsDestroyed; /** Total waves lasted. */ diff --git a/core/src/io/anuke/mindustry/graphics/BlockRenderer.java b/core/src/io/anuke/mindustry/graphics/BlockRenderer.java index 1e7fa36982..8912745633 100644 --- a/core/src/io/anuke/mindustry/graphics/BlockRenderer.java +++ b/core/src/io/anuke/mindustry/graphics/BlockRenderer.java @@ -138,7 +138,7 @@ public class BlockRenderer implements Disposable{ 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.53f * brokenFade); + Draw.alpha(0.33f * brokenFade); Draw.mixcol(Color.white, 0.2f + Mathf.absin(Time.globalTime(), 6f, 0.2f)); Draw.rect(b.icon(Cicon.full), block.x * tilesize + b.offset(), block.y * tilesize + b.offset(), b.rotate ? block.rotation * 90 : 0f); } diff --git a/core/src/io/anuke/mindustry/graphics/MultiPacker.java b/core/src/io/anuke/mindustry/graphics/MultiPacker.java new file mode 100644 index 0000000000..578aa677ba --- /dev/null +++ b/core/src/io/anuke/mindustry/graphics/MultiPacker.java @@ -0,0 +1,61 @@ +package io.anuke.mindustry.graphics; + +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.util.*; + +public class MultiPacker implements Disposable{ + private PixmapPacker[] packers = new PixmapPacker[PageType.all.length]; + + public MultiPacker(){ + for(int i = 0; i < packers.length; i++){ + int pageSize = 2048; + packers[i] = new PixmapPacker(pageSize, pageSize, Format.RGBA8888, 2, true); + } + } + + public boolean has(PageType type, String name){ + return packers[type.ordinal()].getRect(name) != null; + } + + public void add(PageType type, String name, PixmapRegion region){ + packers[type.ordinal()].pack(name, region); + } + + public void add(PageType type, String name, Pixmap pix){ + packers[type.ordinal()].pack(name, pix); + } + + public TextureAtlas flush(TextureFilter filter, TextureAtlas atlas){ + for(PixmapPacker p : packers){ + p.updateTextureAtlas(atlas, filter, filter, false, false); + } + return atlas; + } + + @Override + public void dispose(){ + for(PixmapPacker packer : packers){ + packer.dispose(); + } + } + + + //There are several pages for sprites. + //main page (sprites.png) - all sprites for units, weapons, placeable blocks, effects, bullets, etc + //environment page (sprites2.png) - all sprites for things in the environmental cache layer + //editor page (sprites3.png) - all sprites needed for rendering in the editor, including block icons and a few minor sprites + //zone page (sprites4.png) - zone previews + //ui page (sprites5.png) - content icons, white icons and UI elements + public enum PageType{ + main, + environment, + editor, + zone, + ui; + + public static final PageType[] all = values(); + } +} diff --git a/core/src/io/anuke/mindustry/graphics/OverlayRenderer.java b/core/src/io/anuke/mindustry/graphics/OverlayRenderer.java index a3884d6ba8..d33d310b88 100644 --- a/core/src/io/anuke/mindustry/graphics/OverlayRenderer.java +++ b/core/src/io/anuke/mindustry/graphics/OverlayRenderer.java @@ -157,5 +157,4 @@ public class OverlayRenderer{ } } } - } diff --git a/core/src/io/anuke/mindustry/input/Binding.java b/core/src/io/anuke/mindustry/input/Binding.java index 45383cb6ef..3ac5f68271 100644 --- a/core/src/io/anuke/mindustry/input/Binding.java +++ b/core/src/io/anuke/mindustry/input/Binding.java @@ -54,6 +54,7 @@ public enum Binding implements KeyBind{ chat_history_prev(KeyCode.UP), chat_history_next(KeyCode.DOWN), chat_scroll(new Axis(KeyCode.SCROLL)), + console(KeyCode.F8), ; private final KeybindValue defaultValue; diff --git a/core/src/io/anuke/mindustry/input/DesktopInput.java b/core/src/io/anuke/mindustry/input/DesktopInput.java index 7b015600ce..e8cc6793d8 100644 --- a/core/src/io/anuke/mindustry/input/DesktopInput.java +++ b/core/src/io/anuke/mindustry/input/DesktopInput.java @@ -122,7 +122,7 @@ public class DesktopInput extends InputHandler{ drawSelected(sreq.x, sreq.y, sreq.block, getRequest(sreq.x, sreq.y, sreq.block.size, sreq) != null ? Pal.remove : Pal.accent); } - if(Core.input.keyDown(Binding.schematic_select) && !ui.chatfrag.chatOpen()){ + if(Core.input.keyDown(Binding.schematic_select) && !Core.scene.hasKeyboard()){ drawSelection(schemX, schemY, cursorX, cursorY, Vars.maxSchematicSize); } @@ -139,7 +139,7 @@ public class DesktopInput extends InputHandler{ player.isShooting = false; } - if(!state.is(State.menu) && Core.input.keyTap(Binding.minimap) && (scene.getKeyboardFocus() == ui.minimap || !scene.hasDialog()) && !ui.chatfrag.chatOpen() && !(scene.getKeyboardFocus() instanceof TextField)){ + if(!state.is(State.menu) && Core.input.keyTap(Binding.minimap) && (scene.getKeyboardFocus() == ui.minimap || !scene.hasDialog()) && !Core.scene.hasKeyboard() && !(scene.getKeyboardFocus() instanceof TextField)){ if(!ui.minimap.isShown()){ ui.minimap.show(); }else{ @@ -293,12 +293,12 @@ public class DesktopInput extends InputHandler{ player.clearBuilding(); } - if(Core.input.keyTap(Binding.schematic_select) && !ui.chatfrag.chatOpen()){ + if(Core.input.keyTap(Binding.schematic_select) && !Core.scene.hasKeyboard()){ schemX = rawCursorX; schemY = rawCursorY; } - if(Core.input.keyTap(Binding.schematic_menu) && !ui.chatfrag.chatOpen()){ + if(Core.input.keyTap(Binding.schematic_menu) && !Core.scene.hasKeyboard()){ if(ui.schematics.isShown()){ ui.schematics.hide(); }else{ @@ -311,7 +311,7 @@ public class DesktopInput extends InputHandler{ selectRequests.clear(); } - if(Core.input.keyRelease(Binding.schematic_select) && !ui.chatfrag.chatOpen()){ + if(Core.input.keyRelease(Binding.schematic_select) && !Core.scene.hasKeyboard()){ lastSchematic = schematics.create(schemX, schemY, rawCursorX, rawCursorY); useSchematic(lastSchematic); if(selectRequests.isEmpty()){ @@ -371,10 +371,10 @@ public class DesktopInput extends InputHandler{ }else if(selected != null){ //only begin shooting if there's no cursor event if(!tileTapped(selected) && !tryTapPlayer(Core.input.mouseWorld().x, Core.input.mouseWorld().y) && (player.buildQueue().size == 0 || !player.isBuilding) && !droppingItem && - !tryBeginMine(selected) && player.getMineTile() == null && !ui.chatfrag.chatOpen()){ + !tryBeginMine(selected) && player.getMineTile() == null && !Core.scene.hasKeyboard()){ player.isShooting = true; } - }else if(!ui.chatfrag.chatOpen()){ //if it's out of bounds, shooting is just fine + }else if(!Core.scene.hasKeyboard()){ //if it's out of bounds, shooting is just fine player.isShooting = true; } }else if(Core.input.keyTap(Binding.deselect) && block != null){ diff --git a/core/src/io/anuke/mindustry/input/InputHandler.java b/core/src/io/anuke/mindustry/input/InputHandler.java index f95f7a2b04..c2ff9db807 100644 --- a/core/src/io/anuke/mindustry/input/InputHandler.java +++ b/core/src/io/anuke/mindustry/input/InputHandler.java @@ -221,7 +221,7 @@ public abstract class InputHandler implements InputProcessor, GestureListener{ public boolean requestMatches(BuildRequest request){ Tile tile = world.tile(request.x, request.y); - return tile != null && tile.block() instanceof BuildBlock && tile.entity().cblock == request.block; + return tile != null && tile.block() instanceof BuildBlock && tile.ent().cblock == request.block; } public void drawBreaking(int x, int y){ diff --git a/core/src/io/anuke/mindustry/input/PlaceMode.java b/core/src/io/anuke/mindustry/input/PlaceMode.java index 5ac66c5220..cb287caed6 100644 --- a/core/src/io/anuke/mindustry/input/PlaceMode.java +++ b/core/src/io/anuke/mindustry/input/PlaceMode.java @@ -1,5 +1,5 @@ package io.anuke.mindustry.input; -enum PlaceMode{ +public enum PlaceMode{ none, breaking, placing, schematicSelect } diff --git a/core/src/io/anuke/mindustry/io/JsonIO.java b/core/src/io/anuke/mindustry/io/JsonIO.java index 1edc718c6a..3635c25bc0 100644 --- a/core/src/io/anuke/mindustry/io/JsonIO.java +++ b/core/src/io/anuke/mindustry/io/JsonIO.java @@ -29,6 +29,14 @@ public class JsonIO{ super.writeValue(value, knownType, elementType); } } + + @Override + protected String convertToString(Object object){ + if(object instanceof MappableContent){ + return ((MappableContent)object).name; + } + return super.convertToString(object); + } }; public static Json json(){ diff --git a/core/src/io/anuke/mindustry/io/versions/LegacyTypeTable.java b/core/src/io/anuke/mindustry/io/versions/LegacyTypeTable.java index 419d91e7ed..6e04863262 100644 --- a/core/src/io/anuke/mindustry/io/versions/LegacyTypeTable.java +++ b/core/src/io/anuke/mindustry/io/versions/LegacyTypeTable.java @@ -12,6 +12,60 @@ Latest data: [build 81] 0 = Player 1 = Fire 2 = Puddle +3 = MinerDrone +4 = RepairDrone +5 = BuilderDrone +6 = GroundUnit +7 = GroundUnit +8 = GroundUnit +9 = GroundUnit +10 = GroundUnit +11 = FlyingUnit +12 = FlyingUnit +13 = Revenant + +Before removal of lightining/bullet: [build 80] + +0 = Player +1 = Fire +2 = Puddle +3 = Bullet +4 = Lightning +5 = MinerDrone +6 = RepairDrone +7 = BuilderDrone +8 = GroundUnit +9 = GroundUnit +10 = GroundUnit +11 = GroundUnit +12 = GroundUnit +13 = FlyingUnit +14 = FlyingUnit +15 = Revenant + +Before addition of new units: [build 79 and below] + +0 = Player +1 = Fire +2 = Puddle +3 = Bullet +4 = Lightning +5 = RepairDrone +6 = GroundUnit +7 = GroundUnit +8 = GroundUnit +9 = GroundUnit +10 = GroundUnit +11 = FlyingUnit +12 = FlyingUnit +13 = BuilderDrone +14 = Revenant + */ +public class LegacyTypeTable{ + /* + 0 = Player +1 = Fire +2 = Puddle 3 = Draug 4 = Spirit 5 = Phantom @@ -23,97 +77,59 @@ Latest data: [build 81] 11 = Wraith 12 = Ghoul 13 = Revenant - -Before removal of lightining/bullet: [build 80] - -0 = Player -1 = Fire -2 = Puddle -3 = Bullet -4 = Lightning -5 = Draug -6 = Spirit -7 = Phantom -8 = Dagger -9 = Crawler -10 = Titan -11 = Fortress -12 = Eruptor -13 = Wraith -14 = Ghoul -15 = Revenant - -Before addition of new units: [build 79 and below] - -0 = Player -1 = Fire -2 = Puddle -3 = Bullet -4 = Lightning -5 = Spirit -6 = Dagger -7 = Crawler -8 = Titan -9 = Fortress -10 = Eruptor -11 = Wraith -12 = Ghoul -13 = Phantom -14 = Revenant - */ -public class LegacyTypeTable{ + */ private static final Prov[] build81Table = { Player::new, Fire::new, Puddle::new, - Draug::new, - Spirit::new, - Phantom::new, - Dagger::new, - Crawler::new, - Titan::new, - Fortress::new, - Eruptor::new, - Wraith::new, - Ghoul::new, - Revenant::new + MinerDrone::new, + RepairDrone::new, + BuilderDrone::new, + GroundUnit::new, + GroundUnit::new, + GroundUnit::new, + GroundUnit::new, + GroundUnit::new, + FlyingUnit::new, + FlyingUnit::new, + HoverUnit::new }; private static final Prov[] build80Table = { Player::new, Fire::new, Puddle::new, - Bullet::new, //TODO reading these may crash + Bullet::new, Lightning::new, - Draug::new, - Spirit::new, - Phantom::new, - Dagger::new, - Crawler::new, - Titan::new, - Fortress::new, - Eruptor::new, - Wraith::new, - Ghoul::new, - Revenant::new + MinerDrone::new, + RepairDrone::new, + BuilderDrone::new, + GroundUnit::new, + GroundUnit::new, + GroundUnit::new, + GroundUnit::new, + GroundUnit::new, + FlyingUnit::new, + FlyingUnit::new, + HoverUnit::new }; private static final Prov[] build79Table = { Player::new, Fire::new, Puddle::new, - Bullet::new, //TODO reading these may crash + Bullet::new, Lightning::new, - Spirit::new, - Dagger::new, - Crawler::new, - Titan::new, - Fortress::new, - Eruptor::new, - Wraith::new, - Ghoul::new, - Phantom::new, - Revenant::new + RepairDrone::new, + GroundUnit::new, + GroundUnit::new, + GroundUnit::new, + GroundUnit::new, + GroundUnit::new, + FlyingUnit::new, + FlyingUnit::new, + BuilderDrone::new, + HoverUnit::new }; public static Prov[] getTable(int build){ diff --git a/core/src/io/anuke/mindustry/maps/Map.java b/core/src/io/anuke/mindustry/maps/Map.java index 4fb42f0a33..3bd66784c4 100644 --- a/core/src/io/anuke/mindustry/maps/Map.java +++ b/core/src/io/anuke/mindustry/maps/Map.java @@ -5,11 +5,13 @@ import io.anuke.arc.collection.*; import io.anuke.arc.files.*; import io.anuke.arc.graphics.*; import io.anuke.arc.util.*; +import io.anuke.arc.util.ArcAnnotate.*; import io.anuke.mindustry.*; import io.anuke.mindustry.game.EventType.*; import io.anuke.mindustry.game.*; import io.anuke.mindustry.io.*; import io.anuke.mindustry.maps.filters.*; +import io.anuke.mindustry.mod.Mods.*; import io.anuke.mindustry.type.*; import static io.anuke.mindustry.Vars.*; @@ -35,6 +37,8 @@ public class Map implements Comparable, Publishable{ public IntSet teams = new IntSet(); /** Number of enemy spawns on this map.*/ public int spawns = 0; + /** Associated mod. If null, no mod is associated. */ + public @Nullable LoadedMod mod; public Map(FileHandle file, int width, int height, StringMap tags, boolean custom, int version, int build){ this.custom = custom; diff --git a/core/src/io/anuke/mindustry/maps/Maps.java b/core/src/io/anuke/mindustry/maps/Maps.java index 077cd71f1a..d54555ddd0 100644 --- a/core/src/io/anuke/mindustry/maps/Maps.java +++ b/core/src/io/anuke/mindustry/maps/Maps.java @@ -84,6 +84,17 @@ public class Maps{ maps.sort(); }); + Events.on(ContentReloadEvent.class, event -> { + reload(); + for(Map map : maps){ + try{ + map.texture = map.previewFile().exists() ? new Texture(map.previewFile()) : new Texture(MapIO.generatePreview(map)); + }catch(Exception e){ + e.printStackTrace(); + } + } + }); + if(Core.assets != null){ ((CustomLoader)Core.assets.getLoader(Content.class)).loaded = this::createAllPreviews; } @@ -138,6 +149,17 @@ public class Maps{ Log.err(e); } } + + //mod + mods.listFiles("maps", (mod, file) -> { + try{ + Map map = loadMap(file, false); + map.mod = mod; + }catch(Exception e){ + Log.err("Failed to load mod map file '{0}'!", file); + Log.err(e); + } + }); } public void reload(){ @@ -457,7 +479,7 @@ public class Maps{ return maps.find(m -> m != prev || maps.size == 1); }), custom(prev -> { - Array maps = Array.withArrays(Vars.maps.customMaps()); + Array maps = Array.withArrays(Vars.maps.customMaps().isEmpty() ? Vars.maps.defaultMaps() : Vars.maps.customMaps()); maps.shuffle(); return maps.find(m -> m != prev || maps.size == 1); }), diff --git a/core/src/io/anuke/mindustry/mod/ClassAccess.java b/core/src/io/anuke/mindustry/mod/ClassAccess.java new file mode 100644 index 0000000000..d126af792c --- /dev/null +++ b/core/src/io/anuke/mindustry/mod/ClassAccess.java @@ -0,0 +1,7 @@ +package io.anuke.mindustry.mod; + +import io.anuke.arc.collection.*; +//obviously autogenerated, do not touch +public class ClassAccess{ + public static final ObjectSet allowedClassNames = ObjectSet.with("io.anuke.arc.Core", "io.anuke.arc.collection.Array", "io.anuke.arc.collection.Array$ArrayIterable", "io.anuke.arc.collection.ArrayMap", "io.anuke.arc.collection.ArrayMap$Entries", "io.anuke.arc.collection.ArrayMap$Keys", "io.anuke.arc.collection.ArrayMap$Values", "io.anuke.arc.collection.AtomicQueue", "io.anuke.arc.collection.BinaryHeap", "io.anuke.arc.collection.BinaryHeap$Node", "io.anuke.arc.collection.Bits", "io.anuke.arc.collection.BooleanArray", "io.anuke.arc.collection.ByteArray", "io.anuke.arc.collection.CharArray", "io.anuke.arc.collection.ComparableTimSort", "io.anuke.arc.collection.DelayedRemovalArray", "io.anuke.arc.collection.EnumSet", "io.anuke.arc.collection.EnumSet$EnumSetIterator", "io.anuke.arc.collection.FloatArray", "io.anuke.arc.collection.GridBits", "io.anuke.arc.collection.GridMap", "io.anuke.arc.collection.IdentityMap", "io.anuke.arc.collection.IdentityMap$Entries", "io.anuke.arc.collection.IdentityMap$Entry", "io.anuke.arc.collection.IdentityMap$Keys", "io.anuke.arc.collection.IdentityMap$Values", "io.anuke.arc.collection.IntArray", "io.anuke.arc.collection.IntFloatMap", "io.anuke.arc.collection.IntFloatMap$Entries", "io.anuke.arc.collection.IntFloatMap$Entry", "io.anuke.arc.collection.IntFloatMap$Keys", "io.anuke.arc.collection.IntFloatMap$Values", "io.anuke.arc.collection.IntIntMap", "io.anuke.arc.collection.IntIntMap$Entries", "io.anuke.arc.collection.IntIntMap$Entry", "io.anuke.arc.collection.IntIntMap$Keys", "io.anuke.arc.collection.IntIntMap$Values", "io.anuke.arc.collection.IntMap", "io.anuke.arc.collection.IntMap$Entries", "io.anuke.arc.collection.IntMap$Entry", "io.anuke.arc.collection.IntMap$Keys", "io.anuke.arc.collection.IntMap$Values", "io.anuke.arc.collection.IntQueue", "io.anuke.arc.collection.IntSet", "io.anuke.arc.collection.IntSet$IntSetIterator", "io.anuke.arc.collection.LongArray", "io.anuke.arc.collection.LongMap", "io.anuke.arc.collection.LongMap$Entries", "io.anuke.arc.collection.LongMap$Entry", "io.anuke.arc.collection.LongMap$Keys", "io.anuke.arc.collection.LongMap$Values", "io.anuke.arc.collection.LongQueue", "io.anuke.arc.collection.ObjectFloatMap", "io.anuke.arc.collection.ObjectFloatMap$Entries", "io.anuke.arc.collection.ObjectFloatMap$Entry", "io.anuke.arc.collection.ObjectFloatMap$Keys", "io.anuke.arc.collection.ObjectFloatMap$Values", "io.anuke.arc.collection.ObjectIntMap", "io.anuke.arc.collection.ObjectIntMap$Entries", "io.anuke.arc.collection.ObjectIntMap$Entry", "io.anuke.arc.collection.ObjectIntMap$Keys", "io.anuke.arc.collection.ObjectIntMap$Values", "io.anuke.arc.collection.ObjectMap", "io.anuke.arc.collection.ObjectMap$Entries", "io.anuke.arc.collection.ObjectMap$Entry", "io.anuke.arc.collection.ObjectMap$Keys", "io.anuke.arc.collection.ObjectMap$Values", "io.anuke.arc.collection.ObjectSet", "io.anuke.arc.collection.ObjectSet$ObjectSetIterator", "io.anuke.arc.collection.OrderedMap", "io.anuke.arc.collection.OrderedMap$OrderedMapEntries", "io.anuke.arc.collection.OrderedMap$OrderedMapKeys", "io.anuke.arc.collection.OrderedMap$OrderedMapValues", "io.anuke.arc.collection.OrderedSet", "io.anuke.arc.collection.OrderedSet$OrderedSetIterator", "io.anuke.arc.collection.PooledLinkedList", "io.anuke.arc.collection.PooledLinkedList$Item", "io.anuke.arc.collection.Queue", "io.anuke.arc.collection.Queue$QueueIterable", "io.anuke.arc.collection.ShortArray", "io.anuke.arc.collection.SnapshotArray", "io.anuke.arc.collection.Sort", "io.anuke.arc.collection.SortedIntList", "io.anuke.arc.collection.SortedIntList$Iterator", "io.anuke.arc.collection.SortedIntList$Node", "io.anuke.arc.collection.StringMap", "io.anuke.arc.collection.TimSort", "io.anuke.arc.func.Boolc", "io.anuke.arc.func.Boolf", "io.anuke.arc.func.Boolf2", "io.anuke.arc.func.Boolp", "io.anuke.arc.func.Cons", "io.anuke.arc.func.Cons2", "io.anuke.arc.func.Floatc", "io.anuke.arc.func.Floatc2", "io.anuke.arc.func.Floatc4", "io.anuke.arc.func.Floatf", "io.anuke.arc.func.Floatp", "io.anuke.arc.func.Func", "io.anuke.arc.func.Func2", "io.anuke.arc.func.Func3", "io.anuke.arc.func.Intc", "io.anuke.arc.func.Intc2", "io.anuke.arc.func.Intc4", "io.anuke.arc.func.Intf", "io.anuke.arc.func.Intp", "io.anuke.arc.func.Prov", "io.anuke.arc.graphics.Color", "io.anuke.arc.graphics.g2d.Draw", "io.anuke.arc.graphics.g2d.Fill", "io.anuke.arc.graphics.g2d.Lines", "io.anuke.arc.graphics.g2d.TextureAtlas", "io.anuke.arc.graphics.g2d.TextureAtlas$AtlasRegion", "io.anuke.arc.graphics.g2d.TextureRegion", "io.anuke.arc.math.Angles", "io.anuke.arc.math.Mathf", "io.anuke.arc.scene.Action", "io.anuke.arc.scene.Element", "io.anuke.arc.scene.Group", "io.anuke.arc.scene.Scene", "io.anuke.arc.scene.Scene$TouchFocus", "io.anuke.arc.scene.actions.Actions", "io.anuke.arc.scene.actions.AddAction", "io.anuke.arc.scene.actions.AddListenerAction", "io.anuke.arc.scene.actions.AfterAction", "io.anuke.arc.scene.actions.AlphaAction", "io.anuke.arc.scene.actions.ColorAction", "io.anuke.arc.scene.actions.DelayAction", "io.anuke.arc.scene.actions.DelegateAction", "io.anuke.arc.scene.actions.FloatAction", "io.anuke.arc.scene.actions.IntAction", "io.anuke.arc.scene.actions.LayoutAction", "io.anuke.arc.scene.actions.MoveByAction", "io.anuke.arc.scene.actions.MoveToAction", "io.anuke.arc.scene.actions.OriginAction", "io.anuke.arc.scene.actions.ParallelAction", "io.anuke.arc.scene.actions.RelativeTemporalAction", "io.anuke.arc.scene.actions.RemoveAction", "io.anuke.arc.scene.actions.RemoveActorAction", "io.anuke.arc.scene.actions.RemoveListenerAction", "io.anuke.arc.scene.actions.RepeatAction", "io.anuke.arc.scene.actions.RotateByAction", "io.anuke.arc.scene.actions.RotateToAction", "io.anuke.arc.scene.actions.RunnableAction", "io.anuke.arc.scene.actions.ScaleByAction", "io.anuke.arc.scene.actions.ScaleToAction", "io.anuke.arc.scene.actions.SequenceAction", "io.anuke.arc.scene.actions.SizeByAction", "io.anuke.arc.scene.actions.SizeToAction", "io.anuke.arc.scene.actions.TemporalAction", "io.anuke.arc.scene.actions.TimeScaleAction", "io.anuke.arc.scene.actions.TouchableAction", "io.anuke.arc.scene.actions.TranslateByAction", "io.anuke.arc.scene.actions.VisibleAction", "io.anuke.arc.scene.event.ChangeListener", "io.anuke.arc.scene.event.ChangeListener$ChangeEvent", "io.anuke.arc.scene.event.ClickListener", "io.anuke.arc.scene.event.DragListener", "io.anuke.arc.scene.event.DragScrollListener", "io.anuke.arc.scene.event.ElementGestureListener", "io.anuke.arc.scene.event.EventListener", "io.anuke.arc.scene.event.FocusListener", "io.anuke.arc.scene.event.FocusListener$FocusEvent", "io.anuke.arc.scene.event.FocusListener$FocusEvent$Type", "io.anuke.arc.scene.event.HandCursorListener", "io.anuke.arc.scene.event.IbeamCursorListener", "io.anuke.arc.scene.event.InputEvent", "io.anuke.arc.scene.event.InputEvent$Type", "io.anuke.arc.scene.event.InputListener", "io.anuke.arc.scene.event.SceneEvent", "io.anuke.arc.scene.event.Touchable", "io.anuke.arc.scene.event.VisibilityEvent", "io.anuke.arc.scene.event.VisibilityListener", "io.anuke.arc.scene.style.BaseDrawable", "io.anuke.arc.scene.style.Drawable", "io.anuke.arc.scene.style.NinePatchDrawable", "io.anuke.arc.scene.style.ScaledNinePatchDrawable", "io.anuke.arc.scene.style.Style", "io.anuke.arc.scene.style.TextureRegionDrawable", "io.anuke.arc.scene.style.TiledDrawable", "io.anuke.arc.scene.style.TransformDrawable", "io.anuke.arc.scene.ui.Button", "io.anuke.arc.scene.ui.Button$ButtonStyle", "io.anuke.arc.scene.ui.ButtonGroup", "io.anuke.arc.scene.ui.CheckBox", "io.anuke.arc.scene.ui.CheckBox$CheckBoxStyle", "io.anuke.arc.scene.ui.ColorImage", "io.anuke.arc.scene.ui.Dialog", "io.anuke.arc.scene.ui.Dialog$DialogStyle", "io.anuke.arc.scene.ui.Image", "io.anuke.arc.scene.ui.ImageButton", "io.anuke.arc.scene.ui.ImageButton$ImageButtonStyle", "io.anuke.arc.scene.ui.KeybindDialog", "io.anuke.arc.scene.ui.KeybindDialog$KeybindDialogStyle", "io.anuke.arc.scene.ui.Label", "io.anuke.arc.scene.ui.Label$LabelStyle", "io.anuke.arc.scene.ui.ProgressBar", "io.anuke.arc.scene.ui.ProgressBar$ProgressBarStyle", "io.anuke.arc.scene.ui.ScrollPane", "io.anuke.arc.scene.ui.ScrollPane$ScrollPaneStyle", "io.anuke.arc.scene.ui.SettingsDialog", "io.anuke.arc.scene.ui.SettingsDialog$SettingsTable", "io.anuke.arc.scene.ui.SettingsDialog$SettingsTable$CheckSetting", "io.anuke.arc.scene.ui.SettingsDialog$SettingsTable$Setting", "io.anuke.arc.scene.ui.SettingsDialog$SettingsTable$SliderSetting", "io.anuke.arc.scene.ui.SettingsDialog$StringProcessor", "io.anuke.arc.scene.ui.Slider", "io.anuke.arc.scene.ui.Slider$SliderStyle", "io.anuke.arc.scene.ui.TextArea", "io.anuke.arc.scene.ui.TextArea$TextAreaListener", "io.anuke.arc.scene.ui.TextButton", "io.anuke.arc.scene.ui.TextButton$TextButtonStyle", "io.anuke.arc.scene.ui.TextField", "io.anuke.arc.scene.ui.TextField$DefaultOnscreenKeyboard", "io.anuke.arc.scene.ui.TextField$OnscreenKeyboard", "io.anuke.arc.scene.ui.TextField$TextFieldClickListener", "io.anuke.arc.scene.ui.TextField$TextFieldFilter", "io.anuke.arc.scene.ui.TextField$TextFieldListener", "io.anuke.arc.scene.ui.TextField$TextFieldStyle", "io.anuke.arc.scene.ui.TextField$TextFieldValidator", "io.anuke.arc.scene.ui.Tooltip", "io.anuke.arc.scene.ui.Tooltip$Tooltips", "io.anuke.arc.scene.ui.Touchpad", "io.anuke.arc.scene.ui.Touchpad$TouchpadStyle", "io.anuke.arc.scene.ui.TreeElement", "io.anuke.arc.scene.ui.TreeElement$Node", "io.anuke.arc.scene.ui.TreeElement$TreeStyle", "io.anuke.arc.scene.ui.layout.Cell", "io.anuke.arc.scene.ui.layout.Collapser", "io.anuke.arc.scene.ui.layout.HorizontalGroup", "io.anuke.arc.scene.ui.layout.Scl", "io.anuke.arc.scene.ui.layout.Stack", "io.anuke.arc.scene.ui.layout.Table", "io.anuke.arc.scene.ui.layout.Table$DrawRect", "io.anuke.arc.scene.ui.layout.VerticalGroup", "io.anuke.arc.scene.ui.layout.WidgetGroup", "io.anuke.arc.scene.utils.ArraySelection", "io.anuke.arc.scene.utils.Cullable", "io.anuke.arc.scene.utils.Disableable", "io.anuke.arc.scene.utils.DragAndDrop", "io.anuke.arc.scene.utils.DragAndDrop$Payload", "io.anuke.arc.scene.utils.DragAndDrop$Source", "io.anuke.arc.scene.utils.DragAndDrop$Target", "io.anuke.arc.scene.utils.Elements", "io.anuke.arc.scene.utils.Layout", "io.anuke.arc.scene.utils.Selection", "io.anuke.arc.util.Time", "io.anuke.mindustry.Vars", "io.anuke.mindustry.ai.BlockIndexer", "io.anuke.mindustry.ai.Pathfinder", "io.anuke.mindustry.ai.Pathfinder$PathData", "io.anuke.mindustry.ai.Pathfinder$PathTarget", "io.anuke.mindustry.ai.Pathfinder$PathTileStruct", "io.anuke.mindustry.ai.WaveSpawner", "io.anuke.mindustry.content.Blocks", "io.anuke.mindustry.content.Bullets", "io.anuke.mindustry.content.Fx", "io.anuke.mindustry.content.Items", "io.anuke.mindustry.content.Liquids", "io.anuke.mindustry.content.Loadouts", "io.anuke.mindustry.content.Mechs", "io.anuke.mindustry.content.StatusEffects", "io.anuke.mindustry.content.TechTree", "io.anuke.mindustry.content.TechTree$TechNode", "io.anuke.mindustry.content.TypeIDs", "io.anuke.mindustry.content.UnitTypes", "io.anuke.mindustry.content.Zones", "io.anuke.mindustry.core.ContentLoader", "io.anuke.mindustry.core.Control", "io.anuke.mindustry.core.FileTree", "io.anuke.mindustry.core.GameState", "io.anuke.mindustry.core.GameState$State", "io.anuke.mindustry.core.Logic", "io.anuke.mindustry.core.Platform", "io.anuke.mindustry.core.Renderer", "io.anuke.mindustry.core.UI", "io.anuke.mindustry.core.Version", "io.anuke.mindustry.core.World", "io.anuke.mindustry.core.World$Raycaster", "io.anuke.mindustry.ctype.Content", "io.anuke.mindustry.ctype.ContentList", "io.anuke.mindustry.ctype.MappableContent", "io.anuke.mindustry.ctype.UnlockableContent", "io.anuke.mindustry.editor.DrawOperation", "io.anuke.mindustry.editor.DrawOperation$OpType", "io.anuke.mindustry.editor.DrawOperation$TileOpStruct", "io.anuke.mindustry.editor.EditorTile", "io.anuke.mindustry.editor.EditorTool", "io.anuke.mindustry.editor.MapEditor", "io.anuke.mindustry.editor.MapEditor$Context", "io.anuke.mindustry.editor.MapEditorDialog", "io.anuke.mindustry.editor.MapGenerateDialog", "io.anuke.mindustry.editor.MapInfoDialog", "io.anuke.mindustry.editor.MapLoadDialog", "io.anuke.mindustry.editor.MapRenderer", "io.anuke.mindustry.editor.MapResizeDialog", "io.anuke.mindustry.editor.MapSaveDialog", "io.anuke.mindustry.editor.MapView", "io.anuke.mindustry.editor.OperationStack", "io.anuke.mindustry.editor.WaveInfoDialog", "io.anuke.mindustry.entities.Damage", "io.anuke.mindustry.entities.Damage$PropCellStruct", "io.anuke.mindustry.entities.Effects", "io.anuke.mindustry.entities.Effects$Effect", "io.anuke.mindustry.entities.Effects$EffectContainer", "io.anuke.mindustry.entities.Effects$EffectProvider", "io.anuke.mindustry.entities.Effects$EffectRenderer", "io.anuke.mindustry.entities.Effects$ScreenshakeProvider", "io.anuke.mindustry.entities.Entities", "io.anuke.mindustry.entities.EntityCollisions", "io.anuke.mindustry.entities.EntityGroup", "io.anuke.mindustry.entities.Predict", "io.anuke.mindustry.entities.TargetPriority", "io.anuke.mindustry.entities.Units", "io.anuke.mindustry.entities.bullet.ArtilleryBulletType", "io.anuke.mindustry.entities.bullet.BasicBulletType", "io.anuke.mindustry.entities.bullet.BombBulletType", "io.anuke.mindustry.entities.bullet.BulletType", "io.anuke.mindustry.entities.bullet.FlakBulletType", "io.anuke.mindustry.entities.bullet.HealBulletType", "io.anuke.mindustry.entities.bullet.LiquidBulletType", "io.anuke.mindustry.entities.bullet.MassDriverBolt", "io.anuke.mindustry.entities.bullet.MissileBulletType", "io.anuke.mindustry.entities.effect.Decal", "io.anuke.mindustry.entities.effect.Fire", "io.anuke.mindustry.entities.effect.GroundEffectEntity", "io.anuke.mindustry.entities.effect.GroundEffectEntity$GroundEffect", "io.anuke.mindustry.entities.effect.ItemTransfer", "io.anuke.mindustry.entities.effect.Lightning", "io.anuke.mindustry.entities.effect.Puddle", "io.anuke.mindustry.entities.effect.RubbleDecal", "io.anuke.mindustry.entities.effect.ScorchDecal", "io.anuke.mindustry.entities.traits.AbsorbTrait", "io.anuke.mindustry.entities.traits.BelowLiquidTrait", "io.anuke.mindustry.entities.traits.BuilderMinerTrait", "io.anuke.mindustry.entities.traits.BuilderTrait", "io.anuke.mindustry.entities.traits.BuilderTrait$BuildDataStatic", "io.anuke.mindustry.entities.traits.BuilderTrait$BuildRequest", "io.anuke.mindustry.entities.traits.DamageTrait", "io.anuke.mindustry.entities.traits.DrawTrait", "io.anuke.mindustry.entities.traits.Entity", "io.anuke.mindustry.entities.traits.HealthTrait", "io.anuke.mindustry.entities.traits.KillerTrait", "io.anuke.mindustry.entities.traits.MinerTrait", "io.anuke.mindustry.entities.traits.MoveTrait", "io.anuke.mindustry.entities.traits.SaveTrait", "io.anuke.mindustry.entities.traits.Saveable", "io.anuke.mindustry.entities.traits.ScaleTrait", "io.anuke.mindustry.entities.traits.ShooterTrait", "io.anuke.mindustry.entities.traits.SolidTrait", "io.anuke.mindustry.entities.traits.SpawnerTrait", "io.anuke.mindustry.entities.traits.SyncTrait", "io.anuke.mindustry.entities.traits.TargetTrait", "io.anuke.mindustry.entities.traits.TeamTrait", "io.anuke.mindustry.entities.traits.TimeTrait", "io.anuke.mindustry.entities.traits.TypeTrait", "io.anuke.mindustry.entities.traits.VelocityTrait", "io.anuke.mindustry.entities.type.BaseEntity", "io.anuke.mindustry.entities.type.BaseUnit", "io.anuke.mindustry.entities.type.Bullet", "io.anuke.mindustry.entities.type.DestructibleEntity", "io.anuke.mindustry.entities.type.EffectEntity", "io.anuke.mindustry.entities.type.Player", "io.anuke.mindustry.entities.type.SolidEntity", "io.anuke.mindustry.entities.type.TileEntity", "io.anuke.mindustry.entities.type.TimedEntity", "io.anuke.mindustry.entities.type.Unit", "io.anuke.mindustry.entities.type.base.BaseDrone", "io.anuke.mindustry.entities.type.base.BuilderDrone", "io.anuke.mindustry.entities.type.base.Crawler", "io.anuke.mindustry.entities.type.base.Dagger", "io.anuke.mindustry.entities.type.base.Draug", "io.anuke.mindustry.entities.type.base.Eruptor", "io.anuke.mindustry.entities.type.base.FlyingUnit", "io.anuke.mindustry.entities.type.base.Fortress", "io.anuke.mindustry.entities.type.base.Ghoul", "io.anuke.mindustry.entities.type.base.GroundUnit", "io.anuke.mindustry.entities.type.base.MinerDrone", "io.anuke.mindustry.entities.type.base.Phantom", "io.anuke.mindustry.entities.type.base.RepairDrone", "io.anuke.mindustry.entities.type.base.Revenant", "io.anuke.mindustry.entities.type.base.Spirit", "io.anuke.mindustry.entities.type.base.Titan", "io.anuke.mindustry.entities.type.base.Wraith", "io.anuke.mindustry.entities.units.StateMachine", "io.anuke.mindustry.entities.units.Statuses", "io.anuke.mindustry.entities.units.Statuses$StatusEntry", "io.anuke.mindustry.entities.units.UnitCommand", "io.anuke.mindustry.entities.units.UnitDrops", "io.anuke.mindustry.entities.units.UnitState", "io.anuke.mindustry.game.DefaultWaves", "io.anuke.mindustry.game.Difficulty", "io.anuke.mindustry.game.EventType", "io.anuke.mindustry.game.EventType$BlockBuildBeginEvent", "io.anuke.mindustry.game.EventType$BlockBuildEndEvent", "io.anuke.mindustry.game.EventType$BlockDestroyEvent", "io.anuke.mindustry.game.EventType$BlockInfoEvent", "io.anuke.mindustry.game.EventType$BuildSelectEvent", "io.anuke.mindustry.game.EventType$ClientLoadEvent", "io.anuke.mindustry.game.EventType$CommandIssueEvent", "io.anuke.mindustry.game.EventType$ContentReloadEvent", "io.anuke.mindustry.game.EventType$CoreItemDeliverEvent", "io.anuke.mindustry.game.EventType$DepositEvent", "io.anuke.mindustry.game.EventType$DisposeEvent", "io.anuke.mindustry.game.EventType$GameOverEvent", "io.anuke.mindustry.game.EventType$LaunchEvent", "io.anuke.mindustry.game.EventType$LaunchItemEvent", "io.anuke.mindustry.game.EventType$LineConfirmEvent", "io.anuke.mindustry.game.EventType$LoseEvent", "io.anuke.mindustry.game.EventType$MapMakeEvent", "io.anuke.mindustry.game.EventType$MapPublishEvent", "io.anuke.mindustry.game.EventType$MechChangeEvent", "io.anuke.mindustry.game.EventType$PlayEvent", "io.anuke.mindustry.game.EventType$PlayerBanEvent", "io.anuke.mindustry.game.EventType$PlayerChatEvent", "io.anuke.mindustry.game.EventType$PlayerConnect", "io.anuke.mindustry.game.EventType$PlayerIpBanEvent", "io.anuke.mindustry.game.EventType$PlayerIpUnbanEvent", "io.anuke.mindustry.game.EventType$PlayerJoin", "io.anuke.mindustry.game.EventType$PlayerLeave", "io.anuke.mindustry.game.EventType$PlayerUnbanEvent", "io.anuke.mindustry.game.EventType$ResearchEvent", "io.anuke.mindustry.game.EventType$ResetEvent", "io.anuke.mindustry.game.EventType$ResizeEvent", "io.anuke.mindustry.game.EventType$StateChangeEvent", "io.anuke.mindustry.game.EventType$TapConfigEvent", "io.anuke.mindustry.game.EventType$TapEvent", "io.anuke.mindustry.game.EventType$TileChangeEvent", "io.anuke.mindustry.game.EventType$Trigger", "io.anuke.mindustry.game.EventType$TurretAmmoDeliverEvent", "io.anuke.mindustry.game.EventType$UnitCreateEvent", "io.anuke.mindustry.game.EventType$UnitDestroyEvent", "io.anuke.mindustry.game.EventType$UnlockEvent", "io.anuke.mindustry.game.EventType$WaveEvent", "io.anuke.mindustry.game.EventType$WinEvent", "io.anuke.mindustry.game.EventType$WithdrawEvent", "io.anuke.mindustry.game.EventType$WorldLoadEvent", "io.anuke.mindustry.game.EventType$ZoneConfigureCompleteEvent", "io.anuke.mindustry.game.EventType$ZoneRequireCompleteEvent", "io.anuke.mindustry.game.Gamemode", "io.anuke.mindustry.game.GlobalData", "io.anuke.mindustry.game.LoopControl", "io.anuke.mindustry.game.MusicControl", "io.anuke.mindustry.game.Objective", "io.anuke.mindustry.game.Objectives", "io.anuke.mindustry.game.Objectives$Launched", "io.anuke.mindustry.game.Objectives$Unlock", "io.anuke.mindustry.game.Objectives$Wave", "io.anuke.mindustry.game.Objectives$ZoneObjective", "io.anuke.mindustry.game.Objectives$ZoneWave", "io.anuke.mindustry.game.Rules", "io.anuke.mindustry.game.Saves", "io.anuke.mindustry.game.Saves$SaveSlot", "io.anuke.mindustry.game.Schematic", "io.anuke.mindustry.game.Schematic$Stile", "io.anuke.mindustry.game.Schematics", "io.anuke.mindustry.game.SoundLoop", "io.anuke.mindustry.game.SpawnGroup", "io.anuke.mindustry.game.Stats", "io.anuke.mindustry.game.Stats$Rank", "io.anuke.mindustry.game.Stats$RankResult", "io.anuke.mindustry.game.Team", "io.anuke.mindustry.game.Teams", "io.anuke.mindustry.game.Teams$BrokenBlock", "io.anuke.mindustry.game.Teams$TeamData", "io.anuke.mindustry.game.Tutorial", "io.anuke.mindustry.game.Tutorial$TutorialStage", "io.anuke.mindustry.gen.BufferItem", "io.anuke.mindustry.gen.Call", "io.anuke.mindustry.gen.Call", "io.anuke.mindustry.gen.Icon", "io.anuke.mindustry.gen.Icon", "io.anuke.mindustry.gen.MethodHash", "io.anuke.mindustry.gen.Musics", "io.anuke.mindustry.gen.Musics", "io.anuke.mindustry.gen.PathTile", "io.anuke.mindustry.gen.PropCell", "io.anuke.mindustry.gen.RemoteReadClient", "io.anuke.mindustry.gen.RemoteReadServer", "io.anuke.mindustry.gen.Serialization", "io.anuke.mindustry.gen.Sounds", "io.anuke.mindustry.gen.Sounds", "io.anuke.mindustry.gen.Tex", "io.anuke.mindustry.gen.Tex", "io.anuke.mindustry.gen.TileOp", "io.anuke.mindustry.graphics.BlockRenderer", "io.anuke.mindustry.graphics.Bloom", "io.anuke.mindustry.graphics.CacheLayer", "io.anuke.mindustry.graphics.Drawf", "io.anuke.mindustry.graphics.FloorRenderer", "io.anuke.mindustry.graphics.IndexedRenderer", "io.anuke.mindustry.graphics.Layer", "io.anuke.mindustry.graphics.LightRenderer", "io.anuke.mindustry.graphics.MenuRenderer", "io.anuke.mindustry.graphics.MinimapRenderer", "io.anuke.mindustry.graphics.MultiPacker", "io.anuke.mindustry.graphics.MultiPacker$PageType", "io.anuke.mindustry.graphics.OverlayRenderer", "io.anuke.mindustry.graphics.Pal", "io.anuke.mindustry.graphics.Pixelator", "io.anuke.mindustry.graphics.Shaders", "io.anuke.mindustry.input.Binding", "io.anuke.mindustry.input.DesktopInput", "io.anuke.mindustry.input.InputHandler", "io.anuke.mindustry.input.InputHandler$PlaceLine", "io.anuke.mindustry.input.MobileInput", "io.anuke.mindustry.input.PlaceMode", "io.anuke.mindustry.input.Placement", "io.anuke.mindustry.input.Placement$DistanceHeuristic", "io.anuke.mindustry.input.Placement$NormalizeDrawResult", "io.anuke.mindustry.input.Placement$NormalizeResult", "io.anuke.mindustry.input.Placement$TileHueristic", "io.anuke.mindustry.maps.Map", "io.anuke.mindustry.maps.Maps", "io.anuke.mindustry.maps.Maps$MapProvider", "io.anuke.mindustry.maps.Maps$ShuffleMode", "io.anuke.mindustry.maps.Maps$ShuffleMode", "io.anuke.mindustry.maps.filters.BlendFilter", "io.anuke.mindustry.maps.filters.ClearFilter", "io.anuke.mindustry.maps.filters.DistortFilter", "io.anuke.mindustry.maps.filters.FilterOption", "io.anuke.mindustry.maps.filters.FilterOption$BlockOption", "io.anuke.mindustry.maps.filters.FilterOption$SliderOption", "io.anuke.mindustry.maps.filters.GenerateFilter", "io.anuke.mindustry.maps.filters.GenerateFilter$GenerateInput", "io.anuke.mindustry.maps.filters.GenerateFilter$GenerateInput$TileProvider", "io.anuke.mindustry.maps.filters.MedianFilter", "io.anuke.mindustry.maps.filters.MirrorFilter", "io.anuke.mindustry.maps.filters.NoiseFilter", "io.anuke.mindustry.maps.filters.OreFilter", "io.anuke.mindustry.maps.filters.OreMedianFilter", "io.anuke.mindustry.maps.filters.RiverNoiseFilter", "io.anuke.mindustry.maps.filters.ScatterFilter", "io.anuke.mindustry.maps.filters.TerrainFilter", "io.anuke.mindustry.maps.generators.BasicGenerator", "io.anuke.mindustry.maps.generators.BasicGenerator$DistanceHeuristic", "io.anuke.mindustry.maps.generators.BasicGenerator$TileHueristic", "io.anuke.mindustry.maps.generators.Generator", "io.anuke.mindustry.maps.generators.MapGenerator", "io.anuke.mindustry.maps.generators.MapGenerator$Decoration", "io.anuke.mindustry.maps.generators.RandomGenerator", "io.anuke.mindustry.maps.zonegen.DesertWastesGenerator", "io.anuke.mindustry.maps.zonegen.OvergrowthGenerator", "io.anuke.mindustry.type.Category", "io.anuke.mindustry.type.ContentType", "io.anuke.mindustry.type.Item", "io.anuke.mindustry.type.ItemStack", "io.anuke.mindustry.type.ItemType", "io.anuke.mindustry.type.Liquid", "io.anuke.mindustry.type.LiquidStack", "io.anuke.mindustry.type.Mech", "io.anuke.mindustry.type.Publishable", "io.anuke.mindustry.type.StatusEffect", "io.anuke.mindustry.type.StatusEffect$TransitionHandler", "io.anuke.mindustry.type.TypeID", "io.anuke.mindustry.type.UnitType", "io.anuke.mindustry.type.Weapon", "io.anuke.mindustry.type.WeatherEvent", "io.anuke.mindustry.type.Zone", "io.anuke.mindustry.ui.Bar", "io.anuke.mindustry.ui.BorderImage", "io.anuke.mindustry.ui.Cicon", "io.anuke.mindustry.ui.ContentDisplay", "io.anuke.mindustry.ui.Fonts", "io.anuke.mindustry.ui.GridImage", "io.anuke.mindustry.ui.IconSize", "io.anuke.mindustry.ui.IntFormat", "io.anuke.mindustry.ui.ItemDisplay", "io.anuke.mindustry.ui.ItemImage", "io.anuke.mindustry.ui.ItemsDisplay", "io.anuke.mindustry.ui.Links", "io.anuke.mindustry.ui.Links$LinkEntry", "io.anuke.mindustry.ui.LiquidDisplay", "io.anuke.mindustry.ui.Minimap", "io.anuke.mindustry.ui.MobileButton", "io.anuke.mindustry.ui.MultiReqImage", "io.anuke.mindustry.ui.ReqImage", "io.anuke.mindustry.ui.Styles", "io.anuke.mindustry.ui.dialogs.AboutDialog", "io.anuke.mindustry.ui.dialogs.AdminsDialog", "io.anuke.mindustry.ui.dialogs.BansDialog", "io.anuke.mindustry.ui.dialogs.ColorPicker", "io.anuke.mindustry.ui.dialogs.ContentInfoDialog", "io.anuke.mindustry.ui.dialogs.ControlsDialog", "io.anuke.mindustry.ui.dialogs.CustomGameDialog", "io.anuke.mindustry.ui.dialogs.CustomRulesDialog", "io.anuke.mindustry.ui.dialogs.DatabaseDialog", "io.anuke.mindustry.ui.dialogs.DeployDialog", "io.anuke.mindustry.ui.dialogs.DeployDialog$View", "io.anuke.mindustry.ui.dialogs.DeployDialog$ZoneNode", "io.anuke.mindustry.ui.dialogs.DiscordDialog", "io.anuke.mindustry.ui.dialogs.FileChooser", "io.anuke.mindustry.ui.dialogs.FileChooser$FileHistory", "io.anuke.mindustry.ui.dialogs.FloatingDialog", "io.anuke.mindustry.ui.dialogs.GameOverDialog", "io.anuke.mindustry.ui.dialogs.HostDialog", "io.anuke.mindustry.ui.dialogs.JoinDialog", "io.anuke.mindustry.ui.dialogs.JoinDialog$Server", "io.anuke.mindustry.ui.dialogs.LanguageDialog", "io.anuke.mindustry.ui.dialogs.LoadDialog", "io.anuke.mindustry.ui.dialogs.LoadoutDialog", "io.anuke.mindustry.ui.dialogs.MapPlayDialog", "io.anuke.mindustry.ui.dialogs.MapsDialog", "io.anuke.mindustry.ui.dialogs.MinimapDialog", "io.anuke.mindustry.ui.dialogs.ModsDialog", "io.anuke.mindustry.ui.dialogs.PaletteDialog", "io.anuke.mindustry.ui.dialogs.PausedDialog", "io.anuke.mindustry.ui.dialogs.SaveDialog", "io.anuke.mindustry.ui.dialogs.SchematicsDialog", "io.anuke.mindustry.ui.dialogs.SchematicsDialog$SchematicImage", "io.anuke.mindustry.ui.dialogs.SchematicsDialog$SchematicInfoDialog", "io.anuke.mindustry.ui.dialogs.SettingsMenuDialog", "io.anuke.mindustry.ui.dialogs.TechTreeDialog", "io.anuke.mindustry.ui.dialogs.TechTreeDialog$LayoutNode", "io.anuke.mindustry.ui.dialogs.TechTreeDialog$TechTreeNode", "io.anuke.mindustry.ui.dialogs.TechTreeDialog$View", "io.anuke.mindustry.ui.dialogs.TraceDialog", "io.anuke.mindustry.ui.dialogs.ZoneInfoDialog", "io.anuke.mindustry.ui.fragments.BlockConfigFragment", "io.anuke.mindustry.ui.fragments.BlockInventoryFragment", "io.anuke.mindustry.ui.fragments.ChatFragment", "io.anuke.mindustry.ui.fragments.FadeInFragment", "io.anuke.mindustry.ui.fragments.Fragment", "io.anuke.mindustry.ui.fragments.HudFragment", "io.anuke.mindustry.ui.fragments.LoadingFragment", "io.anuke.mindustry.ui.fragments.MenuFragment", "io.anuke.mindustry.ui.fragments.OverlayFragment", "io.anuke.mindustry.ui.fragments.PlacementFragment", "io.anuke.mindustry.ui.fragments.PlayerListFragment", "io.anuke.mindustry.ui.fragments.ScriptConsoleFragment", "io.anuke.mindustry.ui.layout.BranchTreeLayout", "io.anuke.mindustry.ui.layout.BranchTreeLayout$TreeAlignment", "io.anuke.mindustry.ui.layout.BranchTreeLayout$TreeLocation", "io.anuke.mindustry.ui.layout.RadialTreeLayout", "io.anuke.mindustry.ui.layout.TreeLayout", "io.anuke.mindustry.ui.layout.TreeLayout$TreeNode", "io.anuke.mindustry.world.Block", "io.anuke.mindustry.world.BlockStorage", "io.anuke.mindustry.world.Build", "io.anuke.mindustry.world.CachedTile", "io.anuke.mindustry.world.DirectionalItemBuffer", "io.anuke.mindustry.world.DirectionalItemBuffer$BufferItemStruct", "io.anuke.mindustry.world.Edges", "io.anuke.mindustry.world.ItemBuffer", "io.anuke.mindustry.world.LegacyColorMapper", "io.anuke.mindustry.world.LegacyColorMapper$LegacyBlock", "io.anuke.mindustry.world.Pos", "io.anuke.mindustry.world.StaticTree", "io.anuke.mindustry.world.Tile", "io.anuke.mindustry.world.WorldContext", "io.anuke.mindustry.world.blocks.Attributes", "io.anuke.mindustry.world.blocks.Autotiler", "io.anuke.mindustry.world.blocks.Autotiler$AutotilerHolder", "io.anuke.mindustry.world.blocks.BlockPart", "io.anuke.mindustry.world.blocks.BuildBlock", "io.anuke.mindustry.world.blocks.BuildBlock$BuildEntity", "io.anuke.mindustry.world.blocks.DoubleOverlayFloor", "io.anuke.mindustry.world.blocks.Floor", "io.anuke.mindustry.world.blocks.ItemSelection", "io.anuke.mindustry.world.blocks.LiquidBlock", "io.anuke.mindustry.world.blocks.OreBlock", "io.anuke.mindustry.world.blocks.OverlayFloor", "io.anuke.mindustry.world.blocks.PowerBlock", "io.anuke.mindustry.world.blocks.RespawnBlock", "io.anuke.mindustry.world.blocks.Rock", "io.anuke.mindustry.world.blocks.StaticWall", "io.anuke.mindustry.world.blocks.TreeBlock", "io.anuke.mindustry.world.blocks.defense.DeflectorWall", "io.anuke.mindustry.world.blocks.defense.DeflectorWall$DeflectorEntity", "io.anuke.mindustry.world.blocks.defense.Door", "io.anuke.mindustry.world.blocks.defense.Door$DoorEntity", "io.anuke.mindustry.world.blocks.defense.ForceProjector", "io.anuke.mindustry.world.blocks.defense.ForceProjector$ForceEntity", "io.anuke.mindustry.world.blocks.defense.ForceProjector$ShieldEntity", "io.anuke.mindustry.world.blocks.defense.MendProjector", "io.anuke.mindustry.world.blocks.defense.MendProjector$MendEntity", "io.anuke.mindustry.world.blocks.defense.OverdriveProjector", "io.anuke.mindustry.world.blocks.defense.OverdriveProjector$OverdriveEntity", "io.anuke.mindustry.world.blocks.defense.ShockMine", "io.anuke.mindustry.world.blocks.defense.SurgeWall", "io.anuke.mindustry.world.blocks.defense.Wall", "io.anuke.mindustry.world.blocks.defense.turrets.ArtilleryTurret", "io.anuke.mindustry.world.blocks.defense.turrets.BurstTurret", "io.anuke.mindustry.world.blocks.defense.turrets.ChargeTurret", "io.anuke.mindustry.world.blocks.defense.turrets.ChargeTurret$LaserTurretEntity", "io.anuke.mindustry.world.blocks.defense.turrets.CooledTurret", "io.anuke.mindustry.world.blocks.defense.turrets.DoubleTurret", "io.anuke.mindustry.world.blocks.defense.turrets.ItemTurret", "io.anuke.mindustry.world.blocks.defense.turrets.ItemTurret$ItemEntry", "io.anuke.mindustry.world.blocks.defense.turrets.ItemTurret$ItemTurretEntity", "io.anuke.mindustry.world.blocks.defense.turrets.LaserTurret", "io.anuke.mindustry.world.blocks.defense.turrets.LaserTurret$LaserTurretEntity", "io.anuke.mindustry.world.blocks.defense.turrets.LiquidTurret", "io.anuke.mindustry.world.blocks.defense.turrets.PowerTurret", "io.anuke.mindustry.world.blocks.defense.turrets.Turret", "io.anuke.mindustry.world.blocks.defense.turrets.Turret$AmmoEntry", "io.anuke.mindustry.world.blocks.defense.turrets.Turret$TurretEntity", "io.anuke.mindustry.world.blocks.distribution.ArmoredConveyor", "io.anuke.mindustry.world.blocks.distribution.BufferedItemBridge", "io.anuke.mindustry.world.blocks.distribution.BufferedItemBridge$BufferedItemBridgeEntity", "io.anuke.mindustry.world.blocks.distribution.Conveyor", "io.anuke.mindustry.world.blocks.distribution.Conveyor$ConveyorEntity", "io.anuke.mindustry.world.blocks.distribution.Conveyor$ItemPos", "io.anuke.mindustry.world.blocks.distribution.ExtendingItemBridge", "io.anuke.mindustry.world.blocks.distribution.ItemBridge", "io.anuke.mindustry.world.blocks.distribution.ItemBridge$ItemBridgeEntity", "io.anuke.mindustry.world.blocks.distribution.Junction", "io.anuke.mindustry.world.blocks.distribution.Junction$JunctionEntity", "io.anuke.mindustry.world.blocks.distribution.MassDriver", "io.anuke.mindustry.world.blocks.distribution.MassDriver$DriverBulletData", "io.anuke.mindustry.world.blocks.distribution.MassDriver$DriverState", "io.anuke.mindustry.world.blocks.distribution.MassDriver$MassDriverEntity", "io.anuke.mindustry.world.blocks.distribution.OverflowGate", "io.anuke.mindustry.world.blocks.distribution.OverflowGate$OverflowGateEntity", "io.anuke.mindustry.world.blocks.distribution.Router", "io.anuke.mindustry.world.blocks.distribution.Router$RouterEntity", "io.anuke.mindustry.world.blocks.distribution.Sorter", "io.anuke.mindustry.world.blocks.distribution.Sorter$SorterEntity", "io.anuke.mindustry.world.blocks.liquid.ArmoredConduit", "io.anuke.mindustry.world.blocks.liquid.Conduit", "io.anuke.mindustry.world.blocks.liquid.Conduit$ConduitEntity", "io.anuke.mindustry.world.blocks.liquid.LiquidBridge", "io.anuke.mindustry.world.blocks.liquid.LiquidExtendingBridge", "io.anuke.mindustry.world.blocks.liquid.LiquidJunction", "io.anuke.mindustry.world.blocks.liquid.LiquidOverflowGate", "io.anuke.mindustry.world.blocks.liquid.LiquidRouter", "io.anuke.mindustry.world.blocks.liquid.LiquidTank", "io.anuke.mindustry.world.blocks.logic.LogicBlock", "io.anuke.mindustry.world.blocks.logic.MessageBlock", "io.anuke.mindustry.world.blocks.logic.MessageBlock$MessageBlockEntity", "io.anuke.mindustry.world.blocks.power.Battery", "io.anuke.mindustry.world.blocks.power.BurnerGenerator", "io.anuke.mindustry.world.blocks.power.ConditionalConsumePower", "io.anuke.mindustry.world.blocks.power.DecayGenerator", "io.anuke.mindustry.world.blocks.power.ImpactReactor", "io.anuke.mindustry.world.blocks.power.ImpactReactor$FusionReactorEntity", "io.anuke.mindustry.world.blocks.power.ItemLiquidGenerator", "io.anuke.mindustry.world.blocks.power.ItemLiquidGenerator$ItemLiquidGeneratorEntity", "io.anuke.mindustry.world.blocks.power.LightBlock", "io.anuke.mindustry.world.blocks.power.LightBlock$LightEntity", "io.anuke.mindustry.world.blocks.power.NuclearReactor", "io.anuke.mindustry.world.blocks.power.NuclearReactor$NuclearReactorEntity", "io.anuke.mindustry.world.blocks.power.PowerDiode", "io.anuke.mindustry.world.blocks.power.PowerDistributor", "io.anuke.mindustry.world.blocks.power.PowerGenerator", "io.anuke.mindustry.world.blocks.power.PowerGenerator$GeneratorEntity", "io.anuke.mindustry.world.blocks.power.PowerGraph", "io.anuke.mindustry.world.blocks.power.PowerNode", "io.anuke.mindustry.world.blocks.power.SingleTypeGenerator", "io.anuke.mindustry.world.blocks.power.SolarGenerator", "io.anuke.mindustry.world.blocks.power.ThermalGenerator", "io.anuke.mindustry.world.blocks.production.Cultivator", "io.anuke.mindustry.world.blocks.production.Cultivator$CultivatorEntity", "io.anuke.mindustry.world.blocks.production.Drill", "io.anuke.mindustry.world.blocks.production.Drill$DrillEntity", "io.anuke.mindustry.world.blocks.production.Fracker", "io.anuke.mindustry.world.blocks.production.Fracker$FrackerEntity", "io.anuke.mindustry.world.blocks.production.GenericCrafter", "io.anuke.mindustry.world.blocks.production.GenericCrafter$GenericCrafterEntity", "io.anuke.mindustry.world.blocks.production.GenericSmelter", "io.anuke.mindustry.world.blocks.production.Incinerator", "io.anuke.mindustry.world.blocks.production.Incinerator$IncineratorEntity", "io.anuke.mindustry.world.blocks.production.LiquidConverter", "io.anuke.mindustry.world.blocks.production.Pump", "io.anuke.mindustry.world.blocks.production.Separator", "io.anuke.mindustry.world.blocks.production.SolidPump", "io.anuke.mindustry.world.blocks.production.SolidPump$SolidPumpEntity", "io.anuke.mindustry.world.blocks.sandbox.ItemSource", "io.anuke.mindustry.world.blocks.sandbox.ItemSource$ItemSourceEntity", "io.anuke.mindustry.world.blocks.sandbox.ItemVoid", "io.anuke.mindustry.world.blocks.sandbox.LiquidSource", "io.anuke.mindustry.world.blocks.sandbox.LiquidSource$LiquidSourceEntity", "io.anuke.mindustry.world.blocks.sandbox.PowerSource", "io.anuke.mindustry.world.blocks.sandbox.PowerVoid", "io.anuke.mindustry.world.blocks.storage.CoreBlock", "io.anuke.mindustry.world.blocks.storage.CoreBlock$CoreEntity", "io.anuke.mindustry.world.blocks.storage.LaunchPad", "io.anuke.mindustry.world.blocks.storage.StorageBlock", "io.anuke.mindustry.world.blocks.storage.StorageBlock$StorageBlockEntity", "io.anuke.mindustry.world.blocks.storage.Unloader", "io.anuke.mindustry.world.blocks.storage.Unloader$UnloaderEntity", "io.anuke.mindustry.world.blocks.storage.Vault", "io.anuke.mindustry.world.blocks.units.CommandCenter", "io.anuke.mindustry.world.blocks.units.CommandCenter$CommandCenterEntity", "io.anuke.mindustry.world.blocks.units.MechPad", "io.anuke.mindustry.world.blocks.units.MechPad$MechFactoryEntity", "io.anuke.mindustry.world.blocks.units.RallyPoint", "io.anuke.mindustry.world.blocks.units.RepairPoint", "io.anuke.mindustry.world.blocks.units.RepairPoint$RepairPointEntity", "io.anuke.mindustry.world.blocks.units.UnitFactory", "io.anuke.mindustry.world.blocks.units.UnitFactory$UnitFactoryEntity", "io.anuke.mindustry.world.consumers.Consume", "io.anuke.mindustry.world.consumers.ConsumeItemFilter", "io.anuke.mindustry.world.consumers.ConsumeItems", "io.anuke.mindustry.world.consumers.ConsumeLiquid", "io.anuke.mindustry.world.consumers.ConsumeLiquidBase", "io.anuke.mindustry.world.consumers.ConsumeLiquidFilter", "io.anuke.mindustry.world.consumers.ConsumePower", "io.anuke.mindustry.world.consumers.ConsumeType", "io.anuke.mindustry.world.consumers.Consumers", "io.anuke.mindustry.world.meta.Attribute", "io.anuke.mindustry.world.meta.BlockBars", "io.anuke.mindustry.world.meta.BlockFlag", "io.anuke.mindustry.world.meta.BlockGroup", "io.anuke.mindustry.world.meta.BlockStat", "io.anuke.mindustry.world.meta.BlockStats", "io.anuke.mindustry.world.meta.BuildVisibility", "io.anuke.mindustry.world.meta.PowerType", "io.anuke.mindustry.world.meta.Producers", "io.anuke.mindustry.world.meta.StatCategory", "io.anuke.mindustry.world.meta.StatUnit", "io.anuke.mindustry.world.meta.StatValue", "io.anuke.mindustry.world.meta.values.AmmoListValue", "io.anuke.mindustry.world.meta.values.BooleanValue", "io.anuke.mindustry.world.meta.values.BoosterListValue", "io.anuke.mindustry.world.meta.values.ItemFilterValue", "io.anuke.mindustry.world.meta.values.ItemListValue", "io.anuke.mindustry.world.meta.values.LiquidFilterValue", "io.anuke.mindustry.world.meta.values.LiquidValue", "io.anuke.mindustry.world.meta.values.NumberValue", "io.anuke.mindustry.world.meta.values.StringValue", "io.anuke.mindustry.world.modules.BlockModule", "io.anuke.mindustry.world.modules.ConsumeModule", "io.anuke.mindustry.world.modules.ItemModule", "io.anuke.mindustry.world.modules.ItemModule$ItemCalculator", "io.anuke.mindustry.world.modules.ItemModule$ItemConsumer", "io.anuke.mindustry.world.modules.LiquidModule", "io.anuke.mindustry.world.modules.LiquidModule$LiquidCalculator", "io.anuke.mindustry.world.modules.LiquidModule$LiquidConsumer", "io.anuke.mindustry.world.modules.PowerModule", "io.anuke.mindustry.world.producers.Produce", "io.anuke.mindustry.world.producers.ProduceItem", "java.io.PrintStream", "java.lang.Object", "java.lang.Runnable", "java.lang.String", "java.lang.System"); +} \ No newline at end of file diff --git a/core/src/io/anuke/mindustry/mod/ContentParser.java b/core/src/io/anuke/mindustry/mod/ContentParser.java index 008ae39b63..c4c9b1064c 100644 --- a/core/src/io/anuke/mindustry/mod/ContentParser.java +++ b/core/src/io/anuke/mindustry/mod/ContentParser.java @@ -1,6 +1,7 @@ package io.anuke.mindustry.mod; import io.anuke.arc.*; +import io.anuke.arc.assets.*; import io.anuke.arc.audio.*; import io.anuke.arc.audio.mock.*; import io.anuke.arc.collection.Array; @@ -35,6 +36,19 @@ import java.lang.reflect.*; public class ContentParser{ private static final boolean ignoreUnknownFields = true; private ObjectMap, ContentType> contentTypes = new ObjectMap<>(); + private StringMap legacyUnitMap = StringMap.of( + "Dagger", "GroundUnit", + "Eruptor", "GroundUnit", + "Titan", "GroundUnit", + "Fortress", "GroundUnit", + "Crawler", "GroundUnit", + "Revenant", "HoverUnit", + "Draug", "MinerDrone", + "Phantom", "BuilderDrone", + "Spirit", "RepairDrone", + "Wraith", "FlyingUnit", + "Ghoul", "FlyingUnit" + ); private ObjectMap, FieldParser> classParsers = new ObjectMap, FieldParser>(){{ put(Effect.class, (type, data) -> field(Fx.class, data)); put(StatusEffect.class, (type, data) -> field(StatusEffects.class, data)); @@ -51,6 +65,15 @@ public class ContentParser{ } } }); + put(StatusEffect.class, (type, data) -> { + Object result = fieldOpt(StatusEffects.class, data); + if(result != null){ + return result; + } + StatusEffect effect = new StatusEffect(currentMod.name + "-" + data.getString("name")); + readFields(effect, data); + return effect; + }); put(Color.class, (type, data) -> Color.valueOf(data.asString())); put(BulletType.class, (type, data) -> { if(data.isString()){ @@ -69,9 +92,9 @@ public class ContentParser{ String name = "sounds/" + data.asString(); String path = Vars.tree.get(name + ".ogg").exists() && !Vars.ios ? name + ".ogg" : name + ".mp3"; ModLoadingSound sound = new ModLoadingSound(); - Core.assets.load(path, Sound.class).loaded = result -> { - sound.sound = (Sound)result; - }; + AssetDescriptor desc = Core.assets.load(path, Sound.class); + desc.loaded = result -> sound.sound = (Sound)result; + desc.errored = Throwable::printStackTrace; return sound; }); put(Objective.class, (type, data) -> { @@ -104,7 +127,7 @@ public class ContentParser{ return t; } - private T internalRead(Class type, Class elementType, JsonValue jsonData, Class keyType){ + private T internalRead(Class type, Class elementType, JsonValue jsonData, Class keyType){ if(type != null){ if(classParsers.containsKey(type)){ try{ @@ -114,6 +137,29 @@ public class ContentParser{ } } + //try to parse "item/amount" syntax + try{ + if(type == ItemStack.class && jsonData.isString() && jsonData.asString().contains("/")){ + String[] split = jsonData.asString().split("/"); + + return (T)fromJson(ItemStack.class, "{item: " + split[0] + ", amount: " + split[1] + "}"); + } + }catch(Throwable ignored){ + } + + //try to parse "liquid/amount" syntax + try{ + if(jsonData.isString() && jsonData.asString().contains("/")){ + String[] split = jsonData.asString().split("/"); + if(type == LiquidStack.class){ + return (T)fromJson(LiquidStack.class, "{liquid: " + split[0] + ", amount: " + split[1] + "}"); + }else if(type == ConsumeLiquid.class){ + return (T)fromJson(ConsumeLiquid.class, "{liquid: " + split[0] + ", amount: " + split[1] + "}"); + } + } + }catch(Throwable ignored){ + } + 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 + "-" : ""; @@ -136,28 +182,34 @@ public class ContentParser{ Block block; - if(Vars.content.getByName(ContentType.block, name) != null){ - block = Vars.content.getByName(ContentType.block, name); + if(locate(ContentType.block, name) != null){ + block = locate(ContentType.block, name); if(value.has("type")){ - throw new IllegalArgumentException("When overwriting an existing block, you must not re-declare its type. The original type will be used. Block: " + name); + throw new IllegalArgumentException("When defining properties for an existing block, you must not re-declare its type. The original type will be used. Block: " + name); } }else{ //TODO generate dynamically instead of doing.. this - Class type = resolve(getType(value), - "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.liquid", - "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" - ); + Class type; + + try{ + type = resolve(getType(value), + "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.liquid", + "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" + ); + }catch(IllegalArgumentException e){ + type = Block.class; + } block = make(type, mod + "-" + name); } @@ -198,6 +250,10 @@ public class ContentParser{ readFields(block, value, true); + if(block.size > 8){ + throw new IllegalArgumentException("Blocks cannot be larger than 8x8."); + } + //add research tech node if(research[0] != null){ Block parent = find(ContentType.block, research[0]); @@ -205,6 +261,9 @@ public class ContentParser{ postreads.add(() -> { TechNode parnode = TechTree.all.find(t -> t.block == parent); + if(parnode == null){ + throw new ModLoadException("Block '" + parent.name + "' isn't in the tech tree, but '" + block.name + "' requires it to be researched.", block); + } if(!parnode.children.contains(baseNode)){ parnode.children.add(baseNode); } @@ -222,8 +281,14 @@ public class ContentParser{ ContentType.unit, (TypeParser)(mod, name, value) -> { readBundle(ContentType.unit, name, value); - Class type = resolve(getType(value), "io.anuke.mindustry.entities.type.base"); - UnitType unit = new UnitType(mod + "-" + name, supply(type)); + UnitType unit; + if(locate(ContentType.unit, name) == null){ + Class type = resolve(legacyUnitMap.get(Strings.capitalize(getType(value)), getType(value)), "io.anuke.mindustry.entities.type.base"); + unit = new UnitType(mod + "-" + name, supply(type)); + }else{ + unit = locate(ContentType.unit, name); + } + currentContent = unit; read(() -> readFields(unit, value, true)); @@ -342,22 +407,33 @@ public class ContentParser{ init(); } + //remove extra # characters to make it valid json... apparently some people have *unquoted* # characters in their json + if(file.extension().equals("json")){ + json = json.replace("#", "\\#"); + } + JsonValue value = parser.fromJson(null, Jval.read(json).toString(Jformat.plain)); + if(!parsers.containsKey(type)){ throw new SerializationException("No parsers for content type '" + type + "'"); } currentMod = mod; - boolean exists = Vars.content.getByName(type, name) != null; + boolean located = locate(type, name) != null; Content c = parsers.get(type).parse(mod.name, name, value); toBeParsed.add(c); - if(!exists){ + if(!located){ c.sourceFile = file; c.mod = mod; } return c; } + private T locate(ContentType type, String name){ + T first = Vars.content.getByName(type, name); //try vanilla replacement + return first != null ? first : Vars.content.getByName(type, currentMod.name + "-" + name); + } + private T make(Class type){ try{ Constructor cons = type.getDeclaredConstructor(); @@ -445,7 +521,7 @@ public class ContentParser{ FieldMetadata metadata = fields.get(child.name().replace(" ", "_")); if(metadata == null){ if(ignoreUnknownFields){ - Log.err("{0}: Ignoring unknown field: " + child.name + " (" + type.getName() + ")", object); + Log.warn("{0}: Ignoring unknown field: " + child.name + " (" + type.getName() + ")", object); continue; }else{ SerializationException ex = new SerializationException("Field not found: " + child.name + " (" + type.getName() + ")"); diff --git a/core/src/io/anuke/mindustry/mod/Mod.java b/core/src/io/anuke/mindustry/mod/Mod.java index 5ee0f699c4..aa4d8198f5 100644 --- a/core/src/io/anuke/mindustry/mod/Mod.java +++ b/core/src/io/anuke/mindustry/mod/Mod.java @@ -15,11 +15,6 @@ public class Mod{ } - /** 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){ diff --git a/core/src/io/anuke/mindustry/mod/Mods.java b/core/src/io/anuke/mindustry/mod/Mods.java index 59347e01ab..0030d65721 100644 --- a/core/src/io/anuke/mindustry/mod/Mods.java +++ b/core/src/io/anuke/mindustry/mod/Mods.java @@ -6,7 +6,6 @@ import io.anuke.arc.collection.*; import io.anuke.arc.files.*; import io.anuke.arc.func.*; 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.*; @@ -14,10 +13,13 @@ 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.arc.util.serialization.Jval.*; import io.anuke.mindustry.core.*; import io.anuke.mindustry.ctype.*; import io.anuke.mindustry.game.EventType.*; import io.anuke.mindustry.gen.*; +import io.anuke.mindustry.graphics.*; +import io.anuke.mindustry.graphics.MultiPacker.*; import io.anuke.mindustry.plugin.*; import io.anuke.mindustry.type.*; @@ -28,12 +30,13 @@ import static io.anuke.mindustry.Vars.*; public class Mods implements Loadable{ private Json json = new Json(); + private @Nullable Scripts scripts; private ContentParser parser = new ContentParser(); private ObjectMap> bundles = new ObjectMap<>(); private ObjectSet specialFolders = ObjectSet.with("bundles", "sprites"); private int totalSprites; - private PixmapPacker packer; + private MultiPacker packer; private Array loaded = new Array<>(); private Array disabled = new Array<>(); @@ -48,9 +51,21 @@ public class Mods implements Loadable{ return modDirectory.child(load.name).child("config.json"); } + /** Returns a list of files per mod subdirectory. */ + public void listFiles(String directory, Cons2 cons){ + for(LoadedMod mod : loaded){ + FileHandle file = mod.root.child(directory); + if(file.exists()){ + for(FileHandle child : file.list()){ + cons.get(mod, child); + } + } + } + } + /** @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); + return loaded.find(l -> l.mod != null && l.mod.getClass() == type); } /** Imports an external mod file.*/ @@ -79,35 +94,44 @@ public class Mods implements Loadable{ if(loaded.isEmpty()) return; Time.mark(); - packer = new PixmapPacker(2048, 2048, Format.RGBA8888, 2, true); + packer = new MultiPacker(); 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); + Array sprites = mod.root.child("sprites").findAll(f -> f.extension().equals("png")); + Array overrides = mod.root.child("sprites-override").findAll(f -> f.extension().equals("png")); + packSprites(sprites, mod, true); + packSprites(overrides, mod, false); + Log.debug("Packed {0} images for mod '{1}'.", sprites.size + overrides.size, mod.meta.name); + totalSprites += sprites.size + overrides.size; } - Log.info("Time to pack textures: {0}", Time.elapsed()); + for(AtlasRegion region : Core.atlas.getRegions()){ + PageType type = getPage(region); + if(!packer.has(type, region.name)){ + packer.add(type, region.name, Core.atlas.getPixmap(region)); + } + } + + Log.debug("Time to pack textures: {0}", Time.elapsed()); + } + + private void packSprites(Array sprites, LoadedMod mod, boolean prefix){ + for(FileHandle file : sprites){ + 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.add(getPage(file), (prefix ? mod.name + "-" : "") + file.nameWithoutExtension(), new PixmapRegion(pixmap)); + pixmap.dispose(); + }catch(IOException e){ + Core.app.post(() -> { + Log.err("Error packing images for mod: {0}", mod.meta.name); + e.printStackTrace(); + if(!headless) ui.showException(e); + }); + break; + } + } + totalSprites += sprites.size; } @Override @@ -115,37 +139,51 @@ public class Mods implements Loadable{ if(packer == null) return; Time.mark(); - 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); + //flush so generators can use these sprites + packer.flush(filter, Core.atlas); + //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); + u.createIcons(packer); } }); } - editorPacker.updateTextureAtlas(Core.atlas, filter, filter, false); - packer.updateTextureAtlas(Core.atlas, filter, filter, false); + Core.atlas = packer.flush(filter, new TextureAtlas()); + Core.atlas.setErrorRegion("error"); + Log.debug("Total pages: {0}", Core.atlas.getTextures().size); } packer.dispose(); packer = null; - Log.info("Time to update textures: {0}", Time.elapsed()); + Log.debug("Time to update textures: {0}", Time.elapsed()); + } + + private PageType getPage(AtlasRegion region){ + return + region.getTexture() == Core.atlas.find("white").getTexture() ? PageType.main : + region.getTexture() == Core.atlas.find("stone1").getTexture() ? PageType.environment : + region.getTexture() == Core.atlas.find("clear-editor").getTexture() ? PageType.editor : + region.getTexture() == Core.atlas.find("zone-groundZero").getTexture() ? PageType.zone : + region.getTexture() == Core.atlas.find("whiteui").getTexture() ? PageType.ui : + PageType.main; + } + + private PageType getPage(FileHandle file){ + String parent = file.parent().name(); + return + parent.equals("environment") ? PageType.environment : + parent.equals("editor") ? PageType.editor : + parent.equals("zones") ? PageType.zone : + parent.equals("ui") || file.parent().parent().name().equals("ui") ? PageType.ui : + PageType.main; } /** Removes a mod file and marks it for requiring a restart. */ @@ -165,6 +203,16 @@ public class Mods implements Loadable{ requiresReload = true; } + public Scripts getScripts(){ + if(scripts == null) scripts = platform.createScripts(); + return scripts; + } + + /** @return whether the scripting engine has been initialized. */ + public boolean hasScripts(){ + return scripts != null; + } + public boolean requiresReload(){ return requiresReload; } @@ -172,8 +220,7 @@ public class Mods implements Loadable{ /** Loads all mods from the folder, but does not 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; - + if(!file.extension().equals("jar") && !file.extension().equals("zip") && !(file.isDirectory() && (file.child("mod.json").exists() || file.child("mod.hjson").exists()))) continue; Log.debug("[Mods] Loading mod {0}", file); try{ @@ -206,6 +253,7 @@ public class Mods implements Loadable{ } resolveDependencies(); + //sort mods to make sure servers handle them properly. loaded.sort(Structs.comparing(m -> m.name)); @@ -213,6 +261,10 @@ public class Mods implements Loadable{ } private void resolveDependencies(){ + Array incompatible = loaded.select(m -> !m.isSupported()); + loaded.removeAll(incompatible); + disabled.addAll(incompatible); + for(LoadedMod mod : Array.withArrays(loaded, disabled)){ updateDependencies(mod); } @@ -311,8 +363,15 @@ public class Mods implements Loadable{ Sounds.dispose(); Sounds.load(); Core.assets.finishLoading(); + if(scripts != null){ + scripts.dispose(); + scripts = null; + } content.clear(); - content.createContent(); + content.createBaseContent(); + content.loadColors(); + loadScripts(); + content.createModContent(); loadAsync(); loadSync(); content.init(); @@ -322,10 +381,50 @@ public class Mods implements Loadable{ requiresReload = false; Events.fire(new ContentReloadEvent()); + + if(scripts != null && scripts.hasErrored()){ + Core.app.post(() -> Core.settings.getBoolOnce("scripts-errored", () -> ui.showErrorMessage("$mod.scripts.unsupported"))); + } + } + + /** This must be run on the main thread! */ + public void loadScripts(){ + Time.mark(); + + try{ + for(LoadedMod mod : loaded){ + if(mod.root.child("scripts").exists()){ + content.setCurrentMod(mod); + mod.scripts = mod.root.child("scripts").findAll(f -> f.extension().equals("js")); + Log.debug("[{0}] Found {1} scripts.", mod.meta.name, mod.scripts.size); + + for(FileHandle file : mod.scripts){ + try{ + if(scripts == null){ + scripts = platform.createScripts(); + } + scripts.run(mod, file); + }catch(Throwable e){ + Core.app.post(() -> { + Log.err("Error loading script {0} for mod {1}.", file.name(), mod.meta.name); + e.printStackTrace(); + //if(!headless) ui.showException(e); + }); + break; + } + } + } + } + }finally{ + content.setCurrentMod(null); + } + + Log.debug("Time to initialize modded scripts: {0}", Time.elapsed()); } /** Creates all the content found in mod files. */ public void loadContent(){ + class LoadRun implements Comparable{ final ContentType type; final FileHandle file; @@ -354,7 +453,7 @@ public class Mods implements Loadable{ FileHandle folder = contentRoot.child(type.name().toLowerCase() + "s"); if(folder.exists()){ for(FileHandle file : folder.list()){ - if(file.extension().equals("json") || file.extension().equals("hjson") || file.extension().equals("js")){ + if(file.extension().equals("json") || file.extension().equals("hjson")){ runs.add(new LoadRun(type, file, mod)); } } @@ -378,9 +477,6 @@ public class Mods implements Loadable{ //this finishes parsing content fields parser.finishParsing(); - - //load content for code mods - each(Mod::loadContent); } /** @return all loaded mods. */ @@ -482,13 +578,13 @@ public class Mods implements Loadable{ zip = zip.list()[0]; } - FileHandle metaf = zip.child("mod.json").exists() ? zip.child("mod.json") : zip.child("plugin.json"); + FileHandle metaf = zip.child("mod.json").exists() ? zip.child("mod.json") : zip.child("mod.hjson").exists() ? zip.child("mod.hjson") : zip.child("plugin.json"); if(!metaf.exists()){ - Log.warn("Mod {0} doesn't have a 'mod.json'/'plugin.json' file, skipping.", sourceFile); + Log.warn("Mod {0} doesn't have a 'mod.json'/'plugin.json'/'mod.js' file, skipping.", sourceFile); throw new IllegalArgumentException("No mod.json found."); } - ModMeta meta = json.fromJson(ModMeta.class, metaf.readString()); + ModMeta meta = json.fromJson(ModMeta.class, Jval.read(metaf.readString()).toString(Jformat.plain)); String camelized = meta.name.replace(" ", ""); String mainClass = meta.main == null ? camelized.toLowerCase() + "." + camelized + "Mod" : meta.main; String baseName = meta.name.toLowerCase().replace(" ", "-"); @@ -546,6 +642,8 @@ public class Mods implements Loadable{ public Array dependencies = new Array<>(); /** All missing dependencies of this mod as strings. */ public Array missingDependencies = new Array<>(); + /** Script files to run. */ + public Array scripts = new Array<>(); public LoadedMod(FileHandle file, FileHandle root, Mod mod, ModMeta meta){ this.root = root; @@ -563,6 +661,18 @@ public class Mods implements Loadable{ return !missingDependencies.isEmpty(); } + /** @return whether this mod is supported by the game verison */ + public boolean isSupported(){ + if(Version.build <= 0 || meta.minGameVersion == null) return true; + if(meta.minGameVersion.contains(".")){ + String[] split = meta.minGameVersion.split("\\."); + if(split.length == 2){ + return Version.build >= Strings.parseInt(split[0], 0) && Version.revision >= Strings.parseInt(split[1], 0); + } + } + return Version.build >= Strings.parseInt(meta.minGameVersion, 0); + } + @Override public String getSteamID(){ return Core.settings.getString(name + "-steamid", null); @@ -632,10 +742,14 @@ public class Mods implements Loadable{ /** Plugin metadata information.*/ public static class ModMeta{ - public String name, author, description, version, main; + public String name, displayName, author, description, version, main, minGameVersion; public Array dependencies = Array.with(); /** Hidden mods are only server-side or client-side, and do not support adding new content. */ public boolean hidden; + + public String displayName(){ + return displayName == null ? name : displayName; + } } /** Thrown when an error occurs while loading a mod.*/ @@ -662,5 +776,13 @@ public class Mods implements Loadable{ this.mod = content.mod; } } + + public ModLoadException(String message, @Nullable Content content){ + super(message); + this.content = content; + if(content != null){ + this.mod = content.mod; + } + } } } diff --git a/core/src/io/anuke/mindustry/mod/Scripts.java b/core/src/io/anuke/mindustry/mod/Scripts.java new file mode 100644 index 0000000000..921e4b783e --- /dev/null +++ b/core/src/io/anuke/mindustry/mod/Scripts.java @@ -0,0 +1,84 @@ +package io.anuke.mindustry.mod; + +import io.anuke.arc.*; +import io.anuke.arc.files.*; +import io.anuke.arc.util.*; +import io.anuke.arc.util.Log.*; +import io.anuke.mindustry.*; +import io.anuke.mindustry.mod.Mods.*; +import org.mozilla.javascript.*; + +public class Scripts implements Disposable{ + private final Context context; + private final String wrapper; + private Scriptable scope; + private boolean errored; + + public Scripts(){ + Time.mark(); + + context = Vars.platform.getScriptContext(); + context.setClassShutter(type -> (ClassAccess.allowedClassNames.contains(type) || type.startsWith("$Proxy") || + type.startsWith("adapter") || type.contains("PrintStream") || + type.startsWith("io.anuke.mindustry")) && !type.equals("io.anuke.mindustry.mod.ClassAccess")); + + scope = new ImporterTopLevel(context); + wrapper = Core.files.internal("scripts/wrapper.js").readString(); + + if(!run(Core.files.internal("scripts/global.js").readString(), "global.js")){ + errored = true; + } + Log.debug("Time to load script engine: {0}", Time.elapsed()); + } + + public boolean hasErrored(){ + return errored; + } + + public String runConsole(String text){ + try{ + Object o = context.evaluateString(scope, text, "console.js", 1, null); + if(o instanceof NativeJavaObject){ + o = ((NativeJavaObject)o).unwrap(); + } + if(o instanceof Undefined){ + o = "undefined"; + } + return String.valueOf(o); + }catch(Throwable t){ + return getError(t); + } + } + + private String getError(Throwable t){ + t.printStackTrace(); + return t.getClass().getSimpleName() + (t.getMessage() == null ? "" : ": " + t.getMessage()); + } + + public void log(String source, String message){ + log(LogLevel.info, source, message); + } + + public void log(LogLevel level, String source, String message){ + Log.log(level, "[{0}]: {1}", source, message); + } + + public void run(LoadedMod mod, FileHandle file){ + run(wrapper.replace("$SCRIPT_NAME$", mod.name + "/" + file.nameWithoutExtension()).replace("$CODE$", file.readString()).replace("$MOD_NAME$", mod.name), file.name()); + } + + private boolean run(String script, String file){ + try{ + context.evaluateString(scope, script, file, 1, null); + return true; + }catch(Throwable t){ + log(LogLevel.err, file, "" + getError(t)); + return false; + } + } + + @Override + public void dispose(){ + Context.exit(); + } +} diff --git a/core/src/io/anuke/mindustry/net/Administration.java b/core/src/io/anuke/mindustry/net/Administration.java index 0aaeb8542f..f7815e03d2 100644 --- a/core/src/io/anuke/mindustry/net/Administration.java +++ b/core/src/io/anuke/mindustry/net/Administration.java @@ -3,8 +3,11 @@ package io.anuke.mindustry.net; import io.anuke.annotations.Annotations.*; import io.anuke.arc.*; import io.anuke.arc.collection.*; +import io.anuke.mindustry.Vars; + import static io.anuke.mindustry.Vars.headless; +import static io.anuke.mindustry.game.EventType.*; public class Administration{ /** All player info. Maps UUIDs to info. This persists throughout restarts. */ @@ -76,7 +79,7 @@ public class Administration{ bannedIPs.add(ip); save(); - + Events.fire(new PlayerIpBanEvent(ip)); return true; } @@ -88,7 +91,7 @@ public class Administration{ getCreateInfo(id).banned = true; save(); - + Events.fire(new PlayerBanEvent(Vars.playerGroup.find(p -> id.equals(p.uuid)))); return true; } @@ -108,8 +111,10 @@ public class Administration{ bannedIPs.removeValue(ip, false); - if(found) save(); - + if(found){ + save(); + Events.fire(new PlayerIpUnbanEvent(ip)); + } return found; } @@ -126,7 +131,7 @@ public class Administration{ info.banned = false; bannedIPs.removeAll(info.ips, false); save(); - + Events.fire(new PlayerUnbanEvent(Vars.playerGroup.find(p -> id.equals(p.uuid)))); return true; } diff --git a/core/src/io/anuke/mindustry/net/ArcNetImpl.java b/core/src/io/anuke/mindustry/net/ArcNetProvider.java similarity index 98% rename from core/src/io/anuke/mindustry/net/ArcNetImpl.java rename to core/src/io/anuke/mindustry/net/ArcNetProvider.java index e2a5b3d6b2..600b80da9a 100644 --- a/core/src/io/anuke/mindustry/net/ArcNetImpl.java +++ b/core/src/io/anuke/mindustry/net/ArcNetProvider.java @@ -19,7 +19,7 @@ import java.util.concurrent.*; import static io.anuke.mindustry.Vars.*; -public class ArcNetImpl implements NetProvider{ +public class ArcNetProvider implements NetProvider{ final Client client; final Prov packetSupplier = () -> new DatagramPacket(new byte[256], 256); @@ -27,7 +27,7 @@ public class ArcNetImpl implements NetProvider{ final CopyOnWriteArrayList connections = new CopyOnWriteArrayList<>(); Thread serverThread; - public ArcNetImpl(){ + public ArcNetProvider(){ client = new Client(8192, 4096, new PacketSerializer()); client.setDiscoveryPacket(packetSupplier); client.addListener(new NetListener(){ @@ -346,6 +346,19 @@ public class ArcNetImpl implements NetProvider{ @SuppressWarnings("unchecked") public static class PacketSerializer implements NetSerializer{ + static Cons2 writer = Packet::write; + + @Override + public Object read(ByteBuffer byteBuffer){ + byte id = byteBuffer.get(); + if(id == -2){ + return readFramework(byteBuffer); + }else{ + Packet packet = Pools.obtain((Class)Registrator.getByID(id).type, (Prov)Registrator.getByID(id).constructor); + packet.read(byteBuffer); + return packet; + } + } @Override public void write(ByteBuffer byteBuffer, Object o){ @@ -359,19 +372,7 @@ public class ArcNetImpl implements NetProvider{ if(id == -1) throw new RuntimeException("Unregistered class: " + o.getClass()); byteBuffer.put(id); - ((Packet)o).write(byteBuffer); - } - } - - @Override - public Object read(ByteBuffer byteBuffer){ - byte id = byteBuffer.get(); - if(id == -2){ - return readFramework(byteBuffer); - }else{ - Packet packet = Pools.obtain((Class)Registrator.getByID(id).type, (Prov)Registrator.getByID(id).constructor); - packet.read(byteBuffer); - return packet; + writer.get((Packet)o, byteBuffer); } } diff --git a/core/src/io/anuke/mindustry/net/Packets.java b/core/src/io/anuke/mindustry/net/Packets.java index 963ed3c549..6c006a7eba 100644 --- a/core/src/io/anuke/mindustry/net/Packets.java +++ b/core/src/io/anuke/mindustry/net/Packets.java @@ -63,48 +63,6 @@ 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; - - @Override - public void write(ByteBuffer buffer){ - buffer.putInt(Version.build); - TypeIO.writeString(buffer, versionType); - TypeIO.writeString(buffer, name); - TypeIO.writeString(buffer, usid); - buffer.put(mobile ? (byte)1 : 0); - buffer.putInt(color); - buffer.put(Base64Coder.decode(uuid)); - buffer.put((byte)mods.size); - for(int i = 0; i < mods.size; i++){ - TypeIO.writeString(buffer, mods.get(i)); - } - } - - @Override - public void read(ByteBuffer buffer){ - version = buffer.getInt(); - versionType = TypeIO.readString(buffer); - name = TypeIO.readString(buffer); - usid = TypeIO.readString(buffer); - mobile = buffer.get() == 1; - color = buffer.getInt(); - byte[] idbytes = new byte[8]; - buffer.get(idbytes); - uuid = new String(Base64Coder.encode(idbytes)); - int totalMods = buffer.get(); - mods = new Array<>(totalMods); - for(int i = 0; i < totalMods; i++){ - mods.add(TypeIO.readString(buffer)); - } - } - } - public static class InvokePacket implements Packet{ public byte type, priority; @@ -190,4 +148,46 @@ public class Packets{ buffer.get(data); } } + + 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; + + @Override + public void write(ByteBuffer buffer){ + buffer.putInt(Version.build); + TypeIO.writeString(buffer, versionType); + TypeIO.writeString(buffer, name); + TypeIO.writeString(buffer, usid); + buffer.put(mobile ? (byte)1 : 0); + buffer.put(Base64Coder.decode(uuid)); + buffer.put((byte)color); + buffer.put((byte)mods.size); + for(int i = 0; i < mods.size; i++){ + TypeIO.writeString(buffer, mods.get(i)); + } + } + + @Override + public void read(ByteBuffer buffer){ + version = buffer.getInt(); + versionType = TypeIO.readString(buffer); + name = TypeIO.readString(buffer); + usid = TypeIO.readString(buffer); + mobile = buffer.get() == 1; + color = buffer.getInt(); + byte[] idbytes = new byte[8]; + buffer.get(idbytes); + uuid = new String(Base64Coder.encode(idbytes)); + int totalMods = buffer.get(); + mods = new Array<>(totalMods); + for(int i = 0; i < totalMods; i++){ + mods.add(TypeIO.readString(buffer)); + } + } + } } diff --git a/core/src/io/anuke/mindustry/type/Item.java b/core/src/io/anuke/mindustry/type/Item.java index 6ec12ae475..597eb468b5 100644 --- a/core/src/io/anuke/mindustry/type/Item.java +++ b/core/src/io/anuke/mindustry/type/Item.java @@ -1,10 +1,9 @@ package io.anuke.mindustry.type; -import io.anuke.arc.*; import io.anuke.arc.collection.*; import io.anuke.arc.graphics.*; import io.anuke.arc.scene.ui.layout.*; -import io.anuke.mindustry.ctype.UnlockableContent; +import io.anuke.mindustry.ctype.*; import io.anuke.mindustry.ui.*; import io.anuke.mindustry.world.blocks.*; @@ -34,7 +33,6 @@ public class Item extends UnlockableContent{ public Item(String name, Color color){ super(name); this.color = color; - this.description = Core.bundle.getOrNull("item." + this.name + ".description"); } public Item(String name){ @@ -51,14 +49,9 @@ public class Item extends UnlockableContent{ ContentDisplay.displayItem(table, this); } - @Override - public String localizedName(){ - return Core.bundle.get("item." + this.name + ".name"); - } - @Override public String toString(){ - return localizedName(); + return localizedName; } @Override diff --git a/core/src/io/anuke/mindustry/type/ItemStack.java b/core/src/io/anuke/mindustry/type/ItemStack.java index 4ea87f5605..723a6e4c24 100644 --- a/core/src/io/anuke/mindustry/type/ItemStack.java +++ b/core/src/io/anuke/mindustry/type/ItemStack.java @@ -38,7 +38,7 @@ public class ItemStack implements Comparable{ public static ItemStack[] with(Object... items){ ItemStack[] stacks = new ItemStack[items.length / 2]; for(int i = 0; i < items.length; i += 2){ - stacks[i / 2] = new ItemStack((Item)items[i], (Integer)items[i + 1]); + stacks[i / 2] = new ItemStack((Item)items[i], ((Number)items[i + 1]).intValue()); } return stacks; } @@ -46,7 +46,7 @@ public class ItemStack implements Comparable{ public static Array list(Object... items){ Array stacks = new Array<>(items.length / 2); for(int i = 0; i < items.length; i += 2){ - stacks.add(new ItemStack((Item)items[i], (Integer)items[i + 1])); + stacks.add(new ItemStack((Item)items[i], ((Number)items[i + 1]).intValue())); } return stacks; } diff --git a/core/src/io/anuke/mindustry/type/Liquid.java b/core/src/io/anuke/mindustry/type/Liquid.java index bc97a18990..8ed87e7941 100644 --- a/core/src/io/anuke/mindustry/type/Liquid.java +++ b/core/src/io/anuke/mindustry/type/Liquid.java @@ -1,11 +1,10 @@ package io.anuke.mindustry.type; -import io.anuke.arc.*; import io.anuke.arc.graphics.*; import io.anuke.arc.scene.ui.layout.*; import io.anuke.arc.util.ArcAnnotate.*; import io.anuke.mindustry.content.*; -import io.anuke.mindustry.ctype.UnlockableContent; +import io.anuke.mindustry.ctype.*; import io.anuke.mindustry.ui.*; public class Liquid extends UnlockableContent{ @@ -31,7 +30,6 @@ public class Liquid extends UnlockableContent{ public Liquid(String name, Color color){ super(name); this.color = new Color(color); - this.description = Core.bundle.getOrNull("liquid." + name + ".description"); } /** For modding only.*/ @@ -52,14 +50,9 @@ public class Liquid extends UnlockableContent{ ContentDisplay.displayLiquid(table, this); } - @Override - public String localizedName(){ - return Core.bundle.get("liquid." + this.name + ".name"); - } - @Override public String toString(){ - return localizedName(); + return localizedName; } @Override diff --git a/core/src/io/anuke/mindustry/type/Mech.java b/core/src/io/anuke/mindustry/type/Mech.java index 8eb9681548..7a5de5ae2d 100644 --- a/core/src/io/anuke/mindustry/type/Mech.java +++ b/core/src/io/anuke/mindustry/type/Mech.java @@ -39,17 +39,12 @@ public class Mech extends UnlockableContent{ public Mech(String name, boolean flying){ super(name); this.flying = flying; - 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"); - } - public void updateAlt(Player player){ } @@ -113,6 +108,6 @@ public class Mech extends UnlockableContent{ @Override public String toString(){ - return localizedName(); + return localizedName; } } diff --git a/core/src/io/anuke/mindustry/type/StatusEffect.java b/core/src/io/anuke/mindustry/type/StatusEffect.java index 706c2a1ca8..482f0f03f1 100644 --- a/core/src/io/anuke/mindustry/type/StatusEffect.java +++ b/core/src/io/anuke/mindustry/type/StatusEffect.java @@ -1,46 +1,45 @@ package io.anuke.mindustry.type; -import io.anuke.arc.collection.Array; -import io.anuke.arc.collection.ObjectMap; -import io.anuke.arc.func.Prov; -import io.anuke.arc.graphics.Color; -import io.anuke.arc.math.Mathf; +import io.anuke.arc.collection.*; +import io.anuke.arc.graphics.*; +import io.anuke.arc.math.*; import io.anuke.arc.util.*; -import io.anuke.mindustry.content.Fx; -import io.anuke.mindustry.entities.Effects; -import io.anuke.mindustry.entities.Effects.Effect; -import io.anuke.mindustry.entities.type.Unit; -import io.anuke.mindustry.entities.units.Statuses.StatusEntry; -import io.anuke.mindustry.ctype.Content; - -public class StatusEffect extends Content{ - public float damageMultiplier = 1f; //damage dealt - public float armorMultiplier = 1f; //armor points - public float speedMultiplier = 1f; //speed - public Color color = Color.white.cpy(); //tint color - - /** Transition handler map. */ - private ObjectMap transitions = new ObjectMap<>(); - /** - * Transition initializer array. Since provided effects are only available after init(), this handles putting things - * in the transitions map. - */ - private Array transInit = new Array<>(); +import io.anuke.mindustry.content.*; +import io.anuke.mindustry.ctype.*; +import io.anuke.mindustry.entities.*; +import io.anuke.mindustry.entities.Effects.*; +import io.anuke.mindustry.entities.type.*; +import io.anuke.mindustry.entities.units.Statuses.*; +public class StatusEffect extends MappableContent{ + /** Damage dealt by the unit with the effect. */ + public float damageMultiplier = 1f; + /** Unit armor multiplier. */ + public float armorMultiplier = 1f; + /** Unit speed multiplier (buggy) */ + public float speedMultiplier = 1f; /** Damage per frame. */ - protected float damage; + public float damage; + /** Tint color of effect. */ + public Color color = Color.white.cpy(); /** Effect that happens randomly on top of the affected unit. */ - protected Effect effect = Fx.none; + public Effect effect = Fx.none; + /** Transition handler map. */ + protected ObjectMap transitions = new ObjectMap<>(); + /** Called on init. */ + protected Runnable initblock = () -> {}; + + public StatusEffect(String name){ + super(name); + } - @SuppressWarnings("unchecked") @Override public void init(){ - for(Object[] pair : transInit){ - Prov sup = (Prov)pair[0]; - TransitionHandler handler = (TransitionHandler)pair[1]; - transitions.put(sup.get(), handler); - } - transInit.clear(); + initblock.run(); + } + + public void init(Runnable run){ + this.initblock = run; } /** Runs every tick on the affected unit while time is greater than 0. */ @@ -56,20 +55,19 @@ public class StatusEffect extends Content{ } } - protected void trans(Prov effect, TransitionHandler handler){ - transInit.add(new Object[]{effect, handler}); + protected void trans(StatusEffect effect, TransitionHandler handler){ + transitions.put(effect, handler); } - @SuppressWarnings("unchecked") - protected void opposite(Prov... effect){ - for(Prov sup : effect){ + protected void opposite(StatusEffect... effect){ + for(StatusEffect sup : effect){ trans(sup, (unit, time, newTime, result) -> { time -= newTime * 0.5f; if(time > 0){ result.set(this, time); return; } - result.set(sup.get(), newTime); + result.set(sup, newTime); }); } } diff --git a/core/src/io/anuke/mindustry/type/UnitType.java b/core/src/io/anuke/mindustry/type/UnitType.java index b2602a16ad..1a7335b032 100644 --- a/core/src/io/anuke/mindustry/type/UnitType.java +++ b/core/src/io/anuke/mindustry/type/UnitType.java @@ -16,8 +16,7 @@ import io.anuke.mindustry.ui.*; public class UnitType extends UnlockableContent{ public @NonNull TypeID typeID; - public @NonNull - Prov constructor; + public @NonNull Prov constructor; public float health = 60; public float hitsize = 7f; @@ -49,9 +48,8 @@ public class UnitType extends UnlockableContent{ create(mainConstructor); } - public UnitType(String name){ + public UnitType(String name){ super(name); - this.description = Core.bundle.getOrNull("unit." + name + ".description"); } public void create(Prov mainConstructor){ @@ -65,11 +63,6 @@ public class UnitType extends UnlockableContent{ ContentDisplay.displayUnit(table, this); } - @Override - public String localizedName(){ - return Core.bundle.get("unit." + name + ".name"); - } - @Override public void load(){ weapon.load(); diff --git a/core/src/io/anuke/mindustry/type/Zone.java b/core/src/io/anuke/mindustry/type/Zone.java index e0084f0b73..c60249b223 100644 --- a/core/src/io/anuke/mindustry/type/Zone.java +++ b/core/src/io/anuke/mindustry/type/Zone.java @@ -205,11 +205,6 @@ public class Zone extends UnlockableContent{ public void displayInfo(Table table){ } - @Override - public String localizedName(){ - return Core.bundle.get("zone." + name + ".name"); - } - @Override public ContentType getContentType(){ return ContentType.zone; diff --git a/core/src/io/anuke/mindustry/ui/ContentDisplay.java b/core/src/io/anuke/mindustry/ui/ContentDisplay.java index a184e86aaf..36f100d6a3 100644 --- a/core/src/io/anuke/mindustry/ui/ContentDisplay.java +++ b/core/src/io/anuke/mindustry/ui/ContentDisplay.java @@ -66,7 +66,7 @@ public class ContentDisplay{ table.table(title -> { title.addImage(item.icon(Cicon.xlarge)).size(8 * 6); - title.add("[accent]" + item.localizedName()).padLeft(5); + title.add("[accent]" + item.localizedName).padLeft(5); }); table.row(); @@ -85,6 +85,9 @@ public class ContentDisplay{ table.left().defaults().fillX(); + table.add(Core.bundle.format("item.corestorable", item.type == ItemType.material ? Core.bundle.format("yes") : Core.bundle.format("no"))); + table.row(); + table.add(Core.bundle.format("item.explosiveness", (int)(item.explosiveness * 100))); table.row(); table.add(Core.bundle.format("item.flammability", (int)(item.flammability * 100))); @@ -97,7 +100,7 @@ public class ContentDisplay{ table.table(title -> { title.addImage(liquid.icon(Cicon.xlarge)).size(8 * 6); - title.add("[accent]" + liquid.localizedName()).padLeft(5); + title.add("[accent]" + liquid.localizedName).padLeft(5); }); table.row(); @@ -131,7 +134,7 @@ public class ContentDisplay{ public static void displayMech(Table table, Mech mech){ table.table(title -> { title.addImage(mech.icon(Cicon.xlarge)).size(8 * 6); - title.add("[accent]" + mech.localizedName()).padLeft(5); + title.add("[accent]" + mech.localizedName).padLeft(5); }); table.left().defaults().left(); @@ -179,7 +182,7 @@ public class ContentDisplay{ public static void displayUnit(Table table, UnitType unit){ table.table(title -> { title.addImage(unit.icon(Cicon.xlarge)).size(8 * 6); - title.add("[accent]" + unit.localizedName()).padLeft(5); + title.add("[accent]" + unit.localizedName).padLeft(5); }); table.row(); diff --git a/core/src/io/anuke/mindustry/ui/ItemDisplay.java b/core/src/io/anuke/mindustry/ui/ItemDisplay.java index 1efcd10919..a55a5034c5 100644 --- a/core/src/io/anuke/mindustry/ui/ItemDisplay.java +++ b/core/src/io/anuke/mindustry/ui/ItemDisplay.java @@ -15,7 +15,7 @@ public class ItemDisplay extends Table{ public ItemDisplay(Item item, int amount, boolean showName){ add(new ItemImage(new ItemStack(item, amount))).size(8 * 4).padRight(amount > 99 ? 12 : 0); - if(showName) add(item.localizedName()).padLeft(4 + amount > 99 ? 4 : 0); + if(showName) add(item.localizedName).padLeft(4 + amount > 99 ? 4 : 0); this.item = item; this.amount = amount; diff --git a/core/src/io/anuke/mindustry/ui/ItemsDisplay.java b/core/src/io/anuke/mindustry/ui/ItemsDisplay.java index f10b17e3eb..e198673c08 100644 --- a/core/src/io/anuke/mindustry/ui/ItemsDisplay.java +++ b/core/src/io/anuke/mindustry/ui/ItemsDisplay.java @@ -29,7 +29,7 @@ public class ItemsDisplay extends Table{ if(item.type == ItemType.material && data.isUnlocked(item)){ 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.add(item.localizedName).color(Color.lightGray).left(); t.row(); } } diff --git a/core/src/io/anuke/mindustry/ui/LiquidDisplay.java b/core/src/io/anuke/mindustry/ui/LiquidDisplay.java index be4d22b124..741491d9b9 100644 --- a/core/src/io/anuke/mindustry/ui/LiquidDisplay.java +++ b/core/src/io/anuke/mindustry/ui/LiquidDisplay.java @@ -33,6 +33,6 @@ public class LiquidDisplay extends Table{ add(StatUnit.perSecond.localized()).padLeft(2).padRight(5).color(Color.lightGray); } - add(liquid.localizedName()); + add(liquid.localizedName); } } diff --git a/core/src/io/anuke/mindustry/ui/Styles.java b/core/src/io/anuke/mindustry/ui/Styles.java index 29c1321009..af519a4b14 100644 --- a/core/src/io/anuke/mindustry/ui/Styles.java +++ b/core/src/io/anuke/mindustry/ui/Styles.java @@ -201,6 +201,9 @@ public class Styles{ down = flatDown; up = black6; over = flatOver; + disabled = black8; + imageDisabledColor = Color.lightGray; + imageUpColor = Color.white; }}; clearToggleTransi = new ImageButtonStyle(){{ down = flatDown; diff --git a/core/src/io/anuke/mindustry/ui/dialogs/AboutDialog.java b/core/src/io/anuke/mindustry/ui/dialogs/AboutDialog.java index a8e5212307..83d44a97f2 100644 --- a/core/src/io/anuke/mindustry/ui/dialogs/AboutDialog.java +++ b/core/src/io/anuke/mindustry/ui/dialogs/AboutDialog.java @@ -16,7 +16,7 @@ import static io.anuke.mindustry.Vars.*; public class AboutDialog extends FloatingDialog{ private Array contributors = new Array<>(); - private static ObjectSet bannedItems = ObjectSet.with("google-play", "itch.io", "dev-builds"); + private static ObjectSet bannedItems = ObjectSet.with("google-play", "itch.io", "dev-builds", "f-droid"); public AboutDialog(){ super("$about.button"); diff --git a/core/src/io/anuke/mindustry/ui/dialogs/DatabaseDialog.java b/core/src/io/anuke/mindustry/ui/dialogs/DatabaseDialog.java index faa3f6f39a..65adb85efa 100644 --- a/core/src/io/anuke/mindustry/ui/dialogs/DatabaseDialog.java +++ b/core/src/io/anuke/mindustry/ui/dialogs/DatabaseDialog.java @@ -66,7 +66,7 @@ public class DatabaseDialog extends FloatingDialog{ if(unlocked(unlock)){ image.clicked(() -> Vars.ui.content.show(unlock)); - image.addListener(new Tooltip(t -> t.background(Tex.button).add(unlock.localizedName()))); + image.addListener(new Tooltip(t -> t.background(Tex.button).add(unlock.localizedName))); } if((++count) % maxWidth == 0){ diff --git a/core/src/io/anuke/mindustry/ui/dialogs/DeployDialog.java b/core/src/io/anuke/mindustry/ui/dialogs/DeployDialog.java index 056d0cfc24..a84ff1a73c 100644 --- a/core/src/io/anuke/mindustry/ui/dialogs/DeployDialog.java +++ b/core/src/io/anuke/mindustry/ui/dialogs/DeployDialog.java @@ -155,7 +155,7 @@ public class DeployDialog extends FloatingDialog{ }).color(Color.darkGray).grow())); } - TextButton button = Elements.newButton(Core.bundle.format("resume", slot.getZone().localizedName()), Styles.squaret, () -> { + TextButton button = Elements.newButton(Core.bundle.format("resume", slot.getZone().localizedName), Styles.squaret, () -> { control.saves.getZoneSlot().cautiousLoad(() -> { hide(); ui.loadAnd(() -> { @@ -232,7 +232,7 @@ public class DeployDialog extends FloatingDialog{ }); if(zone.unlocked() && !hidden(zone)){ - button.labelWrap(zone.localizedName()).style(Styles.outlineLabel).width(140).growX().get().setAlignment(Align.center); + button.labelWrap(zone.localizedName).style(Styles.outlineLabel).width(140).growX().get().setAlignment(Align.center); }else{ Cons flasher = zone.canUnlock() && !hidden(zone) ? e -> e.update(() -> e.getColor().set(Color.white).lerp(Pal.accent, Mathf.absin(3f, 1f))) : e -> {}; flasher.get(button.addImage(Icon.locked).get()); diff --git a/core/src/io/anuke/mindustry/ui/dialogs/HostDialog.java b/core/src/io/anuke/mindustry/ui/dialogs/HostDialog.java index e3132a69ba..200986f839 100644 --- a/core/src/io/anuke/mindustry/ui/dialogs/HostDialog.java +++ b/core/src/io/anuke/mindustry/ui/dialogs/HostDialog.java @@ -74,6 +74,9 @@ public class HostDialog extends FloatingDialog{ ui.showCustomConfirm("$setting.publichost.name", "$public.confirm", "$yes", "$no", () -> { Core.settings.putSave("publichost", true); platform.updateLobby(); + }, () -> { + Core.settings.putSave("publichost", false); + 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 e8af992660..490d2b370f 100644 --- a/core/src/io/anuke/mindustry/ui/dialogs/JoinDialog.java +++ b/core/src/io/anuke/mindustry/ui/dialogs/JoinDialog.java @@ -9,6 +9,7 @@ import io.anuke.arc.math.*; import io.anuke.arc.scene.ui.*; import io.anuke.arc.scene.ui.layout.*; import io.anuke.arc.util.*; +import io.anuke.arc.util.serialization.*; import io.anuke.mindustry.*; import io.anuke.mindustry.core.*; import io.anuke.mindustry.gen.*; @@ -359,6 +360,20 @@ public class JoinDialog extends FloatingDialog{ @SuppressWarnings("unchecked") private void loadServers(){ servers = Core.settings.getObject("server-list", Array.class, Array::new); + + //get servers + Core.net.httpGet(serverJsonURL, result -> { + try{ + Jval val = Jval.read(result.getResultAsString()); + Core.app.post(() -> { + try{ + defaultServers.clear(); + val.asArray().each(child -> defaultServers.add(child.getString("address", ""))); + Log.info("Fetched {0} global servers.", defaultServers.size); + }catch(Throwable ignored){} + }); + }catch(Throwable ignored){} + }, t -> {}); } private void saveServers(){ diff --git a/core/src/io/anuke/mindustry/ui/dialogs/MapsDialog.java b/core/src/io/anuke/mindustry/ui/dialogs/MapsDialog.java index a2fb508fcb..4fd821d051 100644 --- a/core/src/io/anuke/mindustry/ui/dialogs/MapsDialog.java +++ b/core/src/io/anuke/mindustry/ui/dialogs/MapsDialog.java @@ -143,7 +143,7 @@ public class MapsDialog extends FloatingDialog{ button.row(); button.stack(new Image(map.safeTexture()).setScaling(Scaling.fit), new BorderImage(map.safeTexture()).setScaling(Scaling.fit)).size(mapsize - 20f); button.row(); - button.add(map.custom ? "$custom" : map.workshop ? "$workshop" : "$builtin").color(Color.gray).padTop(3); + button.add(map.custom ? "$custom" : map.workshop ? "$workshop" : map.mod != null ? "[lightgray]" + map.mod.meta.displayName() : "$builtin").color(Color.gray).padTop(3); i++; } diff --git a/core/src/io/anuke/mindustry/ui/dialogs/ModsDialog.java b/core/src/io/anuke/mindustry/ui/dialogs/ModsDialog.java index 50164a7dff..efbb02693a 100644 --- a/core/src/io/anuke/mindustry/ui/dialogs/ModsDialog.java +++ b/core/src/io/anuke/mindustry/ui/dialogs/ModsDialog.java @@ -126,13 +126,13 @@ public class ModsDialog extends FloatingDialog{ t.margin(14f).left(); t.table(title -> { title.left(); - title.add("[accent]" + mod.meta.name + "[lightgray] v" + mod.meta.version + (mod.enabled() ? "" : "\n" + Core.bundle.get("mod.disabled") + "")).width(200f).wrap(); + title.add("[accent]" + mod.meta.displayName() + "[lightgray] v" + mod.meta.version + (mod.enabled() ? "" : "\n" + Core.bundle.get("mod.disabled") + "")).width(200f).wrap(); 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); + }).height(50f).margin(8f).width(130f).disabled(!mod.isSupported()); if(steam && !mod.hasSteamID()){ title.addImageButton(Icon.loadMapSmall, Styles.cleari, () -> { @@ -161,7 +161,10 @@ public class ModsDialog extends FloatingDialog{ t.labelWrap("[lightgray]" + mod.meta.description).growX(); t.row(); } - if(mod.hasUnmetDependencies()){ + if(!mod.isSupported()){ + t.labelWrap(Core.bundle.format("mod.requiresversion", mod.meta.minGameVersion)).growX(); + t.row(); + }else if(mod.hasUnmetDependencies()){ t.labelWrap(Core.bundle.format("mod.missingdependencies", mod.missingDependencies.toString(", "))).growX(); t.row(); } diff --git a/core/src/io/anuke/mindustry/ui/dialogs/SchematicsDialog.java b/core/src/io/anuke/mindustry/ui/dialogs/SchematicsDialog.java index 0109b959e4..4e10a46160 100644 --- a/core/src/io/anuke/mindustry/ui/dialogs/SchematicsDialog.java +++ b/core/src/io/anuke/mindustry/ui/dialogs/SchematicsDialog.java @@ -62,12 +62,12 @@ public class SchematicsDialog extends FloatingDialog{ t.clear(); int i = 0; - if(!schematics.all().contains(s -> search.isEmpty() || s.name().contains(search))){ + if(!schematics.all().contains(s -> search.isEmpty() || s.name().toLowerCase().contains(search.toLowerCase()))){ t.add("$none"); } for(Schematic s : schematics.all()){ - if(!search.isEmpty() && !s.name().contains(search)) continue; + if(!search.isEmpty() && !s.name().toLowerCase().contains(search.toLowerCase())) continue; Button[] sel = {null}; sel[0] = t.addButton(b -> { @@ -99,10 +99,14 @@ public class SchematicsDialog extends FloatingDialog{ buttons.addImageButton(Icon.linkSmall, style, () -> platform.viewListing(s)); }else{ buttons.addImageButton(Icon.trash16Small, style, () -> { - ui.showConfirm("$confirm", "$schematic.delete.confirm", () -> { - schematics.remove(s); - rebuildPane[0].run(); - }); + if(s.mod != null){ + ui.showInfo(Core.bundle.format("mod.item.remove", s.mod.meta.displayName())); + }else{ + ui.showConfirm("$confirm", "$schematic.delete.confirm", () -> { + schematics.remove(s); + rebuildPane[0].run(); + }); + } }); } @@ -154,6 +158,7 @@ public class SchematicsDialog extends FloatingDialog{ dialog.hide(); try{ Schematic s = Schematics.readBase64(Core.app.getClipboardText()); + s.removeSteamID(); schematics.add(s); setup(); ui.showInfoFade("$schematic.saved"); @@ -168,6 +173,7 @@ public class SchematicsDialog extends FloatingDialog{ try{ Schematic s = Schematics.read(file); + s.removeSteamID(); schematics.add(s); setup(); showInfo(s); diff --git a/core/src/io/anuke/mindustry/ui/dialogs/TechTreeDialog.java b/core/src/io/anuke/mindustry/ui/dialogs/TechTreeDialog.java index a9b8282a36..7a60ad2724 100644 --- a/core/src/io/anuke/mindustry/ui/dialogs/TechTreeDialog.java +++ b/core/src/io/anuke/mindustry/ui/dialogs/TechTreeDialog.java @@ -337,7 +337,7 @@ public class TechTreeDialog extends FloatingDialog{ t.table(list -> { list.left(); list.addImage(req.item.icon(Cicon.small)).size(8 * 3).padRight(3); - list.add(req.item.localizedName()).color(Color.lightGray); + 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)); }).fillX().left(); diff --git a/core/src/io/anuke/mindustry/ui/dialogs/ZoneInfoDialog.java b/core/src/io/anuke/mindustry/ui/dialogs/ZoneInfoDialog.java index 32d2e264f1..1bf34b0855 100644 --- a/core/src/io/anuke/mindustry/ui/dialogs/ZoneInfoDialog.java +++ b/core/src/io/anuke/mindustry/ui/dialogs/ZoneInfoDialog.java @@ -96,7 +96,7 @@ public class ZoneInfoDialog extends FloatingDialog{ }).growX(); }else{ - cont.add(zone.localizedName()).color(Pal.accent).growX().center(); + cont.add(zone.localizedName).color(Pal.accent).growX().center(); cont.row(); cont.addImage().color(Pal.accent).height(3).pad(6).growX(); cont.row(); diff --git a/core/src/io/anuke/mindustry/ui/fragments/BlockConfigFragment.java b/core/src/io/anuke/mindustry/ui/fragments/BlockConfigFragment.java index 7644ec9559..663c275e11 100644 --- a/core/src/io/anuke/mindustry/ui/fragments/BlockConfigFragment.java +++ b/core/src/io/anuke/mindustry/ui/fragments/BlockConfigFragment.java @@ -50,7 +50,7 @@ public class BlockConfigFragment extends Fragment{ table.visible(true); table.clear(); - tile.block().buildTable(tile, table); + tile.block().buildConfiguration(tile, table); table.pack(); table.setTransform(true); table.actions(Actions.scaleTo(0f, 1f), Actions.visible(true), diff --git a/core/src/io/anuke/mindustry/ui/fragments/BlockInventoryFragment.java b/core/src/io/anuke/mindustry/ui/fragments/BlockInventoryFragment.java index 1c663f2b4a..1ea3623790 100644 --- a/core/src/io/anuke/mindustry/ui/fragments/BlockInventoryFragment.java +++ b/core/src/io/anuke/mindustry/ui/fragments/BlockInventoryFragment.java @@ -189,9 +189,9 @@ public class BlockInventoryFragment extends Fragment{ private String round(float f){ f = (int)f; if(f >= 1000000){ - return (int)(f / 1000000f) + "[gray]mil[]"; + return (int)(f / 1000000f) + "[gray]" + Core.bundle.getOrNull("unit.millions") + "[]"; }else if(f >= 1000){ - return (int)(f / 1000) + "k"; + return (int)(f / 1000) + Core.bundle.getOrNull("unit.thousands"); }else{ return (int)f + ""; } diff --git a/core/src/io/anuke/mindustry/ui/fragments/ChatFragment.java b/core/src/io/anuke/mindustry/ui/fragments/ChatFragment.java index 2801d10149..c7c168bc84 100644 --- a/core/src/io/anuke/mindustry/ui/fragments/ChatFragment.java +++ b/core/src/io/anuke/mindustry/ui/fragments/ChatFragment.java @@ -24,7 +24,7 @@ public class ChatFragment extends Table{ private final static int messagesShown = 10; private Array messages = new Array<>(); private float fadetime; - private boolean chatOpen = false; + private boolean shown = false; private TextField chatfield; private Label fieldlabel = new Label(">"); private BitmapFont font; @@ -52,7 +52,7 @@ public class ChatFragment extends Table{ if(!net.active() && messages.size > 0){ clearMessages(); - if(chatOpen){ + if(shown){ hide(); } } @@ -66,7 +66,7 @@ public class ChatFragment extends Table{ toggle(); } - if(chatOpen){ + if(shown){ if(input.keyTap(Binding.chat_history_prev) && historyPos < history.size - 1){ if(historyPos == 0) history.set(0, chatfield.getText()); historyPos++; @@ -123,7 +123,7 @@ public class ChatFragment extends Table{ Draw.color(shadowColor); - if(chatOpen){ + if(shown){ Fill.crect(offsetx, chatfield.getY(), chatfield.getWidth() + 15f, chatfield.getHeight() - 1); } @@ -131,14 +131,14 @@ public class ChatFragment extends Table{ float spacing = chatspace; - chatfield.visible(chatOpen); - fieldlabel.visible(chatOpen); + chatfield.visible(shown); + fieldlabel.visible(shown); Draw.color(shadowColor); Draw.alpha(shadowColor.a * opacity); float theight = offsety + spacing + getMarginBottom(); - for(int i = scrollPos; i < messages.size && i < messagesShown + scrollPos && (i < fadetime || chatOpen); i++){ + for(int i = scrollPos; i < messages.size && i < messagesShown + scrollPos && (i < fadetime || shown); i++){ layout.setText(font, messages.get(i).formattedMessage, Color.white, textWidth, Align.bottomLeft, true); theight += layout.height + textspacing; @@ -147,7 +147,7 @@ public class ChatFragment extends Table{ font.getCache().clear(); font.getCache().addText(messages.get(i).formattedMessage, fontoffsetx + offsetx, offsety + theight, textWidth, Align.bottomLeft, true); - if(!chatOpen && fadetime - i < 1f && fadetime - i >= 0f){ + if(!shown && fadetime - i < 1f && fadetime - i >= 0f){ font.getCache().setAlphas((fadetime - i) * opacity); Draw.color(0, 0, 0, shadowColor.a * (fadetime - i) * opacity); }else{ @@ -163,7 +163,7 @@ public class ChatFragment extends Table{ Draw.color(); - if(fadetime > 0 && !chatOpen) + if(fadetime > 0 && !shown) fadetime -= Time.delta() / 180f; } @@ -180,9 +180,9 @@ public class ChatFragment extends Table{ public void toggle(){ - if(!chatOpen){ + if(!shown){ scene.setKeyboardFocus(chatfield); - chatOpen = !chatOpen; + shown = !shown; if(mobile){ TextInput input = new TextInput(); input.maxLength = maxTextLength; @@ -199,7 +199,7 @@ public class ChatFragment extends Table{ } }else{ scene.setKeyboardFocus(null); - chatOpen = !chatOpen; + shown = !shown; scrollPos = 0; sendMessage(); } @@ -207,7 +207,7 @@ public class ChatFragment extends Table{ public void hide(){ scene.setKeyboardFocus(null); - chatOpen = false; + shown = false; clearChatInput(); } @@ -222,12 +222,8 @@ public class ChatFragment extends Table{ chatfield.setText(""); } - public boolean chatOpen(){ - return chatOpen; - } - - public int getMessagesSize(){ - return messages.size; + public boolean shown(){ + return shown; } public void addMessage(String message, String sender){ diff --git a/core/src/io/anuke/mindustry/ui/fragments/HudFragment.java b/core/src/io/anuke/mindustry/ui/fragments/HudFragment.java index caca0a81a9..b2c60deca9 100644 --- a/core/src/io/anuke/mindustry/ui/fragments/HudFragment.java +++ b/core/src/io/anuke/mindustry/ui/fragments/HudFragment.java @@ -83,7 +83,7 @@ public class HudFragment extends Fragment{ select.addImageButton(Icon.chatSmall, style,() -> { if(net.active() && mobile){ - if(ui.chatfrag.chatOpen()){ + if(ui.chatfrag.shown()){ ui.chatfrag.hide(); }else{ ui.chatfrag.toggle(); @@ -131,7 +131,7 @@ public class HudFragment extends Fragment{ } cont.update(() -> { - if(Core.input.keyTap(Binding.toggle_menus) && !ui.chatfrag.chatOpen() && !Core.scene.hasDialog() && !(Core.scene.getKeyboardFocus() instanceof TextField)){ + if(Core.input.keyTap(Binding.toggle_menus) && !ui.chatfrag.shown() && !Core.scene.hasDialog() && !(Core.scene.getKeyboardFocus() instanceof TextField)){ toggleMenus(); } }); @@ -345,7 +345,7 @@ public class HudFragment extends Fragment{ @Remote(targets = Loc.both, forward = true, called = Loc.both) public static void setPlayerTeamEditor(Player player, Team team){ - if(state.isEditor()){ + if(state.isEditor() && player != null){ player.setTeam(team); } } diff --git a/core/src/io/anuke/mindustry/ui/fragments/MenuFragment.java b/core/src/io/anuke/mindustry/ui/fragments/MenuFragment.java index 9229546fe0..b18be4b27e 100644 --- a/core/src/io/anuke/mindustry/ui/fragments/MenuFragment.java +++ b/core/src/io/anuke/mindustry/ui/fragments/MenuFragment.java @@ -17,7 +17,6 @@ import io.anuke.mindustry.gen.*; import io.anuke.mindustry.graphics.*; import io.anuke.mindustry.ui.*; -import static io.anuke.arc.Core.assets; import static io.anuke.mindustry.Vars.*; public class MenuFragment extends Fragment{ @@ -26,8 +25,6 @@ public class MenuFragment extends Fragment{ private MenuRenderer renderer; public MenuFragment(){ - assets.load("sprites/logo.png", Texture.class); - assets.finishLoading(); Events.on(DisposeEvent.class, event -> { renderer.dispose(); }); @@ -67,7 +64,7 @@ public class MenuFragment extends Fragment{ String versionText = "[#ffffffba]" + ((Version.build == -1) ? "[#fc8140aa]custom build" : (Version.type.equals("official") ? Version.modifier : Version.type) + " build " + Version.build + (Version.revision == 0 ? "" : "." + Version.revision)); parent.fill((x, y, w, h) -> { - Texture logo = Core.assets.get("sprites/logo.png"); + TextureRegion logo = Core.atlas.find("logo"); float logoscl = Scl.scl(1); float logow = Math.min(logo.getWidth() * logoscl, Core.graphics.getWidth() - Scl.scl(20)); float logoh = logow * (float)logo.getHeight() / logo.getWidth(); @@ -76,7 +73,7 @@ public class MenuFragment extends Fragment{ float fy = (int)(Core.graphics.getHeight() - 6 - logoh) + logoh / 2 - (Core.graphics.isPortrait() ? Scl.scl(30f) : 0f); Draw.color(); - Draw.rect(Draw.wrap(logo), fx, fy, logow, logoh); + Draw.rect(logo, fx, fy, logow, logoh); Fonts.def.setColor(Color.white); Fonts.def.draw(versionText, fx, fy - logoh/2f, Align.center); diff --git a/core/src/io/anuke/mindustry/ui/fragments/PlacementFragment.java b/core/src/io/anuke/mindustry/ui/fragments/PlacementFragment.java index 95bdd5affa..5d8e5ff0e5 100644 --- a/core/src/io/anuke/mindustry/ui/fragments/PlacementFragment.java +++ b/core/src/io/anuke/mindustry/ui/fragments/PlacementFragment.java @@ -103,7 +103,8 @@ public class PlacementFragment extends Fragment{ } } - if(ui.chatfrag.chatOpen()) return false; + if(ui.chatfrag.shown() || Core.scene.hasKeyboard()) return false; + for(int i = 0; i < blockSelect.length; i++){ if(Core.input.keyTap(blockSelect[i])){ if(i > 9) { //select block directionally diff --git a/core/src/io/anuke/mindustry/ui/fragments/ScriptConsoleFragment.java b/core/src/io/anuke/mindustry/ui/fragments/ScriptConsoleFragment.java new file mode 100644 index 0000000000..87b7f76d6e --- /dev/null +++ b/core/src/io/anuke/mindustry/ui/fragments/ScriptConsoleFragment.java @@ -0,0 +1,221 @@ +package io.anuke.mindustry.ui.fragments; + +import io.anuke.arc.*; +import io.anuke.arc.Input.*; +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.scene.*; +import io.anuke.arc.scene.ui.*; +import io.anuke.arc.scene.ui.Label.*; +import io.anuke.arc.scene.ui.layout.*; +import io.anuke.arc.util.*; +import io.anuke.mindustry.*; +import io.anuke.mindustry.input.*; +import io.anuke.mindustry.ui.*; + +import static io.anuke.arc.Core.*; +import static io.anuke.mindustry.Vars.*; + +public class ScriptConsoleFragment extends Table{ + private final static int messagesShown = 30; + private Array messages = new Array<>(); + private boolean open = false, shown; + private TextField chatfield; + private Label fieldlabel = new Label(">"); + private BitmapFont font; + private GlyphLayout layout = new GlyphLayout(); + private float offsetx = Scl.scl(4), offsety = Scl.scl(4), fontoffsetx = Scl.scl(2), chatspace = Scl.scl(50); + private Color shadowColor = new Color(0, 0, 0, 0.4f); + private float textspacing = Scl.scl(10); + private Array history = new Array<>(); + private int historyPos = 0; + private int scrollPos = 0; + private Fragment container = new Fragment(){ + @Override + public void build(Group parent){ + scene.add(ScriptConsoleFragment.this); + } + }; + + public ScriptConsoleFragment(){ + + setFillParent(true); + font = Fonts.def; + + visible(() -> { + if(input.keyTap(Binding.console) && !Vars.net.client() && (scene.getKeyboardFocus() == chatfield || scene.getKeyboardFocus() == null)){ + shown = !shown; + if(shown && !open && enableConsole){ + toggle(); + } + clearChatInput(); + } + + return shown && !Vars.net.active(); + }); + + update(() -> { + if(input.keyTap(Binding.chat) && enableConsole && (scene.getKeyboardFocus() == chatfield || scene.getKeyboardFocus() == null)){ + toggle(); + } + + if(open){ + if(input.keyTap(Binding.chat_history_prev) && historyPos < history.size - 1){ + if(historyPos == 0) history.set(0, chatfield.getText()); + historyPos++; + updateChat(); + } + if(input.keyTap(Binding.chat_history_next) && historyPos > 0){ + historyPos--; + updateChat(); + } + } + + scrollPos = (int)Mathf.clamp(scrollPos + input.axis(Binding.chat_scroll), 0, Math.max(0, messages.size - messagesShown)); + }); + + history.insert(0, ""); + setup(); + } + + public Fragment container(){ + return container; + } + + public void clearMessages(){ + messages.clear(); + history.clear(); + history.insert(0, ""); + } + + private void setup(){ + fieldlabel.setStyle(new LabelStyle(fieldlabel.getStyle())); + fieldlabel.getStyle().font = font; + fieldlabel.setStyle(fieldlabel.getStyle()); + + chatfield = new TextField("", new TextField.TextFieldStyle(scene.getStyle(TextField.TextFieldStyle.class))); + chatfield.setMaxLength(Vars.maxTextLength); + chatfield.getStyle().background = null; + chatfield.getStyle().font = Fonts.chat; + chatfield.getStyle().fontColor = Color.white; + chatfield.setStyle(chatfield.getStyle()); + + bottom().left().marginBottom(offsety).marginLeft(offsetx * 2).add(fieldlabel).padBottom(6f); + + add(chatfield).padBottom(offsety).padLeft(offsetx).growX().padRight(offsetx).height(28); + } + + @Override + public void draw(){ + float opacity = 1f; + float textWidth = graphics.getWidth() - offsetx*2f; + + Draw.color(shadowColor); + + if(open){ + Fill.crect(offsetx, chatfield.getY(), chatfield.getWidth() + 15f, chatfield.getHeight() - 1); + } + + super.draw(); + + float spacing = chatspace; + + chatfield.visible(open); + fieldlabel.visible(open); + + Draw.color(shadowColor); + Draw.alpha(shadowColor.a * opacity); + + float theight = offsety + spacing + getMarginBottom(); + for(int i = scrollPos; i < messages.size && i < messagesShown + scrollPos; i++){ + + layout.setText(font, messages.get(i), Color.white, textWidth, Align.bottomLeft, true); + theight += layout.height + textspacing; + if(i - scrollPos == 0) theight -= textspacing + 1; + + font.getCache().clear(); + font.getCache().addText(messages.get(i), fontoffsetx + offsetx, offsety + theight, textWidth, Align.bottomLeft, true); + + if(!open){ + font.getCache().setAlphas(opacity); + Draw.color(0, 0, 0, shadowColor.a * opacity); + }else{ + font.getCache().setAlphas(opacity); + } + + Fill.crect(offsetx, theight - layout.height - 2, textWidth + Scl.scl(4f), layout.height + textspacing); + Draw.color(shadowColor); + Draw.alpha(opacity * shadowColor.a); + + font.getCache().draw(); + } + + Draw.color(); + } + + private void sendMessage(){ + String message = chatfield.getText(); + clearChatInput(); + + if(message.replaceAll(" ", "").isEmpty()) return; + + history.insert(1, message); + + addMessage("[lightgray]> " + message.replace("[", "[[")); + addMessage(mods.getScripts().runConsole(message).replace("[", "[[")); + } + + public void toggle(){ + + if(!open){ + scene.setKeyboardFocus(chatfield); + open = !open; + if(mobile){ + TextInput input = new TextInput(); + input.maxLength = maxTextLength; + input.accepted = text -> { + chatfield.setText(text); + sendMessage(); + hide(); + Core.input.setOnscreenKeyboardVisible(false); + }; + input.canceled = this::hide; + Core.input.getTextInput(input); + }else{ + chatfield.fireClick(); + } + }else{ + scene.setKeyboardFocus(null); + open = !open; + scrollPos = 0; + sendMessage(); + } + } + + public void hide(){ + scene.setKeyboardFocus(null); + open = false; + clearChatInput(); + } + + public void updateChat(){ + chatfield.setText(history.get(historyPos)); + chatfield.setCursorPosition(chatfield.getText().length()); + } + + public void clearChatInput(){ + historyPos = 0; + history.set(0, ""); + chatfield.setText(""); + } + + public boolean open(){ + return open; + } + + public void addMessage(String message){ + messages.insert(0, message); + } +} diff --git a/core/src/io/anuke/mindustry/world/Block.java b/core/src/io/anuke/mindustry/world/Block.java index f389886f41..e1f7e4763d 100644 --- a/core/src/io/anuke/mindustry/world/Block.java +++ b/core/src/io/anuke/mindustry/world/Block.java @@ -24,6 +24,7 @@ import io.anuke.mindustry.entities.traits.BuilderTrait.*; import io.anuke.mindustry.entities.type.*; import io.anuke.mindustry.gen.*; import io.anuke.mindustry.graphics.*; +import io.anuke.mindustry.graphics.MultiPacker.*; import io.anuke.mindustry.type.*; import io.anuke.mindustry.ui.*; import io.anuke.mindustry.world.blocks.*; @@ -93,6 +94,8 @@ public class Block extends BlockStorage{ public boolean drawLiquidLight = true; /** Whether the config is positional and needs to be shifted. */ public boolean posConfig; + /** Whether to periodically sync this block across the network.*/ + public boolean sync; /** Whether this block uses conveyor-type placement mode.*/ public boolean conveyorPlacement; /** @@ -155,7 +158,6 @@ public class Block extends BlockStorage{ public Block(String name){ super(name); - this.description = Core.bundle.getOrNull("block." + name + ".description"); this.solid = false; } @@ -182,7 +184,7 @@ public class Block extends BlockStorage{ } protected void updatePowerGraph(Tile tile){ - TileEntity entity = tile.entity(); + TileEntity entity = tile.ent(); for(Tile other : getPowerConnections(tile, tempTiles)){ if(other.entity.power != null){ @@ -296,7 +298,7 @@ public class Block extends BlockStorage{ } public void drawLight(Tile tile){ - if(hasLiquids && drawLiquidLight && tile.entity.liquids.current().lightColor.a > 0.001f){ + if(tile.entity != null && hasLiquids && drawLiquidLight && tile.entity.liquids.current().lightColor.a > 0.001f){ drawLiquidLight(tile, tile.entity.liquids.current(), tile.entity.liquids.smoothAmount()); } } @@ -393,11 +395,6 @@ public class Block extends BlockStorage{ return sum / size / size; } - @Override - public String localizedName(){ - return localizedName; - } - @Override public void displayInfo(Table table){ ContentDisplay.displayBlock(table, this); @@ -486,7 +483,7 @@ public class Block extends BlockStorage{ * Called when this block is tapped to build a UI on the table. * {@link #configurable} must return true for this to be called. */ - public void buildTable(Tile tile, Table table){ + public void buildConfiguration(Tile tile, Table table){ } /** Update table alignment after configuring.*/ @@ -550,7 +547,7 @@ public class Block extends BlockStorage{ }else{ current = entity -> entity.liquids.current(); } - bars.add("liquid", entity -> new Bar(() -> entity.liquids.get(current.get(entity)) <= 0.001f ? Core.bundle.get("bar.liquid") : current.get(entity).localizedName(), + bars.add("liquid", entity -> new Bar(() -> entity.liquids.get(current.get(entity)) <= 0.001f ? Core.bundle.get("bar.liquid") : current.get(entity).localizedName, () -> current.get(entity).barColor(), () -> entity.liquids.get(current.get(entity)) / liquidCapacity)); } @@ -755,10 +752,10 @@ public class Block extends BlockStorage{ } @Override - public void createIcons(PixmapPacker packer, PixmapPacker editor){ - super.createIcons(packer, editor); + public void createIcons(MultiPacker packer){ + super.createIcons(packer); - editor.pack(name + "-icon-editor", Core.atlas.getPixmap((AtlasRegion)icon(Cicon.full)).crop()); + packer.add(PageType.editor, name + "-icon-editor", Core.atlas.getPixmap((AtlasRegion)icon(Cicon.full))); if(!synthetic()){ PixmapRegion image = Core.atlas.getPixmap((AtlasRegion)icon(Cicon.full)); @@ -798,7 +795,7 @@ public class Block extends BlockStorage{ } last = out; - packer.pack(name, out); + packer.add(PageType.main, name, out); } if(generatedIcons.length > 1){ @@ -810,7 +807,7 @@ public class Block extends BlockStorage{ base.draw(Core.atlas.getPixmap(generatedIcons[i])); } } - packer.pack("block-" + name + "-full", base); + packer.add(PageType.main, "block-" + name + "-full", base); generatedIcons = null; Arrays.fill(cicons, null); } diff --git a/core/src/io/anuke/mindustry/world/Build.java b/core/src/io/anuke/mindustry/world/Build.java index 5f7834ed25..276caefba7 100644 --- a/core/src/io/anuke/mindustry/world/Build.java +++ b/core/src/io/anuke/mindustry/world/Build.java @@ -39,7 +39,7 @@ public class Build{ Block sub = BuildBlock.get(previous.size); world.setBlock(tile, sub, team, rotation); - tile.entity().setDeconstruct(previous); + tile.ent().setDeconstruct(previous); tile.entity.health = tile.entity.maxHealth() * prevPercent; Core.app.post(() -> Events.fire(new BlockBuildBeginEvent(tile, team, true))); @@ -61,7 +61,7 @@ public class Build{ Block sub = BuildBlock.get(result.size); world.setBlock(tile, sub, team, rotation); - tile.entity().setConstruct(previous, result); + tile.ent().setConstruct(previous, result); Core.app.post(() -> Events.fire(new BlockBuildBeginEvent(tile, team, false))); } diff --git a/core/src/io/anuke/mindustry/world/Tile.java b/core/src/io/anuke/mindustry/world/Tile.java index 06e6cdca81..b3b82a3c45 100644 --- a/core/src/io/anuke/mindustry/world/Tile.java +++ b/core/src/io/anuke/mindustry/world/Tile.java @@ -99,7 +99,7 @@ public class Tile implements Position, TargetTrait{ } @SuppressWarnings("unchecked") - public T entity(){ + public T ent(){ 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 45023deac8..60d99e730c 100644 --- a/core/src/io/anuke/mindustry/world/blocks/BuildBlock.java +++ b/core/src/io/anuke/mindustry/world/blocks/BuildBlock.java @@ -118,19 +118,19 @@ public class BuildBlock extends Block{ @Override public String getDisplayName(Tile tile){ - BuildEntity entity = tile.entity(); + BuildEntity entity = tile.ent(); return Core.bundle.format("block.constructing", entity.cblock == null ? entity.previous.localizedName : entity.cblock.localizedName); } @Override public TextureRegion getDisplayIcon(Tile tile){ - BuildEntity entity = tile.entity(); + BuildEntity entity = tile.ent(); return (entity.cblock == null ? entity.previous : entity.cblock).icon(io.anuke.mindustry.ui.Cicon.full); } @Override public boolean isSolidFor(Tile tile){ - BuildEntity entity = tile.entity(); + BuildEntity entity = tile.ent(); return entity == null || (entity.cblock != null && entity.cblock.solid) || entity.previous == null || entity.previous.solid; } @@ -141,7 +141,7 @@ public class BuildBlock extends Block{ @Override public void tapped(Tile tile, Player player){ - BuildEntity entity = tile.entity(); + BuildEntity entity = tile.ent(); //if the target is constructible, begin constructing if(entity.cblock != null){ @@ -164,7 +164,7 @@ public class BuildBlock extends Block{ @Override public void draw(Tile tile){ - BuildEntity entity = tile.entity(); + BuildEntity entity = tile.ent(); //When breaking, don't draw the previous block... since it's the thing you were breaking if(entity.cblock != null && entity.previous == entity.cblock){ @@ -181,7 +181,7 @@ public class BuildBlock extends Block{ @Override public void drawLayer(Tile tile){ - BuildEntity entity = tile.entity(); + BuildEntity entity = tile.ent(); Shaders.blockbuild.color = Pal.accent; @@ -280,6 +280,10 @@ public class BuildBlock extends Block{ progress = Mathf.clamp(progress - amount); + if(builder instanceof Player){ + builderID = builder.getID(); + } + if(progress <= 0 || state.rules.infiniteResources){ Call.onDeconstructFinish(tile, this.cblock == null ? previous : this.cblock, builderID); } diff --git a/core/src/io/anuke/mindustry/world/blocks/Floor.java b/core/src/io/anuke/mindustry/world/blocks/Floor.java index c293eb5f9d..3ed6edf0d4 100644 --- a/core/src/io/anuke/mindustry/world/blocks/Floor.java +++ b/core/src/io/anuke/mindustry/world/blocks/Floor.java @@ -9,8 +9,10 @@ import io.anuke.arc.math.*; import io.anuke.arc.math.geom.*; import io.anuke.mindustry.content.*; import io.anuke.mindustry.entities.Effects.*; +import io.anuke.mindustry.graphics.*; +import io.anuke.mindustry.graphics.MultiPacker.*; import io.anuke.mindustry.type.*; -import io.anuke.mindustry.ui.Cicon; +import io.anuke.mindustry.ui.*; import io.anuke.mindustry.world.*; import static io.anuke.mindustry.Vars.tilesize; @@ -86,9 +88,9 @@ public class Floor extends Block{ } @Override - public void createIcons(PixmapPacker out, PixmapPacker editor){ - super.createIcons(out, editor); - editor.pack("editor-" + name, Core.atlas.getPixmap((AtlasRegion)icon(Cicon.full)).crop()); + public void createIcons(MultiPacker packer){ + super.createIcons(packer); + packer.add(PageType.editor, "editor-" + name, Core.atlas.getPixmap((AtlasRegion)icon(Cicon.full)).crop()); if(blendGroup != this){ return; @@ -97,7 +99,7 @@ public class Floor extends Block{ if(variants > 0){ for(int i = 0; i < variants; i++){ String rname = name + (i + 1); - editor.pack("editor-" + rname, Core.atlas.getPixmap(rname).crop()); + packer.add(PageType.editor, "editor-" + rname, Core.atlas.getPixmap(rname).crop()); } } @@ -114,7 +116,7 @@ public class Floor extends Block{ } } - out.pack(name + "-edge", result); + packer.add(PageType.environment, name + "-edge", result); } @Override diff --git a/core/src/io/anuke/mindustry/world/blocks/OreBlock.java b/core/src/io/anuke/mindustry/world/blocks/OreBlock.java index cf4d45524c..7270ec7aa0 100644 --- a/core/src/io/anuke/mindustry/world/blocks/OreBlock.java +++ b/core/src/io/anuke/mindustry/world/blocks/OreBlock.java @@ -4,6 +4,8 @@ import io.anuke.annotations.Annotations.*; import io.anuke.arc.*; import io.anuke.arc.graphics.*; import io.anuke.arc.graphics.g2d.*; +import io.anuke.mindustry.graphics.*; +import io.anuke.mindustry.graphics.MultiPacker.*; import io.anuke.mindustry.type.*; import io.anuke.mindustry.world.*; @@ -14,7 +16,7 @@ public class OreBlock extends OverlayFloor{ public OreBlock(Item ore){ super("ore-" + ore.name); - this.localizedName = ore.localizedName(); + this.localizedName = ore.localizedName; this.itemDrop = ore; this.variants = 3; this.color.set(ore.color); @@ -27,14 +29,14 @@ public class OreBlock extends OverlayFloor{ } public void setup(Item ore){ - this.localizedName = ore.localizedName(); + this.localizedName = ore.localizedName; this.itemDrop = ore; this.color.set(ore.color); } @Override @OverrideCallSuper - public void createIcons(PixmapPacker out, PixmapPacker editor){ + public void createIcons(MultiPacker packer){ for(int i = 0; i < variants; i++){ Pixmap image = new Pixmap(32, 32); PixmapRegion shadow = Core.atlas.getPixmap(itemDrop.name + (i + 1)); @@ -55,12 +57,12 @@ public class OreBlock extends OverlayFloor{ image.draw(shadow); - out.pack(name + (i + 1), image); - editor.pack("editor-" + name + (i + 1), image); + packer.add(PageType.environment, name + (i + 1), image); + packer.add(PageType.editor, "editor-" + name + (i + 1), image); if(i == 0){ - editor.pack("editor-block-" + name + "-full", image); - out.pack("block-" + name + "-full", image); + packer.add(PageType.editor, "editor-block-" + name + "-full", image); + packer.add(PageType.main, "block-" + name + "-full", image); } } } @@ -78,6 +80,6 @@ public class OreBlock extends OverlayFloor{ @Override public String getDisplayName(Tile tile){ - return itemDrop.localizedName(); + return itemDrop.localizedName; } } diff --git a/core/src/io/anuke/mindustry/world/blocks/defense/DeflectorWall.java b/core/src/io/anuke/mindustry/world/blocks/defense/DeflectorWall.java index 1dff9f636c..3cc6d177f0 100644 --- a/core/src/io/anuke/mindustry/world/blocks/defense/DeflectorWall.java +++ b/core/src/io/anuke/mindustry/world/blocks/defense/DeflectorWall.java @@ -27,7 +27,7 @@ public class DeflectorWall extends Wall{ public void draw(Tile tile){ super.draw(tile); - DeflectorEntity entity = tile.entity(); + DeflectorEntity entity = tile.ent(); if(entity.hit < 0.0001f) return; diff --git a/core/src/io/anuke/mindustry/world/blocks/defense/Door.java b/core/src/io/anuke/mindustry/world/blocks/defense/Door.java index b0c83fba9d..e8bfd2c4b4 100644 --- a/core/src/io/anuke/mindustry/world/blocks/defense/Door.java +++ b/core/src/io/anuke/mindustry/world/blocks/defense/Door.java @@ -18,11 +18,11 @@ import java.io.*; import static io.anuke.mindustry.Vars.*; public class Door extends Wall{ - protected final Rectangle rect = new Rectangle(); + protected final static Rectangle rect = new Rectangle(); - protected int timerToggle = timers++; - protected Effect openfx = Fx.dooropen; - protected Effect closefx = Fx.doorclose; + public final int timerToggle = timers++; + public Effect openfx = Fx.dooropen; + public Effect closefx = Fx.doorclose; protected TextureRegion openRegion; @@ -36,7 +36,7 @@ public class Door extends Wall{ @Remote(called = Loc.server) public static void onDoorToggle(Player player, Tile tile, boolean open){ - DoorEntity entity = tile.entity(); + DoorEntity entity = tile.ent(); if(entity != null){ entity.open = open; Door door = (Door)tile.block(); @@ -59,7 +59,7 @@ public class Door extends Wall{ @Override public void draw(Tile tile){ - DoorEntity entity = tile.entity(); + DoorEntity entity = tile.ent(); if(!entity.open){ Draw.rect(region, tile.drawx(), tile.drawy()); @@ -75,13 +75,13 @@ public class Door extends Wall{ @Override public boolean isSolidFor(Tile tile){ - DoorEntity entity = tile.entity(); + DoorEntity entity = tile.ent(); return !entity.open; } @Override public void tapped(Tile tile, Player player){ - DoorEntity entity = tile.entity(); + DoorEntity entity = tile.ent(); if((Units.anyEntities(tile) && entity.open) || !tile.entity.timer.get(timerToggle, 30f)){ return; diff --git a/core/src/io/anuke/mindustry/world/blocks/defense/ForceProjector.java b/core/src/io/anuke/mindustry/world/blocks/defense/ForceProjector.java index 333d3818ae..466d677b6c 100644 --- a/core/src/io/anuke/mindustry/world/blocks/defense/ForceProjector.java +++ b/core/src/io/anuke/mindustry/world/blocks/defense/ForceProjector.java @@ -21,17 +21,17 @@ import java.io.*; import static io.anuke.mindustry.Vars.*; public class ForceProjector extends Block{ - protected int timerUse = timers++; - protected float phaseUseTime = 350f; + public final int timerUse = timers++; + public float phaseUseTime = 350f; - protected float phaseRadiusBoost = 80f; - protected float radius = 101.7f; - protected float breakage = 550f; - protected float cooldownNormal = 1.75f; - protected float cooldownLiquid = 1.5f; - protected float cooldownBrokenBase = 0.35f; - protected float basePowerDraw = 0.2f; - protected TextureRegion topRegion; + public float phaseRadiusBoost = 80f; + public float radius = 101.7f; + public float breakage = 550f; + public float cooldownNormal = 1.75f; + public float cooldownLiquid = 1.5f; + public float cooldownBrokenBase = 0.35f; + public float basePowerDraw = 0.2f; + public TextureRegion topRegion; private static Tile paramTile; private static ForceProjector paramBlock; @@ -88,7 +88,7 @@ public class ForceProjector extends Block{ @Override public void update(Tile tile){ - ForceEntity entity = tile.entity(); + ForceEntity entity = tile.ent(); if(entity.shield == null){ entity.shield = new ShieldEntity(tile); @@ -99,7 +99,7 @@ public class ForceProjector extends Block{ entity.phaseHeat = Mathf.lerpDelta(entity.phaseHeat, Mathf.num(phaseValid), 0.1f); - if(phaseValid && !entity.broken && entity.timer.get(timerUse, phaseUseTime)){ + if(phaseValid && !entity.broken && entity.timer.get(timerUse, phaseUseTime) && entity.efficiency() > 0){ entity.cons.trigger(); } @@ -170,7 +170,7 @@ public class ForceProjector extends Block{ public void draw(Tile tile){ super.draw(tile); - ForceEntity entity = tile.entity(); + ForceEntity entity = tile.ent(); if(entity.buildup <= 0f) return; Draw.alpha(entity.buildup / breakage * 0.75f); @@ -214,7 +214,7 @@ public class ForceProjector extends Block{ final ForceEntity entity; public ShieldEntity(Tile tile){ - this.entity = tile.entity(); + this.entity = tile.ent(); set(tile.drawx(), tile.drawy()); } diff --git a/core/src/io/anuke/mindustry/world/blocks/defense/MendProjector.java b/core/src/io/anuke/mindustry/world/blocks/defense/MendProjector.java index 5ba2461265..a19d536018 100644 --- a/core/src/io/anuke/mindustry/world/blocks/defense/MendProjector.java +++ b/core/src/io/anuke/mindustry/world/blocks/defense/MendProjector.java @@ -18,19 +18,18 @@ import java.io.*; import static io.anuke.mindustry.Vars.*; public class MendProjector extends Block{ - private static Color color = Color.valueOf("84f491"); - private static Color phase = Color.valueOf("ffd59e"); - private static IntSet healed = new IntSet(); + private static final IntSet healed = new IntSet(); - protected int timerUse = timers++; - - protected TextureRegion topRegion; - protected float reload = 250f; - protected float range = 60f; - protected float healPercent = 12f; - protected float phaseBoost = 12f; - protected float phaseRangeBoost = 50f; - protected float useTime = 400f; + public final int timerUse = timers++; + public Color baseColor = Color.valueOf("84f491"); + public Color phaseColor = Color.valueOf("ffd59e"); + public TextureRegion topRegion; + public float reload = 250f; + public float range = 60f; + public float healPercent = 12f; + public float phaseBoost = 12f; + public float phaseRangeBoost = 50f; + public float useTime = 400f; public MendProjector(String name){ super(name); @@ -65,7 +64,7 @@ public class MendProjector extends Block{ @Override public void update(Tile tile){ - MendEntity entity = tile.entity(); + MendEntity entity = tile.ent(); entity.heat = Mathf.lerpDelta(entity.heat, entity.cons.valid() || tile.isEnemyCheat() ? 1f : 0f, 0.08f); entity.charge += entity.heat * entity.delta(); @@ -92,7 +91,7 @@ public class MendProjector extends Block{ if(other.getTeamID() == tile.getTeamID() && !healed.contains(other.pos()) && other.entity != null && other.entity.health < other.entity.maxHealth()){ other.entity.healBy(other.entity.maxHealth() * (healPercent + entity.phaseHeat * phaseBoost) / 100f * entity.efficiency()); - Effects.effect(Fx.healBlockFull, Tmp.c1.set(color).lerp(phase, entity.phaseHeat), other.drawx(), other.drawy(), other.block().size); + Effects.effect(Fx.healBlockFull, Tmp.c1.set(baseColor).lerp(phaseColor, entity.phaseHeat), other.drawx(), other.drawy(), other.block().size); healed.add(other.pos()); } } @@ -107,20 +106,20 @@ public class MendProjector extends Block{ @Override public void drawSelect(Tile tile){ - MendEntity entity = tile.entity(); + MendEntity entity = tile.ent(); float realRange = range + entity.phaseHeat * phaseRangeBoost; - Drawf.dashCircle(tile.drawx(), tile.drawy(), realRange, color); + Drawf.dashCircle(tile.drawx(), tile.drawy(), realRange, baseColor); } @Override public void draw(Tile tile){ super.draw(tile); - MendEntity entity = tile.entity(); + MendEntity entity = tile.ent(); float f = 1f - (Time.time() / 100f) % 1f; - Draw.color(color, phase, entity.phaseHeat); + Draw.color(baseColor, phaseColor, entity.phaseHeat); Draw.alpha(entity.heat * Mathf.absin(Time.time(), 10f, 1f) * 0.5f); //Draw.blend(Blending.additive); Draw.rect(topRegion, tile.drawx(), tile.drawy()); @@ -135,7 +134,7 @@ public class MendProjector extends Block{ @Override public void drawLight(Tile tile){ - renderer.lights.add(tile.drawx(), tile.drawy(), 50f * tile.entity.efficiency(), color, 0.7f * tile.entity.efficiency()); + renderer.lights.add(tile.drawx(), tile.drawy(), 50f * tile.entity.efficiency(), baseColor, 0.7f * tile.entity.efficiency()); } class MendEntity extends TileEntity{ diff --git a/core/src/io/anuke/mindustry/world/blocks/defense/OverdriveProjector.java b/core/src/io/anuke/mindustry/world/blocks/defense/OverdriveProjector.java index cc8c99a54e..84e88b2f22 100644 --- a/core/src/io/anuke/mindustry/world/blocks/defense/OverdriveProjector.java +++ b/core/src/io/anuke/mindustry/world/blocks/defense/OverdriveProjector.java @@ -16,19 +16,19 @@ import java.io.*; import static io.anuke.mindustry.Vars.*; public class OverdriveProjector extends Block{ - private static Color color = Color.valueOf("feb380"); - private static Color phase = Color.valueOf("ffd59e"); - private static IntSet healed = new IntSet(); + private static final IntSet healed = new IntSet(); - protected int timerUse = timers++; + public final int timerUse = timers++; - protected TextureRegion topRegion; - protected float reload = 60f; - protected float range = 80f; - protected float speedBoost = 1.5f; - protected float speedBoostPhase = 0.75f; - protected float useTime = 400f; - protected float phaseRangeBoost = 20f; + public TextureRegion topRegion; + public float reload = 60f; + public float range = 80f; + public float speedBoost = 1.5f; + public float speedBoostPhase = 0.75f; + public float useTime = 400f; + public float phaseRangeBoost = 20f; + public Color baseColor = Color.valueOf("feb380"); + public Color phaseColor = Color.valueOf("ffd59e"); public OverdriveProjector(String name){ super(name); @@ -69,12 +69,12 @@ public class OverdriveProjector extends Block{ @Override public void drawLight(Tile tile){ - renderer.lights.add(tile.drawx(), tile.drawy(), 50f * tile.entity.efficiency(), color, 0.7f * tile.entity.efficiency()); + renderer.lights.add(tile.drawx(), tile.drawy(), 50f * tile.entity.efficiency(), baseColor, 0.7f * tile.entity.efficiency()); } @Override public void update(Tile tile){ - OverdriveEntity entity = tile.entity(); + OverdriveEntity entity = tile.ent(); entity.heat = Mathf.lerpDelta(entity.heat, entity.cons.valid() ? 1f : 0f, 0.08f); entity.charge += entity.heat * Time.delta(); @@ -115,20 +115,20 @@ public class OverdriveProjector extends Block{ @Override public void drawSelect(Tile tile){ - OverdriveEntity entity = tile.entity(); + OverdriveEntity entity = tile.ent(); float realRange = range + entity.phaseHeat * phaseRangeBoost; - Drawf.dashCircle(tile.drawx(), tile.drawy(), realRange, color); + Drawf.dashCircle(tile.drawx(), tile.drawy(), realRange, baseColor); } @Override public void draw(Tile tile){ super.draw(tile); - OverdriveEntity entity = tile.entity(); + OverdriveEntity entity = tile.ent(); float f = 1f - (Time.time() / 100f) % 1f; - Draw.color(color, phase, entity.phaseHeat); + Draw.color(baseColor, phaseColor, entity.phaseHeat); Draw.alpha(entity.heat * Mathf.absin(Time.time(), 10f, 1f) * 0.5f); Draw.rect(topRegion, tile.drawx(), tile.drawy()); Draw.alpha(1f); diff --git a/core/src/io/anuke/mindustry/world/blocks/defense/ShockMine.java b/core/src/io/anuke/mindustry/world/blocks/defense/ShockMine.java index e834812f5a..de72043c7d 100644 --- a/core/src/io/anuke/mindustry/world/blocks/defense/ShockMine.java +++ b/core/src/io/anuke/mindustry/world/blocks/defense/ShockMine.java @@ -11,13 +11,13 @@ import io.anuke.mindustry.world.Block; import io.anuke.mindustry.world.Tile; public class ShockMine extends Block{ - protected int timerDamage = timers++; + public final int timerDamage = timers++; - protected float cooldown = 80f; - protected float tileDamage = 5f; - protected float damage = 13; - protected int length = 10; - protected int tendrils = 6; + public float cooldown = 80f; + public float tileDamage = 5f; + public float damage = 13; + public int length = 10; + public int tendrils = 6; public ShockMine(String name){ super(name); diff --git a/core/src/io/anuke/mindustry/world/blocks/defense/SurgeWall.java b/core/src/io/anuke/mindustry/world/blocks/defense/SurgeWall.java index 0f51c74b40..a1c52ac823 100644 --- a/core/src/io/anuke/mindustry/world/blocks/defense/SurgeWall.java +++ b/core/src/io/anuke/mindustry/world/blocks/defense/SurgeWall.java @@ -7,9 +7,9 @@ import io.anuke.mindustry.entities.type.TileEntity; import io.anuke.mindustry.graphics.Pal; public class SurgeWall extends Wall{ - protected float lightningChance = 0.05f; - protected float lightningDamage = 15f; - protected int lightningLength = 17; + public float lightningChance = 0.05f; + public float lightningDamage = 15f; + public int lightningLength = 17; public SurgeWall(String name){ super(name); diff --git a/core/src/io/anuke/mindustry/world/blocks/defense/Wall.java b/core/src/io/anuke/mindustry/world/blocks/defense/Wall.java index 70d6b6f91f..8b60ffd0f2 100644 --- a/core/src/io/anuke/mindustry/world/blocks/defense/Wall.java +++ b/core/src/io/anuke/mindustry/world/blocks/defense/Wall.java @@ -9,7 +9,7 @@ import io.anuke.mindustry.world.Tile; import io.anuke.mindustry.world.meta.BlockGroup; public class Wall extends Block{ - protected int variants = 0; + public int variants = 0; public Wall(String name){ super(name); diff --git a/core/src/io/anuke/mindustry/world/blocks/defense/turrets/ArtilleryTurret.java b/core/src/io/anuke/mindustry/world/blocks/defense/turrets/ArtilleryTurret.java index 53ba8cbad4..433987d2c6 100644 --- a/core/src/io/anuke/mindustry/world/blocks/defense/turrets/ArtilleryTurret.java +++ b/core/src/io/anuke/mindustry/world/blocks/defense/turrets/ArtilleryTurret.java @@ -13,7 +13,7 @@ import static io.anuke.mindustry.Vars.tilesize; * Artillery turrets have special shooting calculations done to hit targets. */ public class ArtilleryTurret extends ItemTurret{ - protected float velocityInaccuracy = 0f; + public float velocityInaccuracy = 0f; public ArtilleryTurret(String name){ super(name); @@ -22,7 +22,7 @@ public class ArtilleryTurret extends ItemTurret{ @Override protected void shoot(Tile tile, BulletType ammo){ - TurretEntity entity = tile.entity(); + TurretEntity entity = tile.ent(); entity.recoil = recoil; entity.heat = 1f; diff --git a/core/src/io/anuke/mindustry/world/blocks/defense/turrets/BurstTurret.java b/core/src/io/anuke/mindustry/world/blocks/defense/turrets/BurstTurret.java index d746227559..3661ec175c 100644 --- a/core/src/io/anuke/mindustry/world/blocks/defense/turrets/BurstTurret.java +++ b/core/src/io/anuke/mindustry/world/blocks/defense/turrets/BurstTurret.java @@ -8,7 +8,7 @@ import io.anuke.mindustry.world.Tile; import static io.anuke.mindustry.Vars.tilesize; public class BurstTurret extends ItemTurret{ - protected float burstSpacing = 5; + public float burstSpacing = 5; public BurstTurret(String name){ super(name); @@ -16,7 +16,7 @@ public class BurstTurret extends ItemTurret{ @Override protected void shoot(Tile tile, BulletType ammo){ - TurretEntity entity = tile.entity(); + TurretEntity entity = tile.ent(); entity.heat = 1f; diff --git a/core/src/io/anuke/mindustry/world/blocks/defense/turrets/ChargeTurret.java b/core/src/io/anuke/mindustry/world/blocks/defense/turrets/ChargeTurret.java index 3f02328eed..dc12e2425f 100644 --- a/core/src/io/anuke/mindustry/world/blocks/defense/turrets/ChargeTurret.java +++ b/core/src/io/anuke/mindustry/world/blocks/defense/turrets/ChargeTurret.java @@ -12,11 +12,11 @@ import static io.anuke.mindustry.Vars.tilesize; public class ChargeTurret extends PowerTurret{ - protected float chargeTime = 30f; - protected int chargeEffects = 5; - protected float chargeMaxDelay = 10f; - protected Effect chargeEffect = Fx.none; - protected Effect chargeBeginEffect = Fx.none; + public float chargeTime = 30f; + public int chargeEffects = 5; + public float chargeMaxDelay = 10f; + public Effect chargeEffect = Fx.none; + public Effect chargeBeginEffect = Fx.none; public ChargeTurret(String name){ super(name); @@ -25,7 +25,7 @@ public class ChargeTurret extends PowerTurret{ @Override public void shoot(Tile tile, BulletType ammo){ - LaserTurretEntity entity = tile.entity(); + LaserTurretEntity entity = tile.ent(); useAmmo(tile); @@ -55,7 +55,7 @@ public class ChargeTurret extends PowerTurret{ @Override public boolean shouldTurn(Tile tile){ - LaserTurretEntity entity = tile.entity(); + LaserTurretEntity entity = tile.ent(); return !entity.shooting; } diff --git a/core/src/io/anuke/mindustry/world/blocks/defense/turrets/CooledTurret.java b/core/src/io/anuke/mindustry/world/blocks/defense/turrets/CooledTurret.java index 58038d857e..9e48e3fc3a 100644 --- a/core/src/io/anuke/mindustry/world/blocks/defense/turrets/CooledTurret.java +++ b/core/src/io/anuke/mindustry/world/blocks/defense/turrets/CooledTurret.java @@ -17,8 +17,8 @@ import static io.anuke.mindustry.Vars.tilesize; public class CooledTurret extends Turret{ /** How much reload is lowered by for each unit of liquid of heat capacity. */ - protected float coolantMultiplier = 5f; - protected Effect coolEffect = Fx.fuelburn; + public float coolantMultiplier = 5f; + public Effect coolEffect = Fx.fuelburn; public CooledTurret(String name){ super(name); @@ -50,7 +50,7 @@ public class CooledTurret extends Turret{ float maxUsed = consumes.get(ConsumeType.liquid).amount; - TurretEntity entity = tile.entity(); + TurretEntity entity = tile.ent(); Liquid liquid = entity.liquids.current(); float used = Math.min(Math.min(entity.liquids.get(liquid), maxUsed * Time.delta()), Math.max(0, ((reload - entity.reload) / coolantMultiplier) / liquid.heatCapacity)) * baseReloadSpeed(tile); diff --git a/core/src/io/anuke/mindustry/world/blocks/defense/turrets/DoubleTurret.java b/core/src/io/anuke/mindustry/world/blocks/defense/turrets/DoubleTurret.java index 2067bd285a..70be09ad4a 100644 --- a/core/src/io/anuke/mindustry/world/blocks/defense/turrets/DoubleTurret.java +++ b/core/src/io/anuke/mindustry/world/blocks/defense/turrets/DoubleTurret.java @@ -9,7 +9,7 @@ import io.anuke.mindustry.world.meta.StatUnit; import static io.anuke.mindustry.Vars.tilesize; public class DoubleTurret extends ItemTurret{ - protected float shotWidth = 2f; + public float shotWidth = 2f; public DoubleTurret(String name){ super(name); @@ -26,7 +26,7 @@ public class DoubleTurret extends ItemTurret{ @Override protected void shoot(Tile tile, BulletType ammo){ - TurretEntity entity = tile.entity(); + TurretEntity entity = tile.ent(); entity.shots++; int i = Mathf.signs[entity.shots % 2]; 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 dca1324e66..393e102d7a 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 @@ -22,8 +22,8 @@ import java.io.*; import static io.anuke.mindustry.Vars.*; public class ItemTurret extends CooledTurret{ - protected int maxAmmo = 30; - protected ObjectMap ammo = new ObjectMap<>(); + public int maxAmmo = 30; + public ObjectMap ammo = new ObjectMap<>(); public ItemTurret(String name){ super(name); @@ -47,7 +47,7 @@ public class ItemTurret extends CooledTurret{ public void build(Tile tile, Table table){ MultiReqImage image = new MultiReqImage(); content.items().each(i -> filter.get(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))); + () -> tile.entity != null && !((ItemTurretEntity)tile.entity).ammo.isEmpty() && ((ItemEntry)tile.ent().ammo.peek()).item == item))); table.add(image).size(8 * 4); } @@ -79,7 +79,7 @@ public class ItemTurret extends CooledTurret{ public void displayBars(Tile tile, Table bars){ super.displayBars(tile, bars); - TurretEntity entity = tile.entity(); + TurretEntity entity = tile.ent(); bars.add(new Bar("blocks.ammo", Pal.ammo, () -> (float)entity.totalAmmo / maxAmmo)).growX(); bars.row(); @@ -87,7 +87,7 @@ public class ItemTurret extends CooledTurret{ @Override public int acceptStack(Item item, int amount, Tile tile, Unit source){ - TurretEntity entity = tile.entity(); + TurretEntity entity = tile.ent(); BulletType type = ammo.get(item); @@ -111,7 +111,7 @@ public class ItemTurret extends CooledTurret{ @Override public void handleItem(Item item, Tile tile, Tile source){ - TurretEntity entity = tile.entity(); + TurretEntity entity = tile.ent(); if(entity == null) return; if(item == Items.pyratite){ @@ -144,7 +144,7 @@ public class ItemTurret extends CooledTurret{ @Override public boolean acceptItem(Item item, Tile tile, Tile source){ - TurretEntity entity = tile.entity(); + TurretEntity entity = tile.ent(); return ammo != null && ammo.get(item) != null && entity.totalAmmo + ammo.get(item).ammoMultiplier <= maxAmmo; } diff --git a/core/src/io/anuke/mindustry/world/blocks/defense/turrets/LaserTurret.java b/core/src/io/anuke/mindustry/world/blocks/defense/turrets/LaserTurret.java index 2766e79724..422b5b57b8 100644 --- a/core/src/io/anuke/mindustry/world/blocks/defense/turrets/LaserTurret.java +++ b/core/src/io/anuke/mindustry/world/blocks/defense/turrets/LaserTurret.java @@ -14,8 +14,8 @@ import io.anuke.mindustry.world.meta.values.*; import static io.anuke.mindustry.Vars.tilesize; public class LaserTurret extends PowerTurret{ - protected float firingMoveFract = 0.25f; - protected float shootDuration = 100f; + public float firingMoveFract = 0.25f; + public float shootDuration = 100f; public LaserTurret(String name){ super(name); @@ -41,7 +41,7 @@ public class LaserTurret extends PowerTurret{ public void update(Tile tile){ super.update(tile); - LaserTurretEntity entity = tile.entity(); + LaserTurretEntity entity = tile.ent(); if(entity.bulletLife > 0 && entity.bullet != null){ tr.trns(entity.rotation, size * tilesize / 2f, 0f); @@ -59,7 +59,7 @@ public class LaserTurret extends PowerTurret{ @Override protected void updateShooting(Tile tile){ - LaserTurretEntity entity = tile.entity(); + LaserTurretEntity entity = tile.ent(); if(entity.bulletLife > 0 && entity.bullet != null){ return; @@ -87,14 +87,14 @@ public class LaserTurret extends PowerTurret{ @Override protected void turnToTarget(Tile tile, float targetRot){ - LaserTurretEntity entity = tile.entity(); + LaserTurretEntity entity = tile.ent(); entity.rotation = Angles.moveToward(entity.rotation, targetRot, rotatespeed * entity.delta() * (entity.bulletLife > 0f ? firingMoveFract : 1f)); } @Override protected void bullet(Tile tile, BulletType type, float angle){ - LaserTurretEntity entity = tile.entity(); + LaserTurretEntity entity = tile.ent(); entity.bullet = Bullet.create(type, tile.entity, tile.getTeam(), tile.drawx() + tr.x, tile.drawy() + tr.y, angle); entity.bulletLife = shootDuration; @@ -102,7 +102,7 @@ public class LaserTurret extends PowerTurret{ @Override public boolean shouldActiveSound(Tile tile){ - LaserTurretEntity entity = tile.entity(); + LaserTurretEntity entity = tile.ent(); return entity.bulletLife > 0 && entity.bullet != null; } diff --git a/core/src/io/anuke/mindustry/world/blocks/defense/turrets/LiquidTurret.java b/core/src/io/anuke/mindustry/world/blocks/defense/turrets/LiquidTurret.java index 28a33aa82a..7192ba09fe 100644 --- a/core/src/io/anuke/mindustry/world/blocks/defense/turrets/LiquidTurret.java +++ b/core/src/io/anuke/mindustry/world/blocks/defense/turrets/LiquidTurret.java @@ -15,7 +15,7 @@ import io.anuke.mindustry.world.meta.values.*; import static io.anuke.mindustry.Vars.*; public class LiquidTurret extends Turret{ - protected ObjectMap ammo = new ObjectMap<>(); + public ObjectMap ammo = new ObjectMap<>(); public LiquidTurret(String name){ super(name); @@ -48,13 +48,13 @@ public class LiquidTurret extends Turret{ @Override public boolean shouldActiveSound(Tile tile){ - TurretEntity entity = tile.entity(); + TurretEntity entity = tile.ent(); return entity.target != null && hasAmmo(tile); } @Override protected boolean validateTarget(Tile tile){ - TurretEntity entity = tile.entity(); + TurretEntity entity = tile.ent(); if(entity.liquids.current().canExtinguish() && entity.target instanceof Tile){ return Fire.has(((Tile)entity.target).x, ((Tile)entity.target).y); } @@ -63,7 +63,7 @@ public class LiquidTurret extends Turret{ @Override protected void findTarget(Tile tile){ - TurretEntity entity = tile.entity(); + TurretEntity entity = tile.ent(); if(entity.liquids.current().canExtinguish()){ int tr = (int)(range / tilesize); for(int x = -tr; x <= tr; x++){ @@ -83,7 +83,7 @@ public class LiquidTurret extends Turret{ protected void effects(Tile tile){ BulletType type = peekAmmo(tile); - TurretEntity entity = tile.entity(); + TurretEntity entity = tile.ent(); Effects.effect(type.shootEffect, entity.liquids.current().color, tile.drawx() + tr.x, tile.drawy() + tr.y, entity.rotation); Effects.effect(type.smokeEffect, entity.liquids.current().color, tile.drawx() + tr.x, tile.drawy() + tr.y, entity.rotation); @@ -98,7 +98,7 @@ public class LiquidTurret extends Turret{ @Override public BulletType useAmmo(Tile tile){ - TurretEntity entity = tile.entity(); + TurretEntity entity = tile.ent(); if(tile.isEnemyCheat()) return ammo.get(entity.liquids.current()); BulletType type = ammo.get(entity.liquids.current()); entity.liquids.remove(entity.liquids.current(), type.ammoMultiplier); @@ -112,7 +112,7 @@ public class LiquidTurret extends Turret{ @Override public boolean hasAmmo(Tile tile){ - TurretEntity entity = tile.entity(); + TurretEntity entity = tile.ent(); return ammo.get(entity.liquids.current()) != null && entity.liquids.total() >= ammo.get(entity.liquids.current()).ammoMultiplier; } diff --git a/core/src/io/anuke/mindustry/world/blocks/defense/turrets/PowerTurret.java b/core/src/io/anuke/mindustry/world/blocks/defense/turrets/PowerTurret.java index 7e4c54ace4..1eab2079a8 100644 --- a/core/src/io/anuke/mindustry/world/blocks/defense/turrets/PowerTurret.java +++ b/core/src/io/anuke/mindustry/world/blocks/defense/turrets/PowerTurret.java @@ -7,8 +7,8 @@ import io.anuke.mindustry.world.meta.BlockStat; import io.anuke.mindustry.world.meta.StatUnit; public class PowerTurret extends CooledTurret{ - protected @NonNull BulletType shootType; - protected float powerUse = 1f; + public @NonNull BulletType shootType; + public float powerUse = 1f; public PowerTurret(String name){ super(name); diff --git a/core/src/io/anuke/mindustry/world/blocks/defense/turrets/Turret.java b/core/src/io/anuke/mindustry/world/blocks/defense/turrets/Turret.java index 05edbe5091..e6c3b129d4 100644 --- a/core/src/io/anuke/mindustry/world/blocks/defense/turrets/Turret.java +++ b/core/src/io/anuke/mindustry/world/blocks/defense/turrets/Turret.java @@ -28,40 +28,39 @@ import io.anuke.mindustry.world.meta.*; import static io.anuke.mindustry.Vars.tilesize; public abstract class Turret extends Block{ - protected static final int targetInterval = 20; + public final int timerTarget = timers++; + public int targetInterval = 20; - protected final int timerTarget = timers++; + public Color heatColor = Pal.turretHeat; + public Effect shootEffect = Fx.none; + public Effect smokeEffect = Fx.none; + public Effect ammoUseEffect = Fx.none; + public Sound shootSound = Sounds.shoot; - protected Color heatColor = Pal.turretHeat; - protected Effect shootEffect = Fx.none; - protected Effect smokeEffect = Fx.none; - protected Effect ammoUseEffect = Fx.none; - protected Sound shootSound = Sounds.shoot; - - protected int ammoPerShot = 1; - protected float ammoEjectBack = 1f; - protected float range = 50f; - protected float reload = 10f; - protected float inaccuracy = 0f; - protected int shots = 1; - protected float spread = 4f; - protected float recoil = 1f; - protected float restitution = 0.02f; - protected float cooldown = 0.02f; - protected float rotatespeed = 5f; //in degrees per tick - protected float shootCone = 8f; - protected float shootShake = 0f; - protected float xRand = 0f; - protected boolean targetAir = true; - protected boolean targetGround = true; + public int ammoPerShot = 1; + public float ammoEjectBack = 1f; + public float range = 50f; + public float reload = 10f; + public float inaccuracy = 0f; + public int shots = 1; + public float spread = 4f; + public float recoil = 1f; + public float restitution = 0.02f; + public float cooldown = 0.02f; + public float rotatespeed = 5f; //in degrees per tick + public float shootCone = 8f; + public float shootShake = 0f; + public float xRand = 0f; + public boolean targetAir = true; + public boolean targetGround = true; protected Vector2 tr = new Vector2(); protected Vector2 tr2 = new Vector2(); - protected TextureRegion baseRegion, heatRegion; + public TextureRegion baseRegion, heatRegion; - protected Cons2 drawer = (tile, entity) -> Draw.rect(region, tile.drawx() + tr2.x, tile.drawy() + tr2.y, entity.rotation - 90); - protected Cons2 heatDrawer = (tile, entity) -> { + public Cons2 drawer = (tile, entity) -> Draw.rect(region, tile.drawx() + tr2.x, tile.drawy() + tr2.y, entity.rotation - 90); + public Cons2 heatDrawer = (tile, entity) -> { if(entity.heat <= 0.00001f) return; Draw.color(heatColor, entity.heat); Draw.blend(Blending.additive); @@ -116,7 +115,7 @@ public abstract class Turret extends Block{ @Override public void drawLayer(Tile tile){ - TurretEntity entity = tile.entity(); + TurretEntity entity = tile.ent(); tr2.trns(entity.rotation, -entity.recoil); @@ -144,7 +143,7 @@ public abstract class Turret extends Block{ @Override public void update(Tile tile){ - TurretEntity entity = tile.entity(); + TurretEntity entity = tile.ent(); if(!validateTarget(tile)) entity.target = null; @@ -186,12 +185,12 @@ public abstract class Turret extends Block{ } protected boolean validateTarget(Tile tile){ - TurretEntity entity = tile.entity(); + TurretEntity entity = tile.ent(); return !Units.invalidateTarget(entity.target, tile.getTeam(), tile.drawx(), tile.drawy()); } protected void findTarget(Tile tile){ - TurretEntity entity = tile.entity(); + TurretEntity entity = tile.ent(); if(targetAir && !targetGround){ entity.target = Units.closestEnemy(tile.getTeam(), tile.drawx(), tile.drawy(), range, e -> !e.isDead() && e.isFlying()); @@ -201,7 +200,7 @@ public abstract class Turret extends Block{ } protected void turnToTarget(Tile tile, float targetRot){ - TurretEntity entity = tile.entity(); + TurretEntity entity = tile.ent(); entity.rotation = Angles.moveToward(entity.rotation, targetRot, rotatespeed * entity.delta() * baseReloadSpeed(tile)); } @@ -214,7 +213,7 @@ public abstract class Turret extends Block{ public BulletType useAmmo(Tile tile){ if(tile.isEnemyCheat()) return peekAmmo(tile); - TurretEntity entity = tile.entity(); + TurretEntity entity = tile.ent(); AmmoEntry entry = entity.ammo.peek(); entry.amount -= ammoPerShot; if(entry.amount == 0) entity.ammo.pop(); @@ -227,7 +226,7 @@ public abstract class Turret extends Block{ * Get the ammo type that will be returned if useAmmo is called. */ public BulletType peekAmmo(Tile tile){ - TurretEntity entity = tile.entity(); + TurretEntity entity = tile.ent(); return entity.ammo.peek().type(); } @@ -235,12 +234,12 @@ public abstract class Turret extends Block{ * Returns whether the turret has ammo. */ public boolean hasAmmo(Tile tile){ - TurretEntity entity = tile.entity(); + TurretEntity entity = tile.ent(); return entity.ammo.size > 0 && entity.ammo.peek().amount >= ammoPerShot; } protected void updateShooting(Tile tile){ - TurretEntity entity = tile.entity(); + TurretEntity entity = tile.ent(); if(entity.reload >= reload){ BulletType type = peekAmmo(tile); @@ -254,7 +253,7 @@ public abstract class Turret extends Block{ } protected void shoot(Tile tile, BulletType type){ - TurretEntity entity = tile.entity(); + TurretEntity entity = tile.ent(); entity.recoil = recoil; entity.heat = 1f; @@ -277,7 +276,7 @@ public abstract class Turret extends Block{ Effect shootEffect = this.shootEffect == Fx.none ? peekAmmo(tile).shootEffect : this.shootEffect; Effect smokeEffect = this.smokeEffect == Fx.none ? peekAmmo(tile).smokeEffect : this.smokeEffect; - TurretEntity entity = tile.entity(); + TurretEntity entity = tile.ent(); Effects.effect(shootEffect, tile.drawx() + tr.x, tile.drawy() + tr.y, entity.rotation); Effects.effect(smokeEffect, tile.drawx() + tr.x, tile.drawy() + tr.y, entity.rotation); @@ -292,7 +291,7 @@ public abstract class Turret extends Block{ protected void ejectEffects(Tile tile){ if(!isTurret(tile)) return; - TurretEntity entity = tile.entity(); + TurretEntity entity = tile.ent(); Effects.effect(ammoUseEffect, tile.drawx() - Angles.trnsx(entity.rotation, ammoEjectBack), tile.drawy() - Angles.trnsy(entity.rotation, ammoEjectBack), entity.rotation); diff --git a/core/src/io/anuke/mindustry/world/blocks/distribution/BufferedItemBridge.java b/core/src/io/anuke/mindustry/world/blocks/distribution/BufferedItemBridge.java index 4fc815676d..89b91cb50c 100644 --- a/core/src/io/anuke/mindustry/world/blocks/distribution/BufferedItemBridge.java +++ b/core/src/io/anuke/mindustry/world/blocks/distribution/BufferedItemBridge.java @@ -7,10 +7,10 @@ import io.anuke.mindustry.world.*; import java.io.*; public class BufferedItemBridge extends ExtendingItemBridge{ - protected int timerAccept = timers++; + public final int timerAccept = timers++; - protected float speed = 40f; - protected int bufferCapacity = 50; + public float speed = 40f; + public int bufferCapacity = 50; public BufferedItemBridge(String name){ super(name); @@ -21,7 +21,7 @@ public class BufferedItemBridge extends ExtendingItemBridge{ @Override public void updateTransport(Tile tile, Tile other){ - BufferedItemBridgeEntity entity = tile.entity(); + BufferedItemBridgeEntity entity = tile.ent(); if(entity.buffer.accepts() && entity.items.total() > 0){ entity.buffer.accept(entity.items.take()); 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 e05812d523..a3799def15 100644 --- a/core/src/io/anuke/mindustry/world/blocks/distribution/Conveyor.java +++ b/core/src/io/anuke/mindustry/world/blocks/distribution/Conveyor.java @@ -32,7 +32,7 @@ public class Conveyor extends Block implements Autotiler{ private final Vector2 tr2 = new Vector2(); private TextureRegion[][] regions = new TextureRegion[7][4]; - protected float speed = 0f; + public float speed = 0f; protected Conveyor(String name){ super(name); @@ -75,7 +75,7 @@ public class Conveyor extends Block implements Autotiler{ @Override public void draw(Tile tile){ - ConveyorEntity entity = tile.entity(); + ConveyorEntity entity = tile.ent(); byte rotation = tile.rotation(); int frame = entity.clogHeat <= 0.5f ? (int)(((Time.time() * speed * 8f * entity.timeScale)) % 4) : 0; @@ -85,7 +85,7 @@ public class Conveyor extends Block implements Autotiler{ @Override public boolean shouldIdleSound(Tile tile){ - ConveyorEntity entity = tile.entity(); + ConveyorEntity entity = tile.ent(); return entity.clogHeat <= 0.5f ; } @@ -93,7 +93,7 @@ public class Conveyor extends Block implements Autotiler{ public void onProximityUpdate(Tile tile){ super.onProximityUpdate(tile); - ConveyorEntity entity = tile.entity(); + ConveyorEntity entity = tile.ent(); int[] bits = buildBlending(tile, tile.rotation(), null, true); entity.blendbits = bits[0]; entity.blendsclx = bits[1]; @@ -122,7 +122,7 @@ public class Conveyor extends Block implements Autotiler{ @Override public void drawLayer(Tile tile){ - ConveyorEntity entity = tile.entity(); + ConveyorEntity entity = tile.ent(); byte rotation = tile.rotation(); @@ -148,7 +148,7 @@ public class Conveyor extends Block implements Autotiler{ @Override public void unitOn(Tile tile, Unit unit){ - ConveyorEntity entity = tile.entity(); + ConveyorEntity entity = tile.ent(); if(entity.clogHeat > 0.5f){ return; @@ -178,12 +178,12 @@ public class Conveyor extends Block implements Autotiler{ @Override public void update(Tile tile){ - ConveyorEntity entity = tile.entity(); + ConveyorEntity entity = tile.ent(); entity.minitem = 1f; Tile next = tile.getNearby(tile.rotation()); if(next != null) next = next.link(); - float nextMax = next != null && next.block() instanceof Conveyor && next.block().acceptItem(null, next, tile) ? 1f - Math.max(itemSpace - next.entity().minitem, 0) : 1f; + float nextMax = next != null && next.block() instanceof Conveyor && next.block().acceptItem(null, next, tile) ? 1f - Math.max(itemSpace - next.ent().minitem, 0) : 1f; int minremove = Integer.MAX_VALUE; for(int i = entity.convey.size - 1; i >= 0; i--){ @@ -211,7 +211,7 @@ public class Conveyor extends Block implements Autotiler{ if(pos.y >= 0.9999f && offloadDir(tile, pos.item)){ if(next != null && next.block() instanceof Conveyor){ - ConveyorEntity othere = next.entity(); + ConveyorEntity othere = next.ent(); ItemPos ni = pos2.set(othere.convey.get(othere.lastInserted), ItemPos.updateShorts); @@ -263,7 +263,7 @@ public class Conveyor extends Block implements Autotiler{ @Override public int removeStack(Tile tile, Item item, int amount){ - ConveyorEntity entity = tile.entity(); + ConveyorEntity entity = tile.ent(); entity.noSleep(); int removed = 0; @@ -289,13 +289,13 @@ public class Conveyor extends Block implements Autotiler{ @Override public int acceptStack(Item item, int amount, Tile tile, Unit source){ - ConveyorEntity entity = tile.entity(); + ConveyorEntity entity = tile.ent(); return Math.min((int)(entity.minitem / itemSpace), amount); } @Override public void handleStack(Item item, int amount, Tile tile, Unit source){ - ConveyorEntity entity = tile.entity(); + ConveyorEntity entity = tile.ent(); for(int i = amount - 1; i >= 0; i--){ long result = ItemPos.packItem(item, 0f, i * itemSpace); @@ -309,7 +309,7 @@ public class Conveyor extends Block implements Autotiler{ @Override public boolean acceptItem(Item item, Tile tile, Tile source){ int direction = source == null ? 0 : Math.abs(source.relativeTo(tile.x, tile.y) - tile.rotation()); - float minitem = tile.entity().minitem; + float minitem = tile.ent().minitem; return (((direction == 0) && minitem > itemSpace) || ((direction % 2 == 1) && minitem > 0.52f)) && (source == null || !(source.block().rotate && (source.rotation() + 2) % 4 == tile.rotation())); } @@ -324,7 +324,7 @@ public class Conveyor extends Block implements Autotiler{ float pos = ch == 0 ? 0 : ch % 2 == 1 ? 0.5f : 1f; float y = (ang == -1 || ang == 3) ? 1 : (ang == 1 || ang == -3) ? -1 : 0; - ConveyorEntity entity = tile.entity(); + ConveyorEntity entity = tile.ent(); entity.noSleep(); long result = ItemPos.packItem(item, y * 0.9f, pos); diff --git a/core/src/io/anuke/mindustry/world/blocks/distribution/ExtendingItemBridge.java b/core/src/io/anuke/mindustry/world/blocks/distribution/ExtendingItemBridge.java index 3889a8078a..7a0a2b1d06 100644 --- a/core/src/io/anuke/mindustry/world/blocks/distribution/ExtendingItemBridge.java +++ b/core/src/io/anuke/mindustry/world/blocks/distribution/ExtendingItemBridge.java @@ -16,7 +16,7 @@ public class ExtendingItemBridge extends ItemBridge{ @Override public void drawLayer(Tile tile){ - ItemBridgeEntity entity = tile.entity(); + ItemBridgeEntity entity = tile.ent(); Tile other = world.tile(entity.link); if(!linkValid(tile, other)) return; 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 826f35fbfd..3624a1079b 100644 --- a/core/src/io/anuke/mindustry/world/blocks/distribution/ItemBridge.java +++ b/core/src/io/anuke/mindustry/world/blocks/distribution/ItemBridge.java @@ -20,12 +20,12 @@ import java.io.*; import static io.anuke.mindustry.Vars.*; public class ItemBridge extends Block{ - protected int timerTransport = timers++; - protected int range; - protected float transportTime = 2f; - protected TextureRegion endRegion, bridgeRegion, arrowRegion; - protected BuildRequest otherReq; + public final int timerTransport = timers++; + public int range; + public float transportTime = 2f; + public TextureRegion endRegion, bridgeRegion, arrowRegion; + private static BuildRequest otherReq; private static int lastPlaced = Pos.invalid; public ItemBridge(String name){ @@ -46,7 +46,7 @@ public class ItemBridge extends Block{ @Override public void configured(Tile tile, Player player, int value){ - tile.entity().link = value; + tile.ent().link = value; } @Override @@ -126,7 +126,7 @@ public class ItemBridge extends Block{ @Override public void drawConfigure(Tile tile){ - ItemBridgeEntity entity = tile.entity(); + ItemBridgeEntity entity = tile.ent(); Draw.color(Pal.accent); Lines.stroke(1f); @@ -151,7 +151,7 @@ public class ItemBridge extends Block{ @Override public boolean onConfigureTileTapped(Tile tile, Tile other){ - ItemBridgeEntity entity = tile.entity(); + ItemBridgeEntity entity = tile.ent(); if(linkValid(tile, other)){ if(entity.link == other.pos()){ @@ -166,7 +166,7 @@ public class ItemBridge extends Block{ @Override public void update(Tile tile){ - ItemBridgeEntity entity = tile.entity(); + ItemBridgeEntity entity = tile.ent(); entity.time += entity.cycleSpeed * entity.delta(); entity.time2 += (entity.cycleSpeed - 1f) * entity.delta(); @@ -175,7 +175,7 @@ public class ItemBridge extends Block{ while(it.hasNext){ int i = it.next(); Tile other = world.tile(i); - if(!linkValid(tile, other, false)){ + if(!linkValid(tile, other, false) || other.ent().link != tile.pos()){ it.remove(); } } @@ -198,7 +198,7 @@ public class ItemBridge extends Block{ } public void updateTransport(Tile tile, Tile other){ - ItemBridgeEntity entity = tile.entity(); + ItemBridgeEntity entity = tile.ent(); if(entity.uptime >= 0.5f && entity.timer.get(timerTransport, transportTime)){ Item item = entity.items.take(); @@ -214,7 +214,7 @@ public class ItemBridge extends Block{ @Override public void drawLayer(Tile tile){ - ItemBridgeEntity entity = tile.entity(); + ItemBridgeEntity entity = tile.ent(); Tile other = world.tile(entity.link); if(!linkValid(tile, other)) return; @@ -254,7 +254,7 @@ public class ItemBridge extends Block{ public boolean acceptItem(Item item, Tile tile, Tile source){ if(tile.getTeam() != source.getTeam()) return false; - ItemBridgeEntity entity = tile.entity(); + ItemBridgeEntity entity = tile.ent(); Tile other = world.tile(entity.link); if(linkValid(tile, other)){ @@ -263,7 +263,7 @@ public class ItemBridge extends Block{ if(rel == rel2) return false; }else{ - return source.block() instanceof ItemBridge && source.entity().link == tile.pos() && tile.entity.items.total() < itemCapacity; + return source.block() instanceof ItemBridge && source.ent().link == tile.pos() && tile.entity.items.total() < itemCapacity; } return tile.entity.items.total() < itemCapacity; @@ -272,7 +272,7 @@ public class ItemBridge extends Block{ @Override public boolean canDumpLiquid(Tile tile, Tile to, Liquid liquid){ - ItemBridgeEntity entity = tile.entity(); + ItemBridgeEntity entity = tile.ent(); Tile other = world.tile(entity.link); if(!linkValid(tile, other)){ @@ -298,9 +298,9 @@ public class ItemBridge extends Block{ @Override public boolean acceptLiquid(Tile tile, Tile source, Liquid liquid, float amount){ - if(tile.getTeam() != source.getTeam()) return false; + if(tile.getTeam() != source.getTeam() || !hasLiquids) return false; - ItemBridgeEntity entity = tile.entity(); + ItemBridgeEntity entity = tile.ent(); Tile other = world.tile(entity.link); if(linkValid(tile, other)){ @@ -308,7 +308,7 @@ public class ItemBridge extends Block{ int rel2 = tile.relativeTo(source.x, source.y); if(rel == rel2) return false; - }else if(!(source.block() instanceof ItemBridge && source.entity().link == tile.pos())){ + }else if(!(source.block() instanceof ItemBridge && source.ent().link == tile.pos())){ return false; } @@ -317,7 +317,7 @@ public class ItemBridge extends Block{ @Override public boolean canDump(Tile tile, Tile to, Item item){ - ItemBridgeEntity entity = tile.entity(); + ItemBridgeEntity entity = tile.ent(); Tile other = world.tile(entity.link); if(!linkValid(tile, other)){ @@ -355,7 +355,7 @@ public class ItemBridge extends Block{ return false; } - return other.block() == this && (!checkDouble || other.entity().link != tile.pos()); + return other.block() == this && (!checkDouble || other.ent().link != tile.pos()); } public static class ItemBridgeEntity extends TileEntity{ diff --git a/core/src/io/anuke/mindustry/world/blocks/distribution/Junction.java b/core/src/io/anuke/mindustry/world/blocks/distribution/Junction.java index 7877317185..45fea7b8a4 100644 --- a/core/src/io/anuke/mindustry/world/blocks/distribution/Junction.java +++ b/core/src/io/anuke/mindustry/world/blocks/distribution/Junction.java @@ -17,8 +17,8 @@ import java.io.IOException; import static io.anuke.mindustry.Vars.content; public class Junction extends Block{ - protected float speed = 26; //frames taken to go through this junction - protected int capacity = 6; + public float speed = 26; //frames taken to go through this junction + public int capacity = 6; public Junction(String name){ super(name); @@ -42,7 +42,7 @@ public class Junction extends Block{ @Override public void update(Tile tile){ - JunctionEntity entity = tile.entity(); + JunctionEntity entity = tile.ent(); DirectionalItemBuffer buffer = entity.buffer; for(int i = 0; i < 4; i++){ @@ -72,14 +72,14 @@ public class Junction extends Block{ @Override public void handleItem(Item item, Tile tile, Tile source){ - JunctionEntity entity = tile.entity(); + JunctionEntity entity = tile.ent(); int relative = source.relativeTo(tile.x, tile.y); entity.buffer.accept(relative, item); } @Override public boolean acceptItem(Item item, Tile tile, Tile source){ - JunctionEntity entity = tile.entity(); + JunctionEntity entity = tile.ent(); int relative = source.relativeTo(tile.x, tile.y); if(entity == null || relative == -1 || !entity.buffer.accepts(relative)) 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 c4a1aba990..1f75a716c8 100644 --- a/core/src/io/anuke/mindustry/world/blocks/distribution/MassDriver.java +++ b/core/src/io/anuke/mindustry/world/blocks/distribution/MassDriver.java @@ -20,17 +20,17 @@ import java.io.*; import static io.anuke.mindustry.Vars.*; public class MassDriver extends Block{ - protected float range; - protected float rotateSpeed = 0.04f; - protected float translation = 7f; - protected int minDistribute = 10; - protected float knockback = 4f; - protected float reloadTime = 100f; - protected Effect shootEffect = Fx.shootBig2; - protected Effect smokeEffect = Fx.shootBigSmoke2; - protected Effect recieveEffect = Fx.mineBig; - protected float shake = 3f; - protected TextureRegion baseRegion; + public float range; + public float rotateSpeed = 0.04f; + public float translation = 7f; + public int minDistribute = 10; + public float knockback = 4f; + public float reloadTime = 100f; + public Effect shootEffect = Fx.shootBig2; + public Effect smokeEffect = Fx.shootBigSmoke2; + public Effect recieveEffect = Fx.mineBig; + public float shake = 3f; + public TextureRegion baseRegion; public MassDriver(String name){ super(name); @@ -47,7 +47,7 @@ public class MassDriver extends Block{ @Override public void configured(Tile tile, Player player, int value){ - tile.entity().link = value; + tile.ent().link = value; } @Override @@ -64,7 +64,7 @@ public class MassDriver extends Block{ @Override public void update(Tile tile){ - MassDriverEntity entity = tile.entity(); + MassDriverEntity entity = tile.ent(); Tile link = world.tile(entity.link); boolean hasLink = linkValid(tile); @@ -120,7 +120,7 @@ public class MassDriver extends Block{ tile.entity.items.total() >= minDistribute && //must shoot minimum amount of items link.block().itemCapacity - link.entity.items.total() >= minDistribute //must have minimum amount of space ){ - MassDriverEntity other = link.entity(); + MassDriverEntity other = link.ent(); other.waitingShooters.add(tile); if(entity.reload <= 0.0001f){ @@ -152,7 +152,7 @@ public class MassDriver extends Block{ @Override public void drawLayer(Tile tile){ - MassDriverEntity entity = tile.entity(); + MassDriverEntity entity = tile.ent(); Draw.rect(region, tile.drawx() + Angles.trnsx(entity.rotation + 180f, entity.reload * knockback), @@ -172,7 +172,7 @@ public class MassDriver extends Block{ Lines.stroke(1f); Drawf.circles(tile.drawx(), tile.drawy(), (tile.block().size / 2f + 1) * tilesize + sin - 2f, Pal.accent); - MassDriverEntity entity = tile.entity(); + MassDriverEntity entity = tile.ent(); if(linkValid(tile)){ Tile target = world.tile(entity.link); @@ -187,7 +187,7 @@ public class MassDriver extends Block{ public boolean onConfigureTileTapped(Tile tile, Tile other){ if(tile == other) return false; - MassDriverEntity entity = tile.entity(); + MassDriverEntity entity = tile.ent(); if(entity.link == other.pos()){ tile.configure(-1); @@ -207,8 +207,8 @@ public class MassDriver extends Block{ } protected void fire(Tile tile, Tile target){ - MassDriverEntity entity = tile.entity(); - MassDriverEntity other = target.entity(); + MassDriverEntity entity = tile.ent(); + MassDriverEntity other = target.ent(); //reset reload, use power. entity.reload = 1f; @@ -264,13 +264,13 @@ public class MassDriver extends Block{ protected boolean shooterValid(Tile tile, Tile other){ if(other == null) return true; if(!(other.block() instanceof MassDriver)) return false; - MassDriverEntity entity = other.entity(); + MassDriverEntity entity = other.ent(); return entity.link == tile.pos() && tile.dst(other) <= range; } protected boolean linkValid(Tile tile){ if(tile == null) return false; - MassDriverEntity entity = tile.entity(); + MassDriverEntity entity = tile.ent(); if(entity == null || entity.link == -1) return false; Tile link = world.tile(entity.link); diff --git a/core/src/io/anuke/mindustry/world/blocks/distribution/OverflowGate.java b/core/src/io/anuke/mindustry/world/blocks/distribution/OverflowGate.java index b25635e005..a6c8f779ac 100644 --- a/core/src/io/anuke/mindustry/world/blocks/distribution/OverflowGate.java +++ b/core/src/io/anuke/mindustry/world/blocks/distribution/OverflowGate.java @@ -10,7 +10,7 @@ import io.anuke.mindustry.world.meta.BlockGroup; import java.io.*; public class OverflowGate extends Block{ - protected float speed = 1f; + public float speed = 1f; public OverflowGate(String name){ super(name); @@ -29,7 +29,7 @@ public class OverflowGate extends Block{ @Override public int removeStack(Tile tile, Item item, int amount){ - OverflowGateEntity entity = tile.entity(); + OverflowGateEntity entity = tile.ent(); int result = super.removeStack(tile, item, amount); if(result != 0 && item == entity.lastItem){ entity.lastItem = null; @@ -39,7 +39,7 @@ public class OverflowGate extends Block{ @Override public void update(Tile tile){ - OverflowGateEntity entity = tile.entity(); + OverflowGateEntity entity = tile.ent(); if(entity.lastItem == null && entity.items.total() > 0){ entity.items.clear(); @@ -60,14 +60,14 @@ public class OverflowGate extends Block{ @Override public boolean acceptItem(Item item, Tile tile, Tile source){ - OverflowGateEntity entity = tile.entity(); + OverflowGateEntity entity = tile.ent(); return tile.getTeam() == source.getTeam() && entity.lastItem == null && entity.items.total() == 0; } @Override public void handleItem(Item item, Tile tile, Tile source){ - OverflowGateEntity entity = tile.entity(); + OverflowGateEntity entity = tile.ent(); entity.items.add(item, 1); entity.lastItem = item; entity.time = 0f; diff --git a/core/src/io/anuke/mindustry/world/blocks/distribution/Router.java b/core/src/io/anuke/mindustry/world/blocks/distribution/Router.java index fdff392743..1893af98e2 100644 --- a/core/src/io/anuke/mindustry/world/blocks/distribution/Router.java +++ b/core/src/io/anuke/mindustry/world/blocks/distribution/Router.java @@ -9,7 +9,7 @@ import io.anuke.mindustry.world.*; import io.anuke.mindustry.world.meta.BlockGroup; public class Router extends Block{ - protected float speed = 8f; + public float speed = 8f; public Router(String name){ super(name); @@ -24,7 +24,7 @@ public class Router extends Block{ @Override public void update(Tile tile){ - RouterEntity entity = tile.entity(); + RouterEntity entity = tile.ent(); if(entity.lastItem == null && entity.items.total() > 0){ entity.items.clear(); @@ -45,14 +45,14 @@ public class Router extends Block{ @Override public boolean acceptItem(Item item, Tile tile, Tile source){ - RouterEntity entity = tile.entity(); + RouterEntity entity = tile.ent(); return tile.getTeam() == source.getTeam() && entity.lastItem == null && entity.items.total() == 0; } @Override public void handleItem(Item item, Tile tile, Tile source){ - RouterEntity entity = tile.entity(); + RouterEntity entity = tile.ent(); entity.items.add(item, 1); entity.lastItem = item; entity.time = 0f; @@ -75,7 +75,7 @@ public class Router extends Block{ @Override public int removeStack(Tile tile, Item item, int amount){ - RouterEntity entity = tile.entity(); + RouterEntity entity = tile.ent(); int result = super.removeStack(tile, item, amount); if(result != 0 && item == entity.lastItem){ entity.lastItem = null; 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 eec9fc1f98..1794161654 100644 --- a/core/src/io/anuke/mindustry/world/blocks/distribution/Sorter.java +++ b/core/src/io/anuke/mindustry/world/blocks/distribution/Sorter.java @@ -18,7 +18,7 @@ import static io.anuke.mindustry.Vars.content; public class Sorter extends Block{ private static Item lastItem; - protected boolean invert; + public boolean invert; public Sorter(String name){ super(name); @@ -45,7 +45,7 @@ public class Sorter extends Block{ @Override public void configured(Tile tile, Player player, int value){ - tile.entity().sortItem = content.item(value); + tile.ent().sortItem = content.item(value); } @Override @@ -57,7 +57,7 @@ public class Sorter extends Block{ public void draw(Tile tile){ super.draw(tile); - SorterEntity entity = tile.entity(); + SorterEntity entity = tile.ent(); if(entity.sortItem == null) return; Draw.color(entity.sortItem.color); @@ -67,7 +67,7 @@ public class Sorter extends Block{ @Override public int minimapColor(Tile tile){ - return tile.entity().sortItem == null ? 0 : tile.entity().sortItem.color.rgba(); + return tile.ent().sortItem == null ? 0 : tile.ent().sortItem.color.rgba(); } @Override @@ -85,11 +85,11 @@ public class Sorter extends Block{ } boolean isSame(Tile tile, Tile other){ - return other != null && other.block() instanceof Sorter && other.entity().sortItem == tile.entity().sortItem; + return other != null && other.block() instanceof Sorter; } Tile getTileTarget(Item item, Tile dest, Tile source, boolean flip){ - SorterEntity entity = dest.entity(); + SorterEntity entity = dest.ent(); int dir = source.relativeTo(dest.x, dest.y); if(dir == -1) return null; @@ -130,8 +130,8 @@ public class Sorter extends Block{ } @Override - public void buildTable(Tile tile, Table table){ - SorterEntity entity = tile.entity(); + public void buildConfiguration(Tile tile, Table table){ + SorterEntity entity = tile.ent(); ItemSelection.buildItemTable(table, () -> entity.sortItem, item -> { lastItem = item; tile.configure(item == null ? -1 : item.id); diff --git a/core/src/io/anuke/mindustry/world/blocks/liquid/ArmoredConduit.java b/core/src/io/anuke/mindustry/world/blocks/liquid/ArmoredConduit.java index 7a50ef5f0a..d74087123c 100644 --- a/core/src/io/anuke/mindustry/world/blocks/liquid/ArmoredConduit.java +++ b/core/src/io/anuke/mindustry/world/blocks/liquid/ArmoredConduit.java @@ -9,7 +9,7 @@ import io.anuke.mindustry.world.Edges; import io.anuke.mindustry.world.Tile; public class ArmoredConduit extends Conduit{ - protected TextureRegion capRegion; + public TextureRegion capRegion; public ArmoredConduit(String name){ super(name); diff --git a/core/src/io/anuke/mindustry/world/blocks/liquid/Conduit.java b/core/src/io/anuke/mindustry/world/blocks/liquid/Conduit.java index 80c2ab5baf..0b6518b956 100644 --- a/core/src/io/anuke/mindustry/world/blocks/liquid/Conduit.java +++ b/core/src/io/anuke/mindustry/world/blocks/liquid/Conduit.java @@ -16,12 +16,12 @@ import io.anuke.mindustry.world.blocks.*; import io.anuke.mindustry.world.modules.*; public class Conduit extends LiquidBlock implements Autotiler{ - protected final int timerFlow = timers++; + public final int timerFlow = timers++; - protected TextureRegion[] topRegions = new TextureRegion[7]; - protected TextureRegion[] botRegions = new TextureRegion[7]; + public TextureRegion[] topRegions = new TextureRegion[7]; + public TextureRegion[] botRegions = new TextureRegion[7]; - protected float leakResistance = 1.5f; + public float leakResistance = 1.5f; public Conduit(String name){ super(name); @@ -47,7 +47,7 @@ public class Conduit extends LiquidBlock implements Autotiler{ public void onProximityUpdate(Tile tile){ super.onProximityUpdate(tile); - ConduitEntity entity = tile.entity(); + ConduitEntity entity = tile.ent(); int[] bits = buildBlending(tile, tile.rotation(), null, true); entity.blendbits = bits[0]; } @@ -91,7 +91,7 @@ public class Conduit extends LiquidBlock implements Autotiler{ @Override public void draw(Tile tile){ - ConduitEntity entity = tile.entity(); + ConduitEntity entity = tile.ent(); LiquidModule mod = tile.entity.liquids; int rotation = tile.rotation() * 90; @@ -108,7 +108,7 @@ public class Conduit extends LiquidBlock implements Autotiler{ @Override public void update(Tile tile){ - ConduitEntity entity = tile.entity(); + ConduitEntity entity = tile.ent(); entity.smoothLiquid = Mathf.lerpDelta(entity.smoothLiquid, entity.liquids.total() / liquidCapacity, 0.05f); if(tile.entity.liquids.total() > 0.001f && tile.entity.timer.get(timerFlow, 1)){ diff --git a/core/src/io/anuke/mindustry/world/blocks/liquid/LiquidBridge.java b/core/src/io/anuke/mindustry/world/blocks/liquid/LiquidBridge.java index 5373acdc6f..5575d6d779 100644 --- a/core/src/io/anuke/mindustry/world/blocks/liquid/LiquidBridge.java +++ b/core/src/io/anuke/mindustry/world/blocks/liquid/LiquidBridge.java @@ -21,7 +21,7 @@ public class LiquidBridge extends ItemBridge{ @Override public void update(Tile tile){ - ItemBridgeEntity entity = tile.entity(); + ItemBridgeEntity entity = tile.ent(); entity.time += entity.cycleSpeed * Time.delta(); entity.time2 += (entity.cycleSpeed - 1f) * Time.delta(); @@ -30,6 +30,8 @@ public class LiquidBridge extends ItemBridge{ if(!linkValid(tile, other)){ tryDumpLiquid(tile, entity.liquids.current()); }else{ + ((ItemBridgeEntity)world.tile(entity.link).entity).incoming.add(tile.pos()); + if(entity.cons.valid()){ float alpha = 0.04f; if(hasPower){ diff --git a/core/src/io/anuke/mindustry/world/blocks/liquid/LiquidExtendingBridge.java b/core/src/io/anuke/mindustry/world/blocks/liquid/LiquidExtendingBridge.java index be0edc1bff..1753e17d55 100644 --- a/core/src/io/anuke/mindustry/world/blocks/liquid/LiquidExtendingBridge.java +++ b/core/src/io/anuke/mindustry/world/blocks/liquid/LiquidExtendingBridge.java @@ -21,7 +21,7 @@ public class LiquidExtendingBridge extends ExtendingItemBridge{ @Override public void update(Tile tile){ - ItemBridgeEntity entity = tile.entity(); + ItemBridgeEntity entity = tile.ent(); entity.time += entity.cycleSpeed * Time.delta(); entity.time2 += (entity.cycleSpeed - 1f) * Time.delta(); @@ -30,6 +30,8 @@ public class LiquidExtendingBridge extends ExtendingItemBridge{ if(!linkValid(tile, other)){ tryDumpLiquid(tile, entity.liquids.current()); }else{ + ((ItemBridgeEntity)world.tile(entity.link).entity).incoming.add(tile.pos()); + if(entity.cons.valid()){ entity.uptime = Mathf.lerpDelta(entity.uptime, 1f, 0.04f); }else{ diff --git a/core/src/io/anuke/mindustry/world/blocks/liquid/LiquidOverflowGate.java b/core/src/io/anuke/mindustry/world/blocks/liquid/LiquidOverflowGate.java index dafcef1508..3004835249 100644 --- a/core/src/io/anuke/mindustry/world/blocks/liquid/LiquidOverflowGate.java +++ b/core/src/io/anuke/mindustry/world/blocks/liquid/LiquidOverflowGate.java @@ -9,7 +9,7 @@ import io.anuke.mindustry.world.meta.*; //TODO implement later public class LiquidOverflowGate extends LiquidBlock{ - int topRegion; + public int topRegion; public LiquidOverflowGate(String name){ super(name); diff --git a/core/src/io/anuke/mindustry/world/blocks/logic/MessageBlock.java b/core/src/io/anuke/mindustry/world/blocks/logic/MessageBlock.java index 9b773c6356..0cb2611815 100644 --- a/core/src/io/anuke/mindustry/world/blocks/logic/MessageBlock.java +++ b/core/src/io/anuke/mindustry/world/blocks/logic/MessageBlock.java @@ -61,7 +61,7 @@ public class MessageBlock extends Block{ } } - MessageBlockEntity entity = tile.entity(); + MessageBlockEntity entity = tile.ent(); if(entity != null){ entity.message = result.toString(); entity.lines = entity.message.split("\n"); @@ -70,7 +70,7 @@ public class MessageBlock extends Block{ @Override public void drawSelect(Tile tile){ - MessageBlockEntity entity = tile.entity(); + MessageBlockEntity entity = tile.ent(); BitmapFont font = Fonts.outline; GlyphLayout l = Pools.obtain(GlyphLayout.class, GlyphLayout::new); boolean ints = font.usesIntegerPositions(); @@ -95,8 +95,8 @@ public class MessageBlock extends Block{ } @Override - public void buildTable(Tile tile, Table table){ - MessageBlockEntity entity = tile.entity(); + public void buildConfiguration(Tile tile, Table table){ + MessageBlockEntity entity = tile.ent(); table.addImageButton(Icon.pencilSmall, () -> { if(mobile){ diff --git a/core/src/io/anuke/mindustry/world/blocks/power/ImpactReactor.java b/core/src/io/anuke/mindustry/world/blocks/power/ImpactReactor.java index 6c55c9e466..e74eab58ef 100644 --- a/core/src/io/anuke/mindustry/world/blocks/power/ImpactReactor.java +++ b/core/src/io/anuke/mindustry/world/blocks/power/ImpactReactor.java @@ -19,17 +19,17 @@ import java.io.*; import static io.anuke.mindustry.Vars.*; public class ImpactReactor extends PowerGenerator{ - protected int timerUse = timers++; + public final int timerUse = timers++; - protected int plasmas = 4; - protected float warmupSpeed = 0.001f; - protected float itemDuration = 60f; - protected int explosionRadius = 50; - protected int explosionDamage = 2000; + public int plasmas = 4; + public float warmupSpeed = 0.001f; + public float itemDuration = 60f; + public int explosionRadius = 50; + public int explosionDamage = 2000; - protected Color plasma1 = Color.valueOf("ffd06b"), plasma2 = Color.valueOf("ff361b"); - protected int bottomRegion; - protected int[] plasmaRegions; + public Color plasma1 = Color.valueOf("ffd06b"), plasma2 = Color.valueOf("ff361b"); + public int bottomRegion; + public int[] plasmaRegions; public ImpactReactor(String name){ super(name); @@ -69,7 +69,7 @@ public class ImpactReactor extends PowerGenerator{ @Override public void update(Tile tile){ - FusionReactorEntity entity = tile.entity(); + FusionReactorEntity entity = tile.ent(); if(entity.cons.valid() && entity.power.status >= 0.99f){ boolean prevOut = getPowerProduction(tile) <= consumes.getPower().requestedPower(entity); @@ -95,7 +95,7 @@ public class ImpactReactor extends PowerGenerator{ @Override public void draw(Tile tile){ - FusionReactorEntity entity = tile.entity(); + FusionReactorEntity entity = tile.ent(); Draw.rect(reg(bottomRegion), tile.drawx(), tile.drawy()); @@ -118,7 +118,7 @@ public class ImpactReactor extends PowerGenerator{ @Override public void drawLight(Tile tile){ - float fract = tile.entity().warmup; + float fract = tile.ent().warmup; renderer.lights.add(tile.drawx(), tile.drawy(), (110f + Mathf.absin(5, 5f)) * fract, Tmp.c1.set(plasma2).lerp(plasma1, Mathf.absin(7f, 0.2f)), 0.8f * fract); } @@ -131,9 +131,9 @@ public class ImpactReactor extends PowerGenerator{ public void onDestroyed(Tile tile){ super.onDestroyed(tile); - FusionReactorEntity entity = tile.entity(); + FusionReactorEntity entity = tile.ent(); - if(entity.warmup < 0.4f) return; + if(entity.warmup < 0.4f || !state.rules.reactorExplosions) return; Sounds.explosionbig.at(tile); diff --git a/core/src/io/anuke/mindustry/world/blocks/power/ItemLiquidGenerator.java b/core/src/io/anuke/mindustry/world/blocks/power/ItemLiquidGenerator.java index 07effa5b30..75bd3bd578 100644 --- a/core/src/io/anuke/mindustry/world/blocks/power/ItemLiquidGenerator.java +++ b/core/src/io/anuke/mindustry/world/blocks/power/ItemLiquidGenerator.java @@ -20,20 +20,20 @@ import static io.anuke.mindustry.Vars.*; * Liquids will take priority over items. */ public class ItemLiquidGenerator extends PowerGenerator{ - protected float minItemEfficiency = 0.2f; + public float minItemEfficiency = 0.2f; /** The time in number of ticks during which a single item will produce power. */ - protected float itemDuration = 70f; + public float itemDuration = 70f; - protected float minLiquidEfficiency = 0.2f; + public float minLiquidEfficiency = 0.2f; /** Maximum liquid used per frame. */ - protected float maxLiquidGenerate = 0.4f; + public float maxLiquidGenerate = 0.4f; - protected Effect generateEffect = Fx.generatespark; - protected Effect explodeEffect = Fx.generatespark; - protected Color heatColor = Color.valueOf("ff9b59"); - protected TextureRegion topRegion, liquidRegion; - protected boolean randomlyExplode = true; - protected boolean defaults = false; + public Effect generateEffect = Fx.generatespark; + public Effect explodeEffect = Fx.generatespark; + public Color heatColor = Color.valueOf("ff9b59"); + public TextureRegion topRegion, liquidRegion; + public boolean randomlyExplode = true; + public boolean defaults = false; public ItemLiquidGenerator(boolean hasItems, boolean hasLiquids, String name){ this(name); @@ -87,13 +87,13 @@ public class ItemLiquidGenerator extends PowerGenerator{ @Override public boolean productionValid(Tile tile){ - ItemLiquidGeneratorEntity entity = tile.entity(); + ItemLiquidGeneratorEntity entity = tile.ent(); return entity.generateTime > 0; } @Override public void update(Tile tile){ - ItemLiquidGeneratorEntity entity = tile.entity(); + ItemLiquidGeneratorEntity entity = tile.ent(); //Note: Do not use this delta when calculating the amount of power or the power efficiency, but use it for resource consumption if necessary. //Power amount is delta'd by PowerGraph class already. @@ -156,7 +156,7 @@ public class ItemLiquidGenerator extends PowerGenerator{ public void draw(Tile tile){ super.draw(tile); - ItemLiquidGeneratorEntity entity = tile.entity(); + ItemLiquidGeneratorEntity entity = tile.ent(); if(hasItems){ Draw.color(heatColor); @@ -175,7 +175,7 @@ public class ItemLiquidGenerator extends PowerGenerator{ @Override public void drawLight(Tile tile){ - ItemLiquidGeneratorEntity entity = tile.entity(); + ItemLiquidGeneratorEntity entity = tile.ent(); renderer.lights.add(tile.drawx(), tile.drawy(), (60f + Mathf.absin(10f, 5f)) * entity.productionEfficiency * size, Color.orange, 0.5f); } diff --git a/core/src/io/anuke/mindustry/world/blocks/power/LightBlock.java b/core/src/io/anuke/mindustry/world/blocks/power/LightBlock.java index a85fdf937b..989775dc40 100644 --- a/core/src/io/anuke/mindustry/world/blocks/power/LightBlock.java +++ b/core/src/io/anuke/mindustry/world/blocks/power/LightBlock.java @@ -16,9 +16,9 @@ import static io.anuke.mindustry.Vars.*; public class LightBlock extends Block{ private static int lastColor = 0; - protected float brightness = 0.9f; - protected float radius = 200f; - protected int topRegion; + public float brightness = 0.9f; + public float radius = 200f; + public int topRegion; public LightBlock(String name){ super(name); @@ -39,7 +39,7 @@ public class LightBlock extends Block{ @Override public void draw(Tile tile){ super.draw(tile); - LightEntity entity = tile.entity(); + LightEntity entity = tile.ent(); Draw.blend(Blending.additive); Draw.color(Tmp.c1.set(entity.color), entity.efficiency() * 0.3f); @@ -49,8 +49,8 @@ public class LightBlock extends Block{ } @Override - public void buildTable(Tile tile, Table table){ - LightEntity entity = tile.entity(); + public void buildConfiguration(Tile tile, Table table){ + LightEntity entity = tile.ent(); table.addImageButton(Icon.pencilSmall, () -> { ui.picker.show(Tmp.c1.set(entity.color).a(0.5f), false, res -> { @@ -63,18 +63,23 @@ public class LightBlock extends Block{ @Override public void configured(Tile tile, Player player, int value){ - tile.entity().color = value; + tile.ent().color = value; } @Override public void drawLight(Tile tile){ - LightEntity entity = tile.entity(); + LightEntity entity = tile.ent(); renderer.lights.add(tile.drawx(), tile.drawy(), radius, Tmp.c1.set(entity.color), brightness * tile.entity.efficiency()); } public class LightEntity extends TileEntity{ public int color = Pal.accent.rgba(); + @Override + public int config(){ + return color; + } + @Override public void write(DataOutput stream) throws IOException{ super.write(stream); diff --git a/core/src/io/anuke/mindustry/world/blocks/power/NuclearReactor.java b/core/src/io/anuke/mindustry/world/blocks/power/NuclearReactor.java index 29928230d5..5957a92ac6 100644 --- a/core/src/io/anuke/mindustry/world/blocks/power/NuclearReactor.java +++ b/core/src/io/anuke/mindustry/world/blocks/power/NuclearReactor.java @@ -22,22 +22,22 @@ import java.io.*; import static io.anuke.mindustry.Vars.*; public class NuclearReactor extends PowerGenerator{ - protected final int timerFuel = timers++; + public final int timerFuel = timers++; - protected final Vector2 tr = new Vector2(); + public final Vector2 tr = new Vector2(); - protected Color lightColor = Color.valueOf("7f19ea"); - protected Color coolColor = new Color(1, 1, 1, 0f); - protected Color hotColor = Color.valueOf("ff9575a3"); - protected float itemDuration = 120; //time to consume 1 fuel - protected float heating = 0.01f; //heating per frame * fullness - protected float smokeThreshold = 0.3f; //threshold at which block starts smoking - protected int explosionRadius = 40; - protected int explosionDamage = 1350; - protected float flashThreshold = 0.46f; //heat threshold at which the lights start flashing - protected float coolantPower = 0.5f; + public Color lightColor = Color.valueOf("7f19ea"); + public Color coolColor = new Color(1, 1, 1, 0f); + public Color hotColor = Color.valueOf("ff9575a3"); + public float itemDuration = 120; //time to consume 1 fuel + public float heating = 0.01f; //heating per frame * fullness + public float smokeThreshold = 0.3f; //threshold at which block starts smoking + public int explosionRadius = 40; + public int explosionDamage = 1350; + public float flashThreshold = 0.46f; //heat threshold at which the lights start flashing + public float coolantPower = 0.5f; - protected TextureRegion topRegion, lightsRegion; + public TextureRegion topRegion, lightsRegion; public NuclearReactor(String name){ super(name); @@ -73,7 +73,7 @@ public class NuclearReactor extends PowerGenerator{ @Override public void update(Tile tile){ - NuclearReactorEntity entity = tile.entity(); + NuclearReactorEntity entity = tile.ent(); ConsumeLiquid cliquid = consumes.get(ConsumeType.liquid); Item item = consumes.get(ConsumeType.item).items[0].item; @@ -91,10 +91,9 @@ public class NuclearReactor extends PowerGenerator{ } Liquid liquid = cliquid.liquid; - float liquidAmount = cliquid.amount; if(entity.heat > 0){ - float maxUsed = Math.min(Math.min(entity.liquids.get(liquid), entity.heat / coolantPower), liquidAmount * entity.delta()); + float maxUsed = Math.min(entity.liquids.get(liquid), entity.heat / coolantPower); entity.heat -= maxUsed * coolantPower; entity.liquids.remove(liquid, maxUsed); } @@ -121,7 +120,7 @@ public class NuclearReactor extends PowerGenerator{ Sounds.explosionbig.at(tile); - NuclearReactorEntity entity = tile.entity(); + NuclearReactorEntity entity = tile.ent(); int fuel = entity.items.get(consumes.get(ConsumeType.item).items[0].item); @@ -152,7 +151,7 @@ public class NuclearReactor extends PowerGenerator{ @Override public void drawLight(Tile tile){ - NuclearReactorEntity entity = tile.entity(); + NuclearReactorEntity entity = tile.ent(); float fract = entity.productionEfficiency; renderer.lights.add(tile.drawx(), tile.drawy(), (90f + Mathf.absin(5, 5f)) * fract, Tmp.c1.set(lightColor).lerp(Color.scarlet, entity.heat), 0.6f * fract); } @@ -161,7 +160,7 @@ public class NuclearReactor extends PowerGenerator{ public void draw(Tile tile){ super.draw(tile); - NuclearReactorEntity entity = tile.entity(); + NuclearReactorEntity entity = tile.ent(); Draw.color(coolColor, hotColor, entity.heat); Fill.rect(tile.drawx(), tile.drawy(), size * tilesize, size * tilesize); diff --git a/core/src/io/anuke/mindustry/world/blocks/power/PowerDiode.java b/core/src/io/anuke/mindustry/world/blocks/power/PowerDiode.java index b8a1090591..1dee0636a5 100644 --- a/core/src/io/anuke/mindustry/world/blocks/power/PowerDiode.java +++ b/core/src/io/anuke/mindustry/world/blocks/power/PowerDiode.java @@ -13,7 +13,7 @@ import io.anuke.arc.graphics.g2d.TextureRegion; import io.anuke.mindustry.entities.traits.BuilderTrait; public class PowerDiode extends Block{ - protected TextureRegion arrow; + public TextureRegion arrow; public PowerDiode(String name){ super(name); @@ -50,16 +50,16 @@ public class PowerDiode extends Block{ } // battery % of the graph on either side, defaults to zero - protected float bar(Tile tile){ - return tile.block().hasPower ? tile.entity.power.graph.getBatteryStored() / tile.entity.power.graph.getTotalBatteryCapacity() : 0f; + public float bar(Tile tile){ + return (tile != null && tile.block().hasPower) ? tile.entity.power.graph.getBatteryStored() / tile.entity.power.graph.getTotalBatteryCapacity() : 0f; } @Override public void setBars(){ super.setBars(); - bars.add("back", entity -> new Bar("bar.input", Pal.lighterOrange, () -> bar(entity.tile.back())) ); - bars.add("front", entity -> new Bar("bar.output", Pal.lighterOrange, () -> bar(entity.tile.front())) ); + bars.add("back", entity -> new Bar("bar.input", Pal.powerBar, () -> bar(entity.tile.back()))); + bars.add("front", entity -> new Bar("bar.output", Pal.powerBar, () -> bar(entity.tile.front()))); } @Override diff --git a/core/src/io/anuke/mindustry/world/blocks/power/PowerGenerator.java b/core/src/io/anuke/mindustry/world/blocks/power/PowerGenerator.java index 9f0f21f008..7612e9ff16 100644 --- a/core/src/io/anuke/mindustry/world/blocks/power/PowerGenerator.java +++ b/core/src/io/anuke/mindustry/world/blocks/power/PowerGenerator.java @@ -13,11 +13,12 @@ import java.io.*; public class PowerGenerator extends PowerDistributor{ /** The amount of power produced per tick in case of an efficiency of 1.0, which represents 100%. */ - protected float powerProduction; + public float powerProduction; public BlockStat generationType = BlockStat.basePowerGeneration; public PowerGenerator(String name){ super(name); + sync = true; baseExplosiveness = 5f; flags = EnumSet.of(BlockFlag.producer); entityType = GeneratorEntity::new; @@ -44,7 +45,7 @@ public class PowerGenerator extends PowerDistributor{ @Override public float getPowerProduction(Tile tile){ - return powerProduction * tile.entity().productionEfficiency; + return powerProduction * tile.ent().productionEfficiency; } @Override diff --git a/core/src/io/anuke/mindustry/world/blocks/power/PowerGraph.java b/core/src/io/anuke/mindustry/world/blocks/power/PowerGraph.java index 07ebe96040..d0d1a80425 100644 --- a/core/src/io/anuke/mindustry/world/blocks/power/PowerGraph.java +++ b/core/src/io/anuke/mindustry/world/blocks/power/PowerGraph.java @@ -1,11 +1,10 @@ package io.anuke.mindustry.world.blocks.power; -import io.anuke.arc.Core; +import io.anuke.arc.*; import io.anuke.arc.collection.*; -import io.anuke.arc.math.Mathf; -import io.anuke.arc.math.WindowedMean; -import io.anuke.arc.util.Time; -import io.anuke.mindustry.world.Tile; +import io.anuke.arc.math.*; +import io.anuke.arc.util.*; +import io.anuke.mindustry.world.*; import io.anuke.mindustry.world.consumers.*; public class PowerGraph{ @@ -181,6 +180,7 @@ public class PowerGraph{ tile.entity.power.status = 1f; } + lastPowerNeeded = lastPowerProduced = 1f; return; } @@ -192,21 +192,22 @@ public class PowerGraph{ lastPowerNeeded = powerNeeded; lastPowerProduced = powerProduced; - powerBalance.addValue((powerProduced - powerNeeded) / Time.delta()); + if(!(consumers.size == 0 && producers.size == 0 && batteries.size == 0)){ - if(consumers.size == 0 && producers.size == 0 && batteries.size == 0){ - return; - } - - if(!Mathf.equal(powerNeeded, powerProduced)){ - if(powerNeeded > powerProduced){ - powerProduced += useBatteries(powerNeeded - powerProduced); - }else if(powerProduced > powerNeeded){ - powerProduced -= chargeBatteries(powerProduced - powerNeeded); + if(!Mathf.equal(powerNeeded, powerProduced)){ + if(powerNeeded > powerProduced){ + float powerBatteryUsed = useBatteries(powerNeeded - powerProduced); + powerProduced += powerBatteryUsed; + lastPowerProduced += powerBatteryUsed; + }else if(powerProduced > powerNeeded){ + powerProduced -= chargeBatteries(powerProduced - powerNeeded); + } } + + distributePower(powerNeeded, powerProduced); } - distributePower(powerNeeded, powerProduced); + powerBalance.addValue((lastPowerProduced - lastPowerNeeded) / Time.delta()); } public void add(PowerGraph graph){ @@ -295,7 +296,7 @@ public class PowerGraph{ private boolean otherConsumersAreValid(Tile tile, Consume consumePower){ for(Consume cons : tile.block().consumes.all()){ - if(cons != consumePower && !cons.isOptional() && !cons.valid(tile.entity())){ + if(cons != consumePower && !cons.isOptional() && !cons.valid(tile.ent())){ return false; } } 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 6a5d1e9c11..bfd60a2cdb 100644 --- a/core/src/io/anuke/mindustry/world/blocks/power/PowerNode.java +++ b/core/src/io/anuke/mindustry/world/blocks/power/PowerNode.java @@ -21,12 +21,12 @@ import static io.anuke.mindustry.Vars.*; public class PowerNode extends PowerBlock{ protected static boolean returnValue = false; - protected ObjectSet graphs = new ObjectSet<>(); - protected Vector2 t1 = new Vector2(), t2 = new Vector2(); - protected TextureRegion laser, laserEnd; + protected final ObjectSet graphs = new ObjectSet<>(); + protected final Vector2 t1 = new Vector2(), t2 = new Vector2(); - protected float laserRange = 6; - protected int maxNodes = 3; + public TextureRegion laser, laserEnd; + public float laserRange = 6; + public int maxNodes = 3; public PowerNode(String name){ super(name); @@ -91,7 +91,7 @@ public class PowerNode extends PowerBlock{ Core.bundle.format("bar.powerbalance", ((entity.power.graph.getPowerBalance() >= 0 ? "+" : "") + Strings.fixed(entity.power.graph.getPowerBalance() * 60, 1))), () -> Pal.powerBar, - () -> Mathf.clamp(entity.power.graph.getPowerProduced() / entity.power.graph.getPowerNeeded()))); + () -> Mathf.clamp(entity.power.graph.getLastPowerProduced() / entity.power.graph.getLastPowerNeeded()))); bars.add("batteries", entity -> new Bar(() -> Core.bundle.format("bar.powerstored", @@ -108,7 +108,7 @@ public class PowerNode extends PowerBlock{ && !other.entity.proximity().contains(tile) && other.entity.power.graph != tile.entity.power.graph; tempTiles.clear(); - Geometry.circle(tile.x, tile.y, (int)(laserRange + 1), (x, y) -> { + Geometry.circle(tile.x, tile.y, (int)(laserRange + 2), (x, y) -> { Tile other = world.ltile(x, y); if(valid.get(other)){ if(!insulated(tile, other)){ @@ -139,7 +139,7 @@ public class PowerNode extends PowerBlock{ tempTiles.clear(); graphs.clear(); - Geometry.circle(tile.x, tile.y, (int)(laserRange + 1), (x, y) -> { + Geometry.circle(tile.x, tile.y, (int)(laserRange + 2), (x, y) -> { Tile other = world.ltile(x, y); if(valid.get(other) && !tempTiles.contains(other)){ tempTiles.add(other); @@ -172,7 +172,7 @@ public class PowerNode extends PowerBlock{ @Override public boolean onConfigureTileTapped(Tile tile, Tile other){ - TileEntity entity = tile.entity(); + TileEntity entity = tile.ent(); other = other.link(); if(linkValid(tile, other)){ @@ -183,7 +183,7 @@ public class PowerNode extends PowerBlock{ if(tile == other){ if(other.entity.power.links.size == 0){ getPotentialLinks(tile, link -> { - tile.configure(link.pos()); + if(!insulated(tile, link)) tile.configure(link.pos()); }); }else{ while(entity.power.links.size > 0){ @@ -220,8 +220,8 @@ public class PowerNode extends PowerBlock{ Lines.stroke(1.5f); - for(int x = (int)(tile.x - laserRange - 1); x <= tile.x + laserRange + 1; x++){ - for(int y = (int)(tile.y - laserRange - 1); y <= tile.y + laserRange + 1; y++){ + for(int x = (int)(tile.x - laserRange - 2); x <= tile.x + laserRange + 2; x++){ + for(int y = (int)(tile.y - laserRange - 2); y <= tile.y + laserRange + 2; y++){ Tile link = world.ltile(x, y); if(link != tile && linkValid(tile, link, false)){ @@ -262,7 +262,7 @@ public class PowerNode extends PowerBlock{ public void drawLayer(Tile tile){ if(Core.settings.getInt("lasersopacity") == 0) return; - TileEntity entity = tile.entity(); + TileEntity entity = tile.ent(); for(int i = 0; i < entity.power.links.size; i++){ Tile link = world.tile(entity.power.links.get(i)); diff --git a/core/src/io/anuke/mindustry/world/blocks/power/SolarGenerator.java b/core/src/io/anuke/mindustry/world/blocks/power/SolarGenerator.java index 4844fc2297..81712ba4bc 100644 --- a/core/src/io/anuke/mindustry/world/blocks/power/SolarGenerator.java +++ b/core/src/io/anuke/mindustry/world/blocks/power/SolarGenerator.java @@ -17,7 +17,7 @@ public class SolarGenerator extends PowerGenerator{ @Override public void update(Tile tile){ - tile.entity().productionEfficiency = state.rules.lighting ? 1f - state.rules.ambientLight.a : 1f; + tile.ent().productionEfficiency = state.rules.lighting ? 1f - state.rules.ambientLight.a : 1f; } @Override diff --git a/core/src/io/anuke/mindustry/world/blocks/power/ThermalGenerator.java b/core/src/io/anuke/mindustry/world/blocks/power/ThermalGenerator.java index b2d9576718..61570c66df 100644 --- a/core/src/io/anuke/mindustry/world/blocks/power/ThermalGenerator.java +++ b/core/src/io/anuke/mindustry/world/blocks/power/ThermalGenerator.java @@ -12,7 +12,7 @@ import io.anuke.mindustry.world.meta.*; import static io.anuke.mindustry.Vars.renderer; public class ThermalGenerator extends PowerGenerator{ - protected Effect generateEffect = Fx.none; + public Effect generateEffect = Fx.none; public ThermalGenerator(String name){ super(name); @@ -20,7 +20,7 @@ public class ThermalGenerator extends PowerGenerator{ @Override public void update(Tile tile){ - GeneratorEntity entity = tile.entity(); + GeneratorEntity entity = tile.ent(); if(entity.productionEfficiency > 0.1f && Mathf.chance(0.05 * entity.delta())){ Effects.effect(generateEffect, tile.drawx() + Mathf.range(3f), tile.drawy() + Mathf.range(3f)); @@ -34,7 +34,7 @@ public class ThermalGenerator extends PowerGenerator{ @Override public void drawLight(Tile tile){ - GeneratorEntity entity = tile.entity(); + GeneratorEntity entity = tile.ent(); renderer.lights.add(tile.drawx(), tile.drawy(), (40f + Mathf.absin(10f, 5f)) * entity.productionEfficiency * size, Color.scarlet, 0.4f); } @@ -42,7 +42,7 @@ public class ThermalGenerator extends PowerGenerator{ public void onProximityAdded(Tile tile){ super.onProximityAdded(tile); - GeneratorEntity entity = tile.entity(); + GeneratorEntity entity = tile.ent(); entity.productionEfficiency = sumAttribute(Attribute.heat, tile.x, tile.y); } @@ -50,7 +50,7 @@ public class ThermalGenerator extends PowerGenerator{ public float getPowerProduction(Tile tile){ //in this case, productionEfficiency means 'total heat' //thus, it may be greater than 1.0 - return powerProduction * tile.entity().productionEfficiency; + return powerProduction * tile.ent().productionEfficiency; } @Override diff --git a/core/src/io/anuke/mindustry/world/blocks/production/Cultivator.java b/core/src/io/anuke/mindustry/world/blocks/production/Cultivator.java index c3901d435c..640f438b40 100644 --- a/core/src/io/anuke/mindustry/world/blocks/production/Cultivator.java +++ b/core/src/io/anuke/mindustry/world/blocks/production/Cultivator.java @@ -16,14 +16,14 @@ import io.anuke.mindustry.world.meta.Attribute; import java.io.*; public class Cultivator extends GenericCrafter{ - protected static final Color plantColor = Color.valueOf("5541b1"); - protected static final Color plantColorLight = Color.valueOf("7457ce"); - protected static final Color bottomColor = Color.valueOf("474747"); + public Color plantColor = Color.valueOf("5541b1"); + public Color plantColorLight = Color.valueOf("7457ce"); + public Color bottomColor = Color.valueOf("474747"); - protected TextureRegion middleRegion, topRegion; - protected RandomXS128 random = new RandomXS128(0); - protected float recurrence = 6f; - protected Attribute attribute = Attribute.spores; + public TextureRegion middleRegion, topRegion; + public RandomXS128 random = new RandomXS128(0); + public float recurrence = 6f; + public Attribute attribute = Attribute.spores; public Cultivator(String name){ super(name); @@ -43,7 +43,7 @@ public class Cultivator extends GenericCrafter{ public void update(Tile tile){ super.update(tile); - CultivatorEntity entity = tile.entity(); + CultivatorEntity entity = tile.ent(); entity.warmup = Mathf.lerpDelta(entity.warmup, entity.cons.valid() ? 1f : 0f, 0.015f); } @@ -64,7 +64,7 @@ public class Cultivator extends GenericCrafter{ @Override public void draw(Tile tile){ - CultivatorEntity entity = tile.entity(); + CultivatorEntity entity = tile.ent(); Draw.rect(region, tile.drawx(), tile.drawy()); @@ -99,7 +99,7 @@ public class Cultivator extends GenericCrafter{ public void onProximityAdded(Tile tile){ super.onProximityAdded(tile); - CultivatorEntity entity = tile.entity(); + CultivatorEntity entity = tile.ent(); entity.boost = sumAttribute(attribute, tile.x, tile.y); } 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 c200de737b..865fb8aea7 100644 --- a/core/src/io/anuke/mindustry/world/blocks/production/Drill.java +++ b/core/src/io/anuke/mindustry/world/blocks/production/Drill.java @@ -21,41 +21,40 @@ import io.anuke.mindustry.world.meta.*; import static io.anuke.mindustry.Vars.*; public class Drill extends Block{ - protected final static float hardnessDrillMultiplier = 50f; + public float hardnessDrillMultiplier = 50f; protected final ObjectIntMap oreCount = new ObjectIntMap<>(); protected final Array itemArray = new Array<>(); /** Maximum tier of blocks this drill can mine. */ - protected int tier; + public int tier; /** Base time to drill one ore, in frames. */ - protected float drillTime = 300; + public float drillTime = 300; /** How many times faster the drill will progress when boosted by liquid. */ - protected float liquidBoostIntensity = 1.6f; + public float liquidBoostIntensity = 1.6f; /** Speed at which the drill speeds up. */ - protected float warmupSpeed = 0.02f; + public float warmupSpeed = 0.02f; //return variables for countOre protected Item returnItem; protected int returnCount; /** Whether to draw the item this drill is mining. */ - protected boolean drawMineItem = false; + public boolean drawMineItem = false; /** Effect played when an item is produced. This is colored. */ - protected Effect drillEffect = Fx.mine; + public Effect drillEffect = Fx.mine; /** Speed the drill bit rotates at. */ - protected float rotateSpeed = 2f; + public float rotateSpeed = 2f; /** Effect randomly played while drilling. */ - protected Effect updateEffect = Fx.pulverizeSmall; + public Effect updateEffect = Fx.pulverizeSmall; /** Chance the update effect will appear. */ - protected float updateEffectChance = 0.02f; + public float updateEffectChance = 0.02f; - protected boolean drawRim = false; - - protected Color heatColor = Color.valueOf("ff5512"); - protected TextureRegion rimRegion; - protected TextureRegion rotatorRegion; - protected TextureRegion topRegion; + public boolean drawRim = false; + public Color heatColor = Color.valueOf("ff5512"); + public TextureRegion rimRegion; + public TextureRegion rotatorRegion; + public TextureRegion topRegion; public Drill(String name){ super(name); @@ -99,7 +98,7 @@ public class Drill extends Block{ float s = 0.3f; float ts = 0.6f; - DrillEntity entity = tile.entity(); + DrillEntity entity = tile.ent(); Draw.rect(region, tile.drawx(), tile.drawy()); super.drawCracks(tile); @@ -134,6 +133,11 @@ public class Drill extends Block{ return tile.entity.items.total() < itemCapacity; } + @Override + public boolean shouldIdleSound(Tile tile){ + return tile.entity.efficiency() > 0.01f; + } + @Override public void drawPlace(int x, int y, int rotation, boolean valid){ Tile tile = world.tile(x, y); @@ -159,7 +163,7 @@ public class Drill extends Block{ @Override public void drawSelect(Tile tile){ - DrillEntity entity = tile.entity(); + DrillEntity entity = tile.ent(); if(entity.dominantItem != null){ float dx = tile.drawx() - size * tilesize/2f, dy = tile.drawy() + size * tilesize/2f; @@ -187,7 +191,7 @@ public class Drill extends Block{ Item item = list.get(i); table.addImage(Core.atlas.find(item.name + "1")).size(8 * 3).padRight(2).padLeft(2).padTop(3).padBottom(3); - table.add(item.localizedName()); + table.add(item.localizedName); if(i != list.size - 1){ table.add("/").padLeft(5).padRight(5); } @@ -235,7 +239,7 @@ public class Drill extends Block{ @Override public void update(Tile tile){ - DrillEntity entity = tile.entity(); + DrillEntity entity = tile.ent(); if(entity.dominantItem == null){ countOre(tile); diff --git a/core/src/io/anuke/mindustry/world/blocks/production/Fracker.java b/core/src/io/anuke/mindustry/world/blocks/production/Fracker.java index deb606eedd..d70d8e878c 100644 --- a/core/src/io/anuke/mindustry/world/blocks/production/Fracker.java +++ b/core/src/io/anuke/mindustry/world/blocks/production/Fracker.java @@ -6,11 +6,11 @@ import io.anuke.mindustry.world.*; import io.anuke.mindustry.world.meta.*; public class Fracker extends SolidPump{ - protected final float itemUseTime = 100f; + public float itemUseTime = 100f; - protected TextureRegion liquidRegion; - protected TextureRegion rotatorRegion; - protected TextureRegion topRegion; + public TextureRegion liquidRegion; + public TextureRegion rotatorRegion; + public TextureRegion topRegion; public Fracker(String name){ super(name); @@ -49,7 +49,7 @@ public class Fracker extends SolidPump{ @Override public void draw(Tile tile){ - FrackerEntity entity = tile.entity(); + FrackerEntity entity = tile.ent(); Draw.rect(region, tile.drawx(), tile.drawy()); super.drawCracks(tile); @@ -70,7 +70,7 @@ public class Fracker extends SolidPump{ @Override public void update(Tile tile){ - FrackerEntity entity = tile.entity(); + FrackerEntity entity = tile.ent(); if(entity.cons.valid()){ if(entity.accumulator >= itemUseTime){ diff --git a/core/src/io/anuke/mindustry/world/blocks/production/GenericCrafter.java b/core/src/io/anuke/mindustry/world/blocks/production/GenericCrafter.java index 1878ada116..00075370e4 100644 --- a/core/src/io/anuke/mindustry/world/blocks/production/GenericCrafter.java +++ b/core/src/io/anuke/mindustry/world/blocks/production/GenericCrafter.java @@ -17,16 +17,16 @@ import io.anuke.mindustry.world.meta.*; import java.io.*; public class GenericCrafter extends Block{ - protected ItemStack outputItem; - protected LiquidStack outputLiquid; + public ItemStack outputItem; + public LiquidStack outputLiquid; - protected float craftTime = 80; - protected Effect craftEffect = Fx.none; - protected Effect updateEffect = Fx.none; - protected float updateEffectChance = 0.04f; + public float craftTime = 80; + public Effect craftEffect = Fx.none; + public Effect updateEffect = Fx.none; + public float updateEffectChance = 0.04f; - protected Cons drawer = null; - protected Prov drawIcons = null; + public Cons drawer = null; + public Prov drawIcons = null; public GenericCrafter(String name){ super(name); @@ -35,6 +35,7 @@ public class GenericCrafter extends Block{ hasItems = true; health = 60; idleSound = Sounds.machine; + sync = true; idleSoundVolume = 0.03f; entityType = GenericCrafterEntity::new; } @@ -85,7 +86,7 @@ public class GenericCrafter extends Block{ @Override public void update(Tile tile){ - GenericCrafterEntity entity = tile.entity(); + GenericCrafterEntity entity = tile.ent(); if(entity.cons.valid()){ diff --git a/core/src/io/anuke/mindustry/world/blocks/production/GenericSmelter.java b/core/src/io/anuke/mindustry/world/blocks/production/GenericSmelter.java index 828decc1e0..3fe9e1eb7a 100644 --- a/core/src/io/anuke/mindustry/world/blocks/production/GenericSmelter.java +++ b/core/src/io/anuke/mindustry/world/blocks/production/GenericSmelter.java @@ -11,8 +11,8 @@ import static io.anuke.mindustry.Vars.renderer; /** A GenericCrafter with a new glowing region drawn on top. */ public class GenericSmelter extends GenericCrafter{ - protected Color flameColor = Color.valueOf("ffc999"); - protected TextureRegion topRegion; + public Color flameColor = Color.valueOf("ffc999"); + public TextureRegion topRegion; public GenericSmelter(String name){ super(name); @@ -28,7 +28,7 @@ public class GenericSmelter extends GenericCrafter{ public void draw(Tile tile){ super.draw(tile); - GenericCrafterEntity entity = tile.entity(); + GenericCrafterEntity entity = tile.ent(); //draw glowing center if(entity.warmup > 0f && flameColor.a > 0.001f){ @@ -50,7 +50,7 @@ public class GenericSmelter extends GenericCrafter{ @Override public void drawLight(Tile tile){ - GenericCrafterEntity entity = tile.entity(); + GenericCrafterEntity entity = tile.ent(); renderer.lights.add(tile.drawx(), tile.drawy(), (60f + Mathf.absin(10f, 5f)) * entity.warmup * size, flameColor, 0.65f); } diff --git a/core/src/io/anuke/mindustry/world/blocks/production/Incinerator.java b/core/src/io/anuke/mindustry/world/blocks/production/Incinerator.java index fce368f246..656476c4d8 100644 --- a/core/src/io/anuke/mindustry/world/blocks/production/Incinerator.java +++ b/core/src/io/anuke/mindustry/world/blocks/production/Incinerator.java @@ -15,8 +15,8 @@ import io.anuke.mindustry.world.Block; import io.anuke.mindustry.world.Tile; public class Incinerator extends Block{ - protected Effect effect = Fx.fuelburn; - protected Color flameColor = Color.valueOf("ffad9d"); + public Effect effect = Fx.fuelburn; + public Color flameColor = Color.valueOf("ffad9d"); public Incinerator(String name){ super(name); @@ -29,7 +29,7 @@ public class Incinerator extends Block{ @Override public void update(Tile tile){ - IncineratorEntity entity = tile.entity(); + IncineratorEntity entity = tile.ent(); if(entity.cons.valid()){ entity.heat = Mathf.lerpDelta(entity.heat, 1f, 0.04f); @@ -42,7 +42,7 @@ public class Incinerator extends Block{ public void draw(Tile tile){ super.draw(tile); - IncineratorEntity entity = tile.entity(); + IncineratorEntity entity = tile.ent(); if(entity.heat > 0f){ float g = 0.3f; @@ -68,7 +68,7 @@ public class Incinerator extends Block{ @Override public boolean acceptItem(Item item, Tile tile, Tile source){ - IncineratorEntity entity = tile.entity(); + IncineratorEntity entity = tile.ent(); return entity.heat > 0.5f; } @@ -81,7 +81,7 @@ public class Incinerator extends Block{ @Override public boolean acceptLiquid(Tile tile, Tile source, Liquid liquid, float amount){ - IncineratorEntity entity = tile.entity(); + IncineratorEntity entity = tile.ent(); return entity.heat > 0.5f; } diff --git a/core/src/io/anuke/mindustry/world/blocks/production/LiquidConverter.java b/core/src/io/anuke/mindustry/world/blocks/production/LiquidConverter.java index 6908ad4176..95fdc2184f 100644 --- a/core/src/io/anuke/mindustry/world/blocks/production/LiquidConverter.java +++ b/core/src/io/anuke/mindustry/world/blocks/production/LiquidConverter.java @@ -41,7 +41,7 @@ public class LiquidConverter extends GenericCrafter{ @Override public void update(Tile tile){ - GenericCrafterEntity entity = tile.entity(); + GenericCrafterEntity entity = tile.ent(); ConsumeLiquidBase cl = consumes.get(ConsumeType.liquid); if(tile.entity.cons.valid()){ diff --git a/core/src/io/anuke/mindustry/world/blocks/production/Pump.java b/core/src/io/anuke/mindustry/world/blocks/production/Pump.java index 9b91d8b98f..9142cc49af 100644 --- a/core/src/io/anuke/mindustry/world/blocks/production/Pump.java +++ b/core/src/io/anuke/mindustry/world/blocks/production/Pump.java @@ -19,7 +19,7 @@ public class Pump extends LiquidBlock{ protected final Array drawTiles = new Array<>(); protected final Array updateTiles = new Array<>(); - protected final int timerContentCheck = timers++; + public final int timerContentCheck = timers++; /** Pump amount, total. */ protected float pumpAmount = 1f; diff --git a/core/src/io/anuke/mindustry/world/blocks/production/Separator.java b/core/src/io/anuke/mindustry/world/blocks/production/Separator.java index bd3f98966b..c297851e67 100644 --- a/core/src/io/anuke/mindustry/world/blocks/production/Separator.java +++ b/core/src/io/anuke/mindustry/world/blocks/production/Separator.java @@ -64,7 +64,7 @@ public class Separator extends Block{ public void draw(Tile tile){ super.draw(tile); - GenericCrafterEntity entity = tile.entity(); + GenericCrafterEntity entity = tile.ent(); Draw.color(tile.entity.liquids.current().color); Draw.alpha(tile.entity.liquids.total() / liquidCapacity); @@ -78,7 +78,7 @@ public class Separator extends Block{ @Override public void update(Tile tile){ - GenericCrafterEntity entity = tile.entity(); + GenericCrafterEntity entity = tile.ent(); entity.totalProgress += entity.warmup * entity.delta(); diff --git a/core/src/io/anuke/mindustry/world/blocks/production/SolidPump.java b/core/src/io/anuke/mindustry/world/blocks/production/SolidPump.java index bb6cb397cf..e7ac5b0c14 100644 --- a/core/src/io/anuke/mindustry/world/blocks/production/SolidPump.java +++ b/core/src/io/anuke/mindustry/world/blocks/production/SolidPump.java @@ -20,12 +20,12 @@ import io.anuke.mindustry.world.meta.BlockStat; * Pump that makes liquid from solids and takes in power. Only works on solid floor blocks. */ public class SolidPump extends Pump{ - protected Liquid result = Liquids.water; - protected Effect updateEffect = Fx.none; - protected float updateEffectChance = 0.02f; - protected float rotateSpeed = 1f; + public Liquid result = Liquids.water; + public Effect updateEffect = Fx.none; + public float updateEffectChance = 0.02f; + public float rotateSpeed = 1f; /** Attribute that is checked when calculating output. */ - protected Attribute attribute; + public Attribute attribute; public SolidPump(String name){ super(name); @@ -67,7 +67,7 @@ public class SolidPump extends Pump{ @Override public void draw(Tile tile){ - SolidPumpEntity entity = tile.entity(); + SolidPumpEntity entity = tile.ent(); Draw.rect(region, tile.drawx(), tile.drawy()); Draw.color(tile.entity.liquids.current().color); @@ -85,7 +85,7 @@ public class SolidPump extends Pump{ @Override public void update(Tile tile){ - SolidPumpEntity entity = tile.entity(); + SolidPumpEntity entity = tile.ent(); float fraction = 0f; @@ -140,7 +140,7 @@ public class SolidPump extends Pump{ super.onProximityAdded(tile); if(attribute != null){ - SolidPumpEntity entity = tile.entity(); + SolidPumpEntity entity = tile.ent(); entity.boost = sumAttribute(attribute, tile.x, tile.y); } } 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 d38c9dc432..46e1e86ee2 100644 --- a/core/src/io/anuke/mindustry/world/blocks/sandbox/ItemSource.java +++ b/core/src/io/anuke/mindustry/world/blocks/sandbox/ItemSource.java @@ -30,7 +30,7 @@ public class ItemSource extends Block{ @Override public void configured(Tile tile, Player player, int value){ - tile.entity().outputItem = content.item(value); + tile.ent().outputItem = content.item(value); } @Override @@ -60,7 +60,7 @@ public class ItemSource extends Block{ public void draw(Tile tile){ super.draw(tile); - ItemSourceEntity entity = tile.entity(); + ItemSourceEntity entity = tile.ent(); if(entity.outputItem == null) return; Draw.color(entity.outputItem.color); @@ -70,7 +70,7 @@ public class ItemSource extends Block{ @Override public void update(Tile tile){ - ItemSourceEntity entity = tile.entity(); + ItemSourceEntity entity = tile.ent(); if(entity.outputItem == null) return; entity.items.set(entity.outputItem, 1); @@ -79,8 +79,8 @@ public class ItemSource extends Block{ } @Override - public void buildTable(Tile tile, Table table){ - ItemSourceEntity entity = tile.entity(); + public void buildConfiguration(Tile tile, Table table){ + ItemSourceEntity entity = tile.ent(); ItemSelection.buildItemTable(table, () -> entity.outputItem, item -> { lastItem = item; tile.configure(item == null ? -1 : item.id); 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 5513f462ec..ac260679a7 100644 --- a/core/src/io/anuke/mindustry/world/blocks/sandbox/LiquidSource.java +++ b/core/src/io/anuke/mindustry/world/blocks/sandbox/LiquidSource.java @@ -21,7 +21,7 @@ import java.io.*; import static io.anuke.mindustry.Vars.*; public class LiquidSource extends Block{ - private static Liquid lastLiquid; + public static Liquid lastLiquid; public LiquidSource(String name){ super(name); @@ -50,7 +50,7 @@ public class LiquidSource extends Block{ @Override public void update(Tile tile){ - LiquidSourceEntity entity = tile.entity(); + LiquidSourceEntity entity = tile.ent(); if(entity.source == null){ tile.entity.liquids.clear(); @@ -69,7 +69,7 @@ public class LiquidSource extends Block{ public void draw(Tile tile){ super.draw(tile); - LiquidSourceEntity entity = tile.entity(); + LiquidSourceEntity entity = tile.ent(); if(entity.source != null){ Draw.color(entity.source.color); @@ -79,8 +79,8 @@ public class LiquidSource extends Block{ } @Override - public void buildTable(Tile tile, Table table){ - LiquidSourceEntity entity = tile.entity(); + public void buildConfiguration(Tile tile, Table table){ + LiquidSourceEntity entity = tile.ent(); Array items = content.liquids(); @@ -109,7 +109,7 @@ public class LiquidSource extends Block{ @Override public void configured(Tile tile, Player player, int value){ - tile.entity().source = value == -1 ? null : content.liquid(value); + tile.ent().source = value == -1 ? null : content.liquid(value); } class LiquidSourceEntity extends TileEntity{ diff --git a/core/src/io/anuke/mindustry/world/blocks/storage/CoreBlock.java b/core/src/io/anuke/mindustry/world/blocks/storage/CoreBlock.java index c164e7011e..557dddce45 100644 --- a/core/src/io/anuke/mindustry/world/blocks/storage/CoreBlock.java +++ b/core/src/io/anuke/mindustry/world/blocks/storage/CoreBlock.java @@ -24,7 +24,7 @@ import io.anuke.mindustry.world.modules.*; import static io.anuke.mindustry.Vars.*; public class CoreBlock extends StorageBlock{ - protected Mech mech = Mechs.starter; + public Mech mech = Mechs.starter; public CoreBlock(String name){ super(name); @@ -43,7 +43,7 @@ public class CoreBlock extends StorageBlock{ public static void onUnitRespawn(Tile tile, Player player){ if(player == null || tile.entity == null) return; - CoreEntity entity = tile.entity(); + CoreEntity entity = tile.ent(); Effects.effect(Fx.spawn, entity); entity.progress = 0; entity.spawnPlayer = player; @@ -76,13 +76,13 @@ public class CoreBlock extends StorageBlock{ @Override public int getMaximumAccepted(Tile tile, Item item){ - CoreEntity entity = tile.entity(); + CoreEntity entity = tile.ent(); return item.type == ItemType.material ? entity.storageCapacity : 0; } @Override public void onProximityUpdate(Tile tile){ - CoreEntity entity = tile.entity(); + CoreEntity entity = tile.ent(); for(Tile other : state.teams.get(tile.getTeam()).cores){ if(other != tile){ @@ -94,7 +94,7 @@ public class CoreBlock extends StorageBlock{ entity.storageCapacity = itemCapacity + entity.proximity().sum(e -> isContainer(e) ? e.block().itemCapacity : 0); entity.proximity().each(this::isContainer, t -> { t.entity.items = entity.items; - t.entity().linkedCore = tile; + t.ent().linkedCore = tile; }); for(Tile other : state.teams.get(tile.getTeam()).cores){ @@ -109,7 +109,7 @@ public class CoreBlock extends StorageBlock{ } for(Tile other : state.teams.get(tile.getTeam()).cores){ - CoreEntity oe = other.entity(); + CoreEntity oe = other.ent(); oe.storageCapacity = entity.storageCapacity; } } @@ -183,7 +183,7 @@ public class CoreBlock extends StorageBlock{ @Override public void drawLayer(Tile tile){ - CoreEntity entity = tile.entity(); + CoreEntity entity = tile.ent(); if(entity.heat > 0.001f){ RespawnBlock.drawRespawn(tile, entity.heat, entity.progress, entity.time, entity.spawnPlayer, mech); @@ -202,7 +202,7 @@ public class CoreBlock extends StorageBlock{ @Override public void update(Tile tile){ - CoreEntity entity = tile.entity(); + CoreEntity entity = tile.ent(); if(entity.spawnPlayer != null){ if(!entity.spawnPlayer.isDead() || !entity.spawnPlayer.isAdded()){ @@ -225,7 +225,7 @@ public class CoreBlock extends StorageBlock{ @Override public boolean shouldActiveSound(Tile tile){ - CoreEntity entity = tile.entity(); + CoreEntity entity = tile.ent(); return entity.spawnPlayer != null; } diff --git a/core/src/io/anuke/mindustry/world/blocks/storage/LaunchPad.java b/core/src/io/anuke/mindustry/world/blocks/storage/LaunchPad.java index 6473e1c18e..92aa7ae75c 100644 --- a/core/src/io/anuke/mindustry/world/blocks/storage/LaunchPad.java +++ b/core/src/io/anuke/mindustry/world/blocks/storage/LaunchPad.java @@ -21,9 +21,9 @@ import static io.anuke.mindustry.Vars.data; import static io.anuke.mindustry.Vars.world; public class LaunchPad extends StorageBlock{ - protected final int timerLaunch = timers++; + public final int timerLaunch = timers++; /** Time inbetween launches. */ - protected float launchTime; + public float launchTime; public LaunchPad(String name){ super(name); @@ -80,6 +80,7 @@ public class LaunchPad extends StorageBlock{ int used = Math.min(entity.items.get(item), itemCapacity); data.addItem(item, used); entity.items.remove(item, used); + Events.fire(new LaunchItemEvent(item, used)); } } } 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 7746932916..710f97fbe3 100644 --- a/core/src/io/anuke/mindustry/world/blocks/storage/StorageBlock.java +++ b/core/src/io/anuke/mindustry/world/blocks/storage/StorageBlock.java @@ -16,7 +16,7 @@ public abstract class StorageBlock extends Block{ @Override public boolean acceptItem(Item item, Tile tile, Tile source){ - StorageBlockEntity entity = tile.entity(); + StorageBlockEntity entity = tile.ent(); return entity.linkedCore != null ? entity.linkedCore.block().acceptItem(item, entity.linkedCore, source) : tile.entity.items.get(item) < getMaximumAccepted(tile, item); } @@ -27,7 +27,7 @@ public abstract class StorageBlock extends Block{ @Override public void drawSelect(Tile tile){ - StorageBlockEntity entity = tile.entity(); + StorageBlockEntity entity = tile.ent(); if(entity.linkedCore != null){ entity.linkedCore.block().drawSelect(entity.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 f67701d4d5..8186ade094 100644 --- a/core/src/io/anuke/mindustry/world/blocks/storage/Unloader.java +++ b/core/src/io/anuke/mindustry/world/blocks/storage/Unloader.java @@ -15,8 +15,8 @@ import java.io.*; import static io.anuke.mindustry.Vars.content; public class Unloader extends Block{ - protected float speed = 1f; - protected final int timerUnload = timers++; + public float speed = 1f; + public final int timerUnload = timers++; private static Item lastItem; @@ -56,12 +56,12 @@ public class Unloader extends Block{ @Override public void configured(Tile tile, Player player, int value){ tile.entity.items.clear(); - tile.entity().sortItem = content.item(value); + tile.ent().sortItem = content.item(value); } @Override public void update(Tile tile){ - UnloaderEntity entity = tile.entity(); + UnloaderEntity entity = tile.ent(); if(tile.entity.timer.get(timerUnload, speed / entity.timeScale) && tile.entity.items.total() == 0){ for(Tile other : tile.entity.proximity()){ @@ -113,7 +113,7 @@ public class Unloader extends Block{ public void draw(Tile tile){ super.draw(tile); - UnloaderEntity entity = tile.entity(); + UnloaderEntity entity = tile.ent(); Draw.color(entity.sortItem == null ? Color.clear : entity.sortItem.color); Draw.rect("unloader-center", tile.worldx(), tile.worldy()); @@ -121,8 +121,8 @@ public class Unloader extends Block{ } @Override - public void buildTable(Tile tile, Table table){ - UnloaderEntity entity = tile.entity(); + public void buildConfiguration(Tile tile, Table table){ + UnloaderEntity entity = tile.ent(); ItemSelection.buildItemTable(table, () -> entity.sortItem, item -> { lastItem = item; tile.configure(item == null ? -1 : item.id); 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 d44b966493..9423ac6cae 100644 --- a/core/src/io/anuke/mindustry/world/blocks/units/CommandCenter.java +++ b/core/src/io/anuke/mindustry/world/blocks/units/CommandCenter.java @@ -45,8 +45,8 @@ public class CommandCenter extends Block{ ObjectSet set = indexer.getAllied(tile.getTeam(), BlockFlag.comandCenter); if(set.size > 0){ - CommandCenterEntity entity = tile.entity(); - CommandCenterEntity oe = set.first().entity(); + CommandCenterEntity entity = tile.ent(); + CommandCenterEntity oe = set.first().ent(); entity.command = oe.command; } } @@ -75,7 +75,7 @@ public class CommandCenter extends Block{ @Override public void draw(Tile tile){ - CommandCenterEntity entity = tile.entity(); + CommandCenterEntity entity = tile.ent(); super.draw(tile); float size = IconSize.small.size/4f; @@ -88,8 +88,8 @@ public class CommandCenter extends Block{ } @Override - public void buildTable(Tile tile, Table table){ - CommandCenterEntity entity = tile.entity(); + public void buildConfiguration(Tile tile, Table table){ + CommandCenterEntity entity = tile.ent(); ButtonGroup group = new ButtonGroup<>(); Table buttons = new Table(); @@ -109,7 +109,7 @@ public class CommandCenter extends Block{ for(Tile center : indexer.getAllied(tile.getTeam(), BlockFlag.comandCenter)){ if(center.block() instanceof CommandCenter){ - CommandCenterEntity entity = center.entity(); + CommandCenterEntity entity = center.ent(); entity.command = command; } } diff --git a/core/src/io/anuke/mindustry/world/blocks/units/MechPad.java b/core/src/io/anuke/mindustry/world/blocks/units/MechPad.java index ef7314e00b..594ec7b154 100644 --- a/core/src/io/anuke/mindustry/world/blocks/units/MechPad.java +++ b/core/src/io/anuke/mindustry/world/blocks/units/MechPad.java @@ -26,7 +26,7 @@ import static io.anuke.mindustry.Vars.*; public class MechPad extends Block{ public @NonNull Mech mech; - protected float buildTime = 60 * 5; + public float buildTime = 60 * 5; public MechPad(String name){ super(name); @@ -49,7 +49,7 @@ public class MechPad extends Block{ public static void onMechFactoryTap(Player player, Tile tile){ if(player == null || !(tile.block() instanceof MechPad) || !checkValidTap(tile, player)) return; - MechFactoryEntity entity = tile.entity(); + MechFactoryEntity entity = tile.ent(); if(!entity.cons.valid()) return; player.beginRespawning(entity); @@ -60,7 +60,7 @@ public class MechPad extends Block{ public static void onMechFactoryDone(Tile tile){ if(!(tile.entity instanceof MechFactoryEntity)) return; - MechFactoryEntity entity = tile.entity(); + MechFactoryEntity entity = tile.ent(); Effects.effect(Fx.spawn, entity); @@ -80,7 +80,7 @@ public class MechPad extends Block{ } protected static boolean checkValidTap(Tile tile, Player player){ - MechFactoryEntity entity = tile.entity(); + MechFactoryEntity entity = tile.ent(); return !player.isDead() && tile.interactable(player.getTeam()) && Math.abs(player.x - tile.drawx()) <= tile.block().size * tilesize && Math.abs(player.y - tile.drawy()) <= tile.block().size * tilesize && entity.cons.valid() && entity.player == null; } @@ -97,7 +97,7 @@ public class MechPad extends Block{ @Override public void tapped(Tile tile, Player player){ - MechFactoryEntity entity = tile.entity(); + MechFactoryEntity entity = tile.ent(); if(checkValidTap(tile, player)){ Call.onMechFactoryTap(player, tile); @@ -109,7 +109,7 @@ public class MechPad extends Block{ @Override public void drawLayer(Tile tile){ - MechFactoryEntity entity = tile.entity(); + MechFactoryEntity entity = tile.ent(); if(entity.player != null){ RespawnBlock.drawRespawn(tile, entity.heat, entity.progress, entity.time, entity.player, (!entity.sameMech && entity.player.mech == mech ? mech : Mechs.starter)); @@ -118,7 +118,7 @@ public class MechPad extends Block{ @Override public void update(Tile tile){ - MechFactoryEntity entity = tile.entity(); + MechFactoryEntity entity = tile.ent(); if(entity.player != null){ entity.player.set(tile.drawx(), tile.drawy()); diff --git a/core/src/io/anuke/mindustry/world/blocks/units/RepairPoint.java b/core/src/io/anuke/mindustry/world/blocks/units/RepairPoint.java index 6c5e8698b2..a6bfb1ffeb 100644 --- a/core/src/io/anuke/mindustry/world/blocks/units/RepairPoint.java +++ b/core/src/io/anuke/mindustry/world/blocks/units/RepairPoint.java @@ -19,13 +19,13 @@ import io.anuke.mindustry.world.meta.BlockFlag; public class RepairPoint extends Block{ private static Rectangle rect = new Rectangle(); - protected int timerTarget = timers++; + public int timerTarget = timers++; - protected float repairRadius = 50f; - protected float repairSpeed = 0.3f; - protected float powerUse; - protected TextureRegion baseRegion; - protected TextureRegion laser, laserEnd; + public float repairRadius = 50f; + public float repairSpeed = 0.3f; + public float powerUse; + public TextureRegion baseRegion; + public TextureRegion laser, laserEnd; public RepairPoint(String name){ super(name); @@ -66,14 +66,14 @@ public class RepairPoint extends Block{ @Override public void drawLayer(Tile tile){ - RepairPointEntity entity = tile.entity(); + RepairPointEntity entity = tile.ent(); Draw.rect(region, tile.drawx(), tile.drawy(), entity.rotation - 90); } @Override public void drawLayer2(Tile tile){ - RepairPointEntity entity = tile.entity(); + RepairPointEntity entity = tile.ent(); if(entity.target != null && Angles.angleDist(entity.angleTo(entity.target), entity.rotation) < 30f){ @@ -95,7 +95,7 @@ public class RepairPoint extends Block{ @Override public void update(Tile tile){ - RepairPointEntity entity = tile.entity(); + RepairPointEntity entity = tile.ent(); boolean targetIsBeingRepaired = false; if(entity.target != null && (entity.target.isDead() || entity.target.dst(tile) > repairRadius || entity.target.health >= entity.target.maxHealth())){ @@ -122,7 +122,7 @@ public class RepairPoint extends Block{ @Override public boolean shouldConsume(Tile tile){ - RepairPointEntity entity = tile.entity(); + RepairPointEntity entity = tile.ent(); return entity.target != null; } 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 678d43c10f..8879f991b5 100644 --- a/core/src/io/anuke/mindustry/world/blocks/units/UnitFactory.java +++ b/core/src/io/anuke/mindustry/world/blocks/units/UnitFactory.java @@ -27,12 +27,12 @@ import java.io.*; import static io.anuke.mindustry.Vars.*; public class UnitFactory extends Block{ - protected UnitType unitType; - protected float produceTime = 1000f; - protected float launchVelocity = 0f; - protected TextureRegion topRegion; - protected int maxSpawn = 4; - protected int[] capacities; + public UnitType unitType; + public float produceTime = 1000f; + public float launchVelocity = 0f; + public TextureRegion topRegion; + public int maxSpawn = 4; + public int[] capacities; public UnitFactory(String name){ super(name); @@ -48,7 +48,7 @@ public class UnitFactory extends Block{ public static void onUnitFactorySpawn(Tile tile, int spawns){ if(!(tile.entity instanceof UnitFactoryEntity) || !(tile.block() instanceof UnitFactory)) return; - UnitFactoryEntity entity = tile.entity(); + UnitFactoryEntity entity = tile.ent(); UnitFactory factory = (UnitFactory)tile.block(); entity.buildTime = 0f; @@ -110,7 +110,7 @@ public class UnitFactory extends Block{ @Override public void unitRemoved(Tile tile, Unit unit){ - UnitFactoryEntity entity = tile.entity(); + UnitFactoryEntity entity = tile.ent(); entity.spawned--; entity.spawned = Math.max(entity.spawned, 0); } @@ -122,7 +122,7 @@ public class UnitFactory extends Block{ @Override public void draw(Tile tile){ - UnitFactoryEntity entity = tile.entity(); + UnitFactoryEntity entity = tile.ent(); TextureRegion region = unitType.icon(Cicon.full); Draw.rect(name, tile.drawx(), tile.drawy()); @@ -153,7 +153,7 @@ public class UnitFactory extends Block{ @Override public void update(Tile tile){ - UnitFactoryEntity entity = tile.entity(); + UnitFactoryEntity entity = tile.ent(); if(entity.spawned >= maxSpawn){ return; @@ -184,7 +184,7 @@ public class UnitFactory extends Block{ @Override public boolean shouldConsume(Tile tile){ - UnitFactoryEntity entity = tile.entity(); + UnitFactoryEntity entity = tile.ent(); return entity.spawned < maxSpawn; } 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 c531fabe45..c19503c5d1 100644 --- a/core/src/io/anuke/mindustry/world/meta/values/AmmoListValue.java +++ b/core/src/io/anuke/mindustry/world/meta/values/AmmoListValue.java @@ -29,7 +29,7 @@ public class AmmoListValue implements StatValue{ for(T t : map.keys()){ BulletType type = map.get(t); table.addImage(icon(t)).size(3 * 8).padRight(4).right().top(); - table.add(t.localizedName()).padRight(10).left().top(); + table.add(t.localizedName).padRight(10).left().top(); table.table(Tex.underline, bt -> { bt.left().defaults().padRight(3).left(); diff --git a/core/src/io/anuke/mindustry/world/meta/values/BoosterListValue.java b/core/src/io/anuke/mindustry/world/meta/values/BoosterListValue.java index 4d1a867904..30c1ff0765 100644 --- a/core/src/io/anuke/mindustry/world/meta/values/BoosterListValue.java +++ b/core/src/io/anuke/mindustry/world/meta/values/BoosterListValue.java @@ -33,7 +33,7 @@ public class BoosterListValue implements StatValue{ if(!filter.get(liquid)) continue; c.addImage(liquid.icon(Cicon.medium)).size(3 * 8).padRight(4).right().top(); - c.add(liquid.localizedName()).padRight(10).left().top(); + c.add(liquid.localizedName).padRight(10).left().top(); c.table(Tex.underline, bt -> { bt.left().defaults().padRight(3).left(); diff --git a/desktop/build.gradle b/desktop/build.gradle index f8af30311c..acf5e0ae79 100644 --- a/desktop/build.gradle +++ b/desktop/build.gradle @@ -28,6 +28,10 @@ task run(dependsOn: classes, type: JavaExec){ args Eval.me(project.getProperties()["args"]) } + if(project.hasProperty("jvmArgs")){ + jvmArgs((List)Eval.me(project.getProperties()["jvmArgs"])) + } + if(args.contains("debug")){ main = "io.anuke.mindustry.DebugLauncher" } @@ -151,7 +155,7 @@ PackrConfig.Platform.values().each{ platform -> include "${lib}steamworks4j${platform == PackrConfig.Platform.Windows64 ? '64.dll' : platform == PackrConfig.Platform.Windows32 ? '.dll' : platform == PackrConfig.Platform.Linux64 ? '.so' : '.dylib'}" include "${lib}steam_api${platform == PackrConfig.Platform.Windows64 ? '64.dll' : platform == PackrConfig.Platform.Windows32 ? '.dll' : platform == PackrConfig.Platform.Linux64 ? '.so' : '.dylib'}" } - into "build/packr/output/" + into platform != PackrConfig.Platform.MacOS ? "build/packr/output/" : "build/packr/output/${appName}.app/Contents/Resources" } } diff --git a/desktop/src/io/anuke/mindustry/desktop/DesktopLauncher.java b/desktop/src/io/anuke/mindustry/desktop/DesktopLauncher.java index 1bea20db40..6f63976bf7 100644 --- a/desktop/src/io/anuke/mindustry/desktop/DesktopLauncher.java +++ b/desktop/src/io/anuke/mindustry/desktop/DesktopLauncher.java @@ -9,24 +9,18 @@ import io.anuke.arc.backends.sdl.jni.*; import io.anuke.arc.collection.*; import io.anuke.arc.files.*; import io.anuke.arc.func.*; -import io.anuke.arc.input.*; import io.anuke.arc.math.*; -import io.anuke.arc.scene.event.*; -import io.anuke.arc.scene.ui.*; import io.anuke.arc.util.*; -import io.anuke.arc.util.Log.*; -import io.anuke.arc.util.io.*; import io.anuke.arc.util.serialization.*; import io.anuke.mindustry.*; import io.anuke.mindustry.core.GameState.*; -import io.anuke.mindustry.core.Version; +import io.anuke.mindustry.core.*; import io.anuke.mindustry.desktop.steam.*; import io.anuke.mindustry.game.EventType.*; import io.anuke.mindustry.mod.Mods.*; import io.anuke.mindustry.net.*; import io.anuke.mindustry.net.Net.*; import io.anuke.mindustry.type.*; -import io.anuke.mindustry.ui.*; import java.io.*; import java.net.*; @@ -49,6 +43,7 @@ public class DesktopLauncher extends ClientLauncher{ public static void main(String[] arg){ try{ + Vars.loadLogger(); new SdlApplication(new DesktopLauncher(arg), new SdlConfig(){{ title = "Mindustry"; maximized = true; @@ -64,7 +59,6 @@ public class DesktopLauncher extends ClientLauncher{ } public DesktopLauncher(String[] args){ - Log.setUseColors(false); Version.init(); boolean useSteam = Version.modifier.contains("steam"); testMobile = Array.with(args).contains("-testMobile"); @@ -91,50 +85,7 @@ public class DesktopLauncher extends ClientLauncher{ } } - StringBuilder base = new StringBuilder(); - Log.setLogger(new LogHandler(){ - @Override - public void print(String text, Object... args){ - String out = Log.format(text, false, args); - - base.append(out).append("\n"); - } - }); - Events.on(ClientLoadEvent.class, event -> { - Label[] label = {null}; - boolean[] visible = {false}; - Core.scene.table(t -> { - t.touchable(Touchable.disabled); - t.top().left(); - t.update(() -> { - if(Core.input.keyTap(KeyCode.BACKTICK) && (loadError || System.getProperty("user.name").equals("anuke") || Version.modifier.contains("beta"))){ - visible[0] = !visible[0]; - } - - t.toFront(); - }); - t.table(Styles.black3, f -> label[0] = f.add("").get()).visible(() -> visible[0]); - label[0].getText().append(base); - }); - - Log.setLogger(new LogHandler(){ - @Override - public void print(String text, Object... args){ - super.print(text, args); - String out = Log.format(text, false, args); - - int maxlen = 2048; - - if(label[0].getText().length() > maxlen){ - label[0].setText(label[0].getText().substring(label[0].getText().length() - maxlen)); - } - - label[0].getText().append(out).append("\n"); - label[0].invalidateHierarchy(); - } - }); - if(steamError != null){ Core.app.post(() -> Core.app.post(() -> Core.app.post(() -> { ui.showErrorMessage(Core.bundle.format("steam.error", (steamError.getMessage() == null) ? steamError.getClass().getSimpleName() : steamError.getClass().getSimpleName() + ": " + steamError.getMessage())); @@ -156,6 +107,9 @@ public class DesktopLauncher extends ClientLauncher{ if(SteamAPI.restartAppIfNecessary(SVars.steamID)){ System.exit(0); } + }catch(NullPointerException ignored){ + steam = false; + Log.info("Running in offline mode."); }catch(Throwable e){ steam = false; Log.err("Failed to load Steam native libraries."); @@ -176,21 +130,8 @@ public class DesktopLauncher extends ClientLauncher{ } } - void fallbackSteam(){ - try{ - String name = "steam_api"; - if(OS.isMac || OS.isLinux) name = "lib" + name; - if(OS.isWindows && OS.is64Bit) name += "64"; - name += (OS.isLinux ? ".so" : OS.isMac ? ".dylib" : ".dll"); - Streams.copyStream(getClass().getResourceAsStream(name), new FileOutputStream(name)); - System.loadLibrary(new File(name).getAbsolutePath()); - }catch(Throwable e){ - logSteamError(e); - } - } - void initSteam(String[] args){ - SVars.net = new SNet(new ArcNetImpl()); + SVars.net = new SNet(new ArcNetProvider()); SVars.stats = new SStats(); SVars.workshop = new SWorkshop(); SVars.user = new SUser(); @@ -281,7 +222,7 @@ public class DesktopLauncher extends ClientLauncher{ @Override public NetProvider getNet(){ - return steam ? SVars.net : new ArcNetImpl(); + return steam ? SVars.net : new ArcNetProvider(); } @Override diff --git a/desktop/src/io/anuke/mindustry/desktop/steam/SNet.java b/desktop/src/io/anuke/mindustry/desktop/steam/SNet.java index 526152a52e..a3c8e5b178 100644 --- a/desktop/src/io/anuke/mindustry/desktop/steam/SNet.java +++ b/desktop/src/io/anuke/mindustry/desktop/steam/SNet.java @@ -13,7 +13,7 @@ import io.anuke.mindustry.core.GameState.*; import io.anuke.mindustry.core.Version; import io.anuke.mindustry.game.EventType.*; import io.anuke.mindustry.game.*; -import io.anuke.mindustry.net.ArcNetImpl.*; +import io.anuke.mindustry.net.ArcNetProvider.*; import io.anuke.mindustry.net.*; import io.anuke.mindustry.net.Net.*; import io.anuke.mindustry.net.Packets.*; diff --git a/desktop/src/io/anuke/mindustry/desktop/steam/SStats.java b/desktop/src/io/anuke/mindustry/desktop/steam/SStats.java index d7678d7a92..7c083d5546 100644 --- a/desktop/src/io/anuke/mindustry/desktop/steam/SStats.java +++ b/desktop/src/io/anuke/mindustry/desktop/steam/SStats.java @@ -195,17 +195,15 @@ public class SStats implements SteamUserStatsCallback{ }); Events.on(LaunchEvent.class, e -> { - int total = 0; - for(Item item : Vars.content.items()){ - total += Vars.state.stats.itemsDelivered.get(item, 0); - } - if(state.rules.tutorial){ completeTutorial.complete(); } SStat.timesLaunched.add(); - SStat.itemsLaunched.add(total); + }); + + Events.on(LaunchItemEvent.class, e -> { + SStat.itemsLaunched.add(e.stack.amount); }); Events.on(WaveEvent.class, e -> { diff --git a/desktop/src/io/anuke/mindustry/desktop/steam/SWorkshop.java b/desktop/src/io/anuke/mindustry/desktop/steam/SWorkshop.java index 170e014a18..8f12e22ca9 100644 --- a/desktop/src/io/anuke/mindustry/desktop/steam/SWorkshop.java +++ b/desktop/src/io/anuke/mindustry/desktop/steam/SWorkshop.java @@ -39,7 +39,7 @@ public class SWorkshop implements SteamUGCCallback{ workshopFiles.put(Map.class, folders.select(f -> f.list().length == 1 && f.list()[0].extension().equals(mapExtension)).map(f -> f.list()[0])); workshopFiles.put(Schematic.class, folders.select(f -> f.list().length == 1 && f.list()[0].extension().equals(schematicExtension)).map(f -> f.list()[0])); - workshopFiles.put(LoadedMod.class, folders.select(f -> f.child("mod.json").exists())); + workshopFiles.put(LoadedMod.class, folders.select(f -> f.child("mod.json").exists() || f.child("mod.hjson").exists())); if(!workshopFiles.get(Map.class).isEmpty()){ SAchievement.downloadMapWorkshop.complete(); diff --git a/fastlane/metadata/android/en-US/changelogs/100.1.txt b/fastlane/metadata/android/en-US/changelogs/100.1.txt new file mode 100644 index 0000000000..53c981258b --- /dev/null +++ b/fastlane/metadata/android/en-US/changelogs/100.1.txt @@ -0,0 +1,5 @@ +- Added fallback mod loading for poorly formatted old mods +- Fixed infinite building range +- Fixed impact reactors being able to blow up core on servers +- Fixed liquid bridges passing backwards +- Updated various translations diff --git a/fastlane/metadata/android/en-US/changelogs/100.txt b/fastlane/metadata/android/en-US/changelogs/100.txt new file mode 100644 index 0000000000..362a138fae --- /dev/null +++ b/fastlane/metadata/android/en-US/changelogs/100.txt @@ -0,0 +1,9 @@ +- Added experimental lighting system - can be enabled in custom game rules +- Added power diode block (Contributed by Quezler) +- Added plated conduit block (Contributed by Quezler) +- Added light block for dark maps only +- Improved pulse conduit speed (Contributed by Quezler) +- Improved building priority +- New permissive mod parsing format (HJSON) +- Fixed a few incorrect consumption displays in blocks +- Fixed 'underwater' ores in editor diff --git a/fastlane/metadata/android/en-US/changelogs/29547.txt b/fastlane/metadata/android/en-US/changelogs/29547.txt new file mode 100644 index 0000000000..362a138fae --- /dev/null +++ b/fastlane/metadata/android/en-US/changelogs/29547.txt @@ -0,0 +1,9 @@ +- Added experimental lighting system - can be enabled in custom game rules +- Added power diode block (Contributed by Quezler) +- Added plated conduit block (Contributed by Quezler) +- Added light block for dark maps only +- Improved pulse conduit speed (Contributed by Quezler) +- Improved building priority +- New permissive mod parsing format (HJSON) +- Fixed a few incorrect consumption displays in blocks +- Fixed 'underwater' ores in editor diff --git a/fastlane/metadata/android/en-US/changelogs/29550.txt b/fastlane/metadata/android/en-US/changelogs/29550.txt new file mode 100644 index 0000000000..53c981258b --- /dev/null +++ b/fastlane/metadata/android/en-US/changelogs/29550.txt @@ -0,0 +1,5 @@ +- Added fallback mod loading for poorly formatted old mods +- Fixed infinite building range +- Fixed impact reactors being able to blow up core on servers +- Fixed liquid bridges passing backwards +- Updated various translations diff --git a/fastlane/metadata/android/pl/changelogs/100.1.txt b/fastlane/metadata/android/pl/changelogs/100.1.txt new file mode 100644 index 0000000000..aab1b41ea0 --- /dev/null +++ b/fastlane/metadata/android/pl/changelogs/100.1.txt @@ -0,0 +1,6 @@ +- Dodano awaryjne wczytywani modów dla źle przygotowanych modów na starsze wersje +- Naprawiono nieskończony zasięg budowy +- Naprawiono reaktor uderzeniowy mogący zniszczyć rdzeń na serwerze +- Naprawiono most płynów działąjący wstecz +- Updated various translations +- Zaktualizowano tłumaczenia diff --git a/fastlane/metadata/android/pl/changelogs/100.txt b/fastlane/metadata/android/pl/changelogs/100.txt new file mode 100644 index 0000000000..1a8f4fd6a5 --- /dev/null +++ b/fastlane/metadata/android/pl/changelogs/100.txt @@ -0,0 +1,10 @@ +- Dodano eksperymentalny system oświetlenia - może być aktywowany w menu własnych zasad gry +- Added power diode block (Contributed by Quezler) +- Dodano blok diody (Dodane dzięki Quezler) +- Dodano opancerzoną rurę (Dodane dzięki Quezler) +- Dodano bloki światła tylko dla ciemnych map +- Polepszono prędkość rury pulsacyjnej (Dodano dzięki Quezler) +- Polepszono piorytet budowy +- Nowy format parsowania modów (HJSON) +- Naprawiono wyświetlanie niepoprawnych wartości zużycia bloku +- Naprawiono 'underwater' w edytorze diff --git a/fastlane/metadata/android/pl/full_description.txt b/fastlane/metadata/android/pl/full_description.txt new file mode 100644 index 0000000000..1fe15307d9 --- /dev/null +++ b/fastlane/metadata/android/pl/full_description.txt @@ -0,0 +1,15 @@ +Twórz skomplikowane linie transportowe przy użyciu przenośników by zaopatrzyć wieżyczki w amunicję, produkować materiały używane do budowy, oraz broń swoje struktury przed falami wrogów. Graj ze swoimi przyjaciółmi w międzyplatformowych rozgrywkach wieloosobwych typu co-op, lub rzuć im wyzwanie w drużynowych rozgrywkach PvP. + +W grze znajdziesz: +- 24 podstawowe mapy +- Kampanię z drzewkiem rozwoju technologii i terenami do odblokowania +- 4 potężne fale bossów +- System zarządzania elektrycznoścą, transportem cieczy i przedmiotów +- 19 unikatowych typów dronów, mechów i statków +- 120+ bloków do użycia podczas gry +- 75+ różnorodnych bloków terenu +- Graj ze znajomymi przez sieć lokalną lub na serwerze dedykowanym +- Zmieniaj zasady gry: Modyfikuj kosz budowy bloków, statystyki przeciwników, przedmioty na start, czas trwania tury i więcej +- Stwórz własną mapę przy użyciu wbudowanego edytora i popisz się kreatywnością z innymi +- Sam zdecyduj skąd nadejdzie następny atak + diff --git a/fastlane/metadata/android/pl/short_description.txt b/fastlane/metadata/android/pl/short_description.txt new file mode 100644 index 0000000000..6628c453f0 --- /dev/null +++ b/fastlane/metadata/android/pl/short_description.txt @@ -0,0 +1 @@ +Bazująca na przetrwaniu i zarządzaniu fabryką sandboxowa gra typu obrony wieży. \ No newline at end of file diff --git a/fastlane/metadata/android/pl/summary.txt b/fastlane/metadata/android/pl/summary.txt new file mode 100644 index 0000000000..6628c453f0 --- /dev/null +++ b/fastlane/metadata/android/pl/summary.txt @@ -0,0 +1 @@ +Bazująca na przetrwaniu i zarządzaniu fabryką sandboxowa gra typu obrony wieży. \ No newline at end of file diff --git a/fastlane/metadata/android/pl/title.txt b/fastlane/metadata/android/pl/title.txt new file mode 100644 index 0000000000..2beb939017 --- /dev/null +++ b/fastlane/metadata/android/pl/title.txt @@ -0,0 +1 @@ +Mindustry \ No newline at end of file diff --git a/fastlane/metadata/android/uk/changelogs/100.txt b/fastlane/metadata/android/uk/changelogs/100.txt new file mode 100644 index 0000000000..3e7cafd4f6 --- /dev/null +++ b/fastlane/metadata/android/uk/changelogs/100.txt @@ -0,0 +1,9 @@ +- Додана експериментальна система освітлення. Можна увімкнути у користувацьких правилах гри. +- Додано блок діоду (Сприяв Quezler). +- Додано зміцнений трубопровід (Сприяв Quezler). +- Додано блок освітлювача. Є тільки на темних мапах. +- Підвищена швидкість трубопровода (Сприяв Quezler). +- Поліпшено пріоритет спорудження. +- Новий дозвільний формат для модифікацій (HJSON). +- Виправлено кілька неправильних відображень споживання в блоках. +- Виправлені «підводні» руди в редакторі мап. diff --git a/fastlane/metadata/android/uk/changelogs/29547.txt b/fastlane/metadata/android/uk/changelogs/29547.txt new file mode 100644 index 0000000000..3e7cafd4f6 --- /dev/null +++ b/fastlane/metadata/android/uk/changelogs/29547.txt @@ -0,0 +1,9 @@ +- Додана експериментальна система освітлення. Можна увімкнути у користувацьких правилах гри. +- Додано блок діоду (Сприяв Quezler). +- Додано зміцнений трубопровід (Сприяв Quezler). +- Додано блок освітлювача. Є тільки на темних мапах. +- Підвищена швидкість трубопровода (Сприяв Quezler). +- Поліпшено пріоритет спорудження. +- Новий дозвільний формат для модифікацій (HJSON). +- Виправлено кілька неправильних відображень споживання в блоках. +- Виправлені «підводні» руди в редакторі мап. diff --git a/gradle.properties b/gradle.properties index 6b36115f05..212385a749 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,3 +1,3 @@ org.gradle.daemon=true org.gradle.jvmargs=-Xms256m -Xmx1024m -archash=d2bb4a004b8653a8d878abda0b1e1c62b2df2aab +archash=190918590e8401b1686ecb9167e3c2a9e77eafaa diff --git a/ios/Info.plist.xml b/ios/Info.plist.xml index 0ab706af32..b93d1da2a7 100644 --- a/ios/Info.plist.xml +++ b/ios/Info.plist.xml @@ -74,6 +74,23 @@ + + CFBundleTypeIconFiles + + icon-72.png + + CFBundleTypeName + Mindustry Schematic File + CFBundleTypeRole + Editor + LSHandlerRank + Owner + LSItemContentTypes + + io.anuke.mindustry.schematicfile + + + CFBundleTypeIconFiles @@ -111,6 +128,24 @@ mindustry/msav + + + UTTypeConformsTo + + public.data + + UTTypeDescription + Mindustry Schematic File + UTTypeIdentifier + io.anuke.mindustry.schematicfile + UTTypeTagSpecification + + public.filename-extension + msch + public.mime-type + mindustry/msch + + diff --git a/ios/build.gradle b/ios/build.gradle index 94e198be83..0f5e0ec6b3 100644 --- a/ios/build.gradle +++ b/ios/build.gradle @@ -41,9 +41,6 @@ task deploy{ dependsOn createIPA } - -build.dependsOn copyAssets - launchIPhoneSimulator.dependsOn build launchIPadSimulator.dependsOn build launchIOSDevice.dependsOn build diff --git a/ios/src/io/anuke/mindustry/IOSLauncher.java b/ios/src/io/anuke/mindustry/IOSLauncher.java index 1a46baf921..7f4783d1a8 100644 --- a/ios/src/io/anuke/mindustry/IOSLauncher.java +++ b/ios/src/io/anuke/mindustry/IOSLauncher.java @@ -12,6 +12,7 @@ import io.anuke.mindustry.game.Saves.*; import io.anuke.mindustry.io.*; import io.anuke.mindustry.mod.*; import io.anuke.mindustry.ui.*; +import org.robovm.apple.coregraphics.*; import org.robovm.apple.foundation.*; import org.robovm.apple.uikit.*; import org.robovm.objc.block.*; @@ -124,7 +125,17 @@ public class IOSLauncher extends IOSApplication.Delegate{ NSURL url = new NSURL(to.file()); UIActivityViewController p = new UIActivityViewController(Collections.singletonList(url), null); - UIApplication.getSharedApplication().getKeyWindow().getRootViewController().presentViewController(p, true, () -> Log.info("Success! Presented {0}", to)); + UIViewController rootVc = UIApplication.getSharedApplication().getKeyWindow().getRootViewController(); + if(UIDevice.getCurrentDevice().getUserInterfaceIdiom() == UIUserInterfaceIdiom.Pad){ + // Set up the pop-over for iPad + UIPopoverPresentationController pop = p.getPopoverPresentationController(); + UIView mainView = rootVc.getView(); + pop.setSourceView(mainView); + CGRect targetRect = new CGRect(mainView.getBounds().getMidX(), mainView.getBounds().getMidY(), 0, 0); + pop.setSourceRect(targetRect); + pop.setPermittedArrowDirections(UIPopoverArrowDirection.None); + } + rootVc.presentViewController(p, true, () -> Log.info("Success! Presented {0}", to)); }catch(Throwable t){ ui.showException(t); } diff --git a/server/build.gradle b/server/build.gradle index 26fe08a653..09299943fa 100644 --- a/server/build.gradle +++ b/server/build.gradle @@ -19,6 +19,9 @@ task run(dependsOn: classes, type: JavaExec){ if(project.hasProperty("appArgs")){ args Eval.me(appArgs) } + if(project.hasProperty("jvmArgs")){ + jvmArgs((List)Eval.me(project.getProperties()["jvmArgs"])) + } } task debug(dependsOn: classes, type: JavaExec){ @@ -43,6 +46,9 @@ task dist(type: Jar){ exclude("com/badlogic/gdx/**") exclude("icons/**") exclude("bundles/**") + if(!versionModifier.contains("steam")){ + exclude("**.dll", "**.so", "**.dylib") + } manifest{ attributes 'Main-Class': project.mainClassName diff --git a/server/src/io/anuke/mindustry/server/MindustryServer.java b/server/src/io/anuke/mindustry/server/MindustryServer.java deleted file mode 100644 index ad83a69eb7..0000000000 --- a/server/src/io/anuke/mindustry/server/MindustryServer.java +++ /dev/null @@ -1,47 +0,0 @@ -package io.anuke.mindustry.server; - -import io.anuke.arc.*; -import io.anuke.arc.files.*; -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.*; - -public class MindustryServer implements ApplicationListener{ - private String[] args; - - public MindustryServer(String[] args){ - this.args = args; - } - - @Override - public void init(){ - Core.settings.setDataDirectory(Core.files.local("config")); - loadLocales = false; - headless = true; - - FileHandle plugins = Core.settings.getDataDirectory().child("plugins"); - if(plugins.isDirectory() && plugins.list().length > 0 && !plugins.sibling("mods").exists()){ - Log.warn("[IMPORTANT NOTICE] &lrPlugins have been detected.&ly Automatically moving all contents of the plugin folder into the 'mods' folder. The original folder will not be removed; please do so manually."); - plugins.sibling("mods").mkdirs(); - for(FileHandle file : plugins.list()){ - file.copyTo(plugins.sibling("mods")); - } - } - - Vars.loadSettings(); - Vars.init(); - content.createContent(); - content.init(); - - 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 570d3a8414..fc99ad0382 100644 --- a/server/src/io/anuke/mindustry/server/ServerControl.java +++ b/server/src/io/anuke/mindustry/server/ServerControl.java @@ -39,10 +39,12 @@ import static io.anuke.mindustry.Vars.*; public class ServerControl implements ApplicationListener{ private static final int roundExtraTime = 12; - //in bytes: 512 kb is max private static final int maxLogLength = 1024 * 512; private static final int commandSocketPort = 6859; + protected static String[] tags = {"&lc&fb[D]", "&lg&fb[I]", "&ly&fb[W]", "&lr&fb[E]", ""}; + protected static DateTimeFormatter dateTime = DateTimeFormatter.ofPattern("MM-dd-yyyy | HH:mm:ss"); + private final CommandHandler handler = new CommandHandler(""); private final FileHandle logFolder = Core.settings.getDataDirectory().child("logs/"); @@ -60,7 +62,7 @@ public class ServerControl implements ApplicationListener{ "shufflemode", "normal", "bans", "", "admins", "", - "shufflemode", "all", + "shufflemode", "custom", "crashreport", false, "port", port, "logging", true, @@ -68,44 +70,19 @@ public class ServerControl implements ApplicationListener{ "globalrules", "{reactorExplosions: false}" ); - Log.setLogger(new LogHandler(){ - DateTimeFormatter dateTime = DateTimeFormatter.ofPattern("MM-dd-yyyy | HH:mm:ss"); + Log.setLogger((level, text, args1) -> { + String result = "[" + dateTime.format(LocalDateTime.now()) + "] " + format(tags[level.ordinal()] + " " + text + "&fr", args1); + System.out.println(result); - @Override - public void debug(String text, Object... args){ - print("&lc&fb" + "[DEBG] " + text, args); + if(Core.settings.getBool("logging")){ + logToFile("[" + dateTime.format(LocalDateTime.now()) + "] " + format(tags[level.ordinal()] + " " + text + "&fr", false, args1)); } - @Override - public void info(String text, Object... args){ - print("&lg&fb" + "[INFO] " + text, args); - } - - @Override - public void err(String text, Object... args){ - print("&lr&fb" + "[ERR!] " + text, args); - } - - @Override - public void warn(String text, Object... args){ - print("&ly&fb" + "[WARN] " + text, args); - } - - @Override - public void print(String text, Object... args){ - String result = "[" + dateTime.format(LocalDateTime.now()) + "] " + format(text + "&fr", args); - System.out.println(result); - - if(Core.settings.getBool("logging")){ - logToFile("[" + dateTime.format(LocalDateTime.now()) + "] " + format(text + "&fr", false, args)); - } - - if(socketOutput != null){ - try{ - socketOutput.println(format(text + "&fr", false, args).replace("[DEBG] ", "").replace("[WARN] ", "").replace("[INFO] ", "").replace("[ERR!] ", "")); - }catch(Throwable e){ - err("Error occurred logging to socket: {0}", e.getClass().getSimpleName()); - } + if(socketOutput != null){ + try{ + socketOutput.println(format(text + "&fr", false, args1)); + }catch(Throwable e){ + err("Error occurred logging to socket: {0}", e.getClass().getSimpleName()); } } }); @@ -336,7 +313,7 @@ public class ServerControl implements ApplicationListener{ if(!mods.all().isEmpty()){ info("Mods:"); for(LoadedMod mod : mods.all()){ - info(" &ly{0} &lcv{1}", mod.meta.name, mod.meta.version); + info(" &ly{0} &lcv{1}", mod.meta.displayName(), mod.meta.version); } }else{ info("No mods found."); @@ -347,7 +324,8 @@ public class ServerControl implements ApplicationListener{ 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("Name: &ly{0}", mod.meta.displayName()); + info("Internal Name: &ly{0}", mod.name); info("Version: &ly{0}", mod.meta.version); info("Author: &ly{0}", mod.meta.author); info("Path: &ly{0}", mod.file.path()); @@ -357,6 +335,10 @@ public class ServerControl implements ApplicationListener{ } }); + handler.register("js", "", "Run arbitrary Javascript.", arg -> { + info("&lc" + mods.getScripts().runConsole(arg[0])); + }); + handler.register("say", "", "Send a message to all players.", arg -> { if(!state.is(State.playing)){ err("Not hosting. Host a game first."); @@ -527,6 +509,16 @@ public class ServerControl implements ApplicationListener{ info("Player &ly'{0}'&lg has been un-whitelisted.", info.lastName); }); + handler.register("sync", "[on/off...]", "Enable/disable block sync. Experimental.", arg -> { + if(arg.length == 0){ + info("Block sync is currently &lc{0}.", Core.settings.getBool("blocksync") ? "enabled" : "disabled"); + return; + } + boolean on = arg[0].equalsIgnoreCase("on"); + Core.settings.putSave("blocksync", on); + info("Block syncing is now &lc{0}.", on ? "on" : "off"); + }); + handler.register("crashreport", "", "Disables or enables automatic crash reporting", arg -> { boolean value = arg[0].equalsIgnoreCase("on"); Core.settings.put("crashreport", value); diff --git a/server/src/io/anuke/mindustry/server/ServerLauncher.java b/server/src/io/anuke/mindustry/server/ServerLauncher.java index fcf6a52077..bd584ab4d1 100644 --- a/server/src/io/anuke/mindustry/server/ServerLauncher.java +++ b/server/src/io/anuke/mindustry/server/ServerLauncher.java @@ -1,22 +1,70 @@ package io.anuke.mindustry.server; +import io.anuke.arc.*; import io.anuke.arc.backends.headless.*; +import io.anuke.arc.files.*; +import io.anuke.arc.util.*; import io.anuke.mindustry.*; import io.anuke.mindustry.core.*; +import io.anuke.mindustry.game.EventType.*; +import io.anuke.mindustry.mod.*; +import io.anuke.mindustry.net.Net; import io.anuke.mindustry.net.*; -import static io.anuke.mindustry.Vars.platform; +import java.time.*; -public class ServerLauncher{ +import static io.anuke.arc.util.Log.format; +import static io.anuke.mindustry.Vars.*; +import static io.anuke.mindustry.server.ServerControl.*; + +public class ServerLauncher implements ApplicationListener{ + static String[] args; public static void main(String[] args){ try{ + ServerLauncher.args = args; Vars.platform = new Platform(){}; Vars.net = new Net(platform.getNet()); - new HeadlessApplication(new MindustryServer(args), null, throwable -> CrashSender.send(throwable, f -> {})); + + Log.setLogger((level, text, args1) -> { + String result = "[" + dateTime.format(LocalDateTime.now()) + "] " + format(tags[level.ordinal()] + " " + text + "&fr", args1); + System.out.println(result); + }); + new HeadlessApplication(new ServerLauncher(), null, throwable -> CrashSender.send(throwable, f -> {})); }catch(Throwable t){ CrashSender.send(t, f -> {}); } } + + @Override + public void init(){ + Core.settings.setDataDirectory(Core.files.local("config")); + loadLocales = false; + headless = true; + + FileHandle plugins = Core.settings.getDataDirectory().child("plugins"); + if(plugins.isDirectory() && plugins.list().length > 0 && !plugins.sibling("mods").exists()){ + Log.warn("[IMPORTANT NOTICE] &lrPlugins have been detected.&ly Automatically moving all contents of the plugin folder into the 'mods' folder. The original folder will not be removed; please do so manually."); + plugins.sibling("mods").mkdirs(); + for(FileHandle file : plugins.list()){ + file.copyTo(plugins.sibling("mods")); + } + } + + Vars.loadSettings(); + Vars.init(); + content.createBaseContent(); + mods.loadScripts(); + content.createModContent(); + content.init(); + + Core.app.addListener(logic = new Logic()); + Core.app.addListener(netServer = new NetServer()); + Core.app.addListener(new ServerControl(args)); + + mods.each(Mod::init); + + Events.fire(new ServerLoadEvent()); + } } \ No newline at end of file diff --git a/servers.json b/servers.json new file mode 100644 index 0000000000..0637a088a0 --- /dev/null +++ b/servers.json @@ -0,0 +1 @@ +[] \ No newline at end of file diff --git a/tests/src/test/java/ApplicationTests.java b/tests/src/test/java/ApplicationTests.java index a9ed831fbc..12409c364f 100644 --- a/tests/src/test/java/ApplicationTests.java +++ b/tests/src/test/java/ApplicationTests.java @@ -47,7 +47,7 @@ public class ApplicationTests{ net = new Net(null); tree = new FileTree(); Vars.init(); - content.createContent(); + content.createBaseContent(); add(logic = new Logic()); add(netServer = new NetServer()); @@ -289,8 +289,8 @@ public class ApplicationTests{ void buildingOverlap(){ initBuilding(); - Phantom d1 = (Phantom)UnitTypes.phantom.create(Team.sharded); - Phantom d2 = (Phantom)UnitTypes.phantom.create(Team.sharded); + BuilderDrone d1 = (BuilderDrone)UnitTypes.phantom.create(Team.sharded); + BuilderDrone d2 = (BuilderDrone)UnitTypes.phantom.create(Team.sharded); d1.set(10f, 20f); d2.set(10f, 20f); @@ -311,8 +311,8 @@ public class ApplicationTests{ void buildingDestruction(){ initBuilding(); - Phantom d1 = (Phantom)UnitTypes.phantom.create(Team.sharded); - Phantom d2 = (Phantom)UnitTypes.phantom.create(Team.sharded); + BuilderDrone d1 = (BuilderDrone)UnitTypes.phantom.create(Team.sharded); + BuilderDrone d2 = (BuilderDrone)UnitTypes.phantom.create(Team.sharded); d1.set(10f, 20f); d2.set(10f, 20f); diff --git a/tests/src/test/java/power/DirectConsumerTests.java b/tests/src/test/java/power/DirectConsumerTests.java index 89ed331c8b..0892b13d88 100644 --- a/tests/src/test/java/power/DirectConsumerTests.java +++ b/tests/src/test/java/power/DirectConsumerTests.java @@ -41,7 +41,7 @@ public class DirectConsumerTests extends PowerTestFixture{ consumerTile.entity.items.add(Items.lead, leadAmount); Tile producerTile = createFakeTile(2, 0, createFakeProducerBlock(producedPower)); - producerTile.entity().productionEfficiency = 1f; + producerTile.ent().productionEfficiency = 1f; PowerGraph graph = new PowerGraph(); graph.add(producerTile); diff --git a/tests/src/test/java/power/ItemLiquidGeneratorTests.java b/tests/src/test/java/power/ItemLiquidGeneratorTests.java index e6bc2a20de..5e5a2ed034 100644 --- a/tests/src/test/java/power/ItemLiquidGeneratorTests.java +++ b/tests/src/test/java/power/ItemLiquidGeneratorTests.java @@ -52,7 +52,7 @@ public class ItemLiquidGeneratorTests extends PowerTestFixture{ }; tile = createFakeTile(0, 0, generator); - entity = tile.entity(); + entity = tile.ent(); } /** Tests the consumption and efficiency when being supplied with liquids. */ diff --git a/tests/src/test/java/power/PowerTestFixture.java b/tests/src/test/java/power/PowerTestFixture.java index 75f4a56854..e3a2fea469 100644 --- a/tests/src/test/java/power/PowerTestFixture.java +++ b/tests/src/test/java/power/PowerTestFixture.java @@ -33,7 +33,7 @@ public class PowerTestFixture{ } }; - content.createContent(); + content.createBaseContent(); 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 6b253e4f29..b3353cfc2c 100644 --- a/tests/src/test/java/power/PowerTests.java +++ b/tests/src/test/java/power/PowerTests.java @@ -51,7 +51,7 @@ public class PowerTests extends PowerTestFixture{ void simulateDirectConsumption(float producedPower, float requiredPower, float expectedSatisfaction, String parameterDescription){ Tile producerTile = createFakeTile(0, 0, createFakeProducerBlock(producedPower)); - producerTile.entity().productionEfficiency = 1f; + producerTile.ent().productionEfficiency = 1f; Tile directConsumerTile = createFakeTile(0, 1, createFakeDirectConsumer(requiredPower)); PowerGraph powerGraph = new PowerGraph(); @@ -91,7 +91,7 @@ public class PowerTests extends PowerTestFixture{ if(producedPower > 0.0f){ Tile producerTile = createFakeTile(0, 0, createFakeProducerBlock(producedPower)); - producerTile.entity().productionEfficiency = 1f; + producerTile.ent().productionEfficiency = 1f; powerGraph.add(producerTile); } Tile directConsumerTile = null; @@ -116,7 +116,7 @@ public class PowerTests extends PowerTestFixture{ @Test void directConsumptionStopsWithNoPower(){ Tile producerTile = createFakeTile(0, 0, createFakeProducerBlock(10.0f)); - producerTile.entity().productionEfficiency = 1.0f; + producerTile.ent().productionEfficiency = 1.0f; Tile consumerTile = createFakeTile(0, 1, createFakeDirectConsumer(5.0f)); PowerGraph powerGraph = new PowerGraph(); @@ -133,7 +133,7 @@ public class PowerTests extends PowerTestFixture{ assertEquals(0.0f, consumerTile.entity.power.status, Mathf.FLOAT_ROUNDING_ERROR); if(consumerTile.block().consumes.hasPower()){ ConsumePower consumePower = consumerTile.block().consumes.getPower(); - assertFalse(consumePower.valid(consumerTile.entity())); + assertFalse(consumePower.valid(consumerTile.ent())); } } } diff --git a/tools/build.gradle b/tools/build.gradle index dff7745f5d..6a2825747a 100644 --- a/tools/build.gradle +++ b/tools/build.gradle @@ -297,7 +297,7 @@ task pack(dependsOn: classes){ //run generation task; generate all needed sprites file(genFolder).mkdirs() javaexec{ - main = "io.anuke.mindustry.ImagePacker" + main = "io.anuke.mindustry.tools.ImagePacker" classpath = sourceSets.main.runtimeClasspath standardInput = System.in workingDir = genFolder @@ -310,7 +310,7 @@ task pack(dependsOn: classes){ } jvmArgs("-Djava.awt.headless=true") - main = "io.anuke.mindustry.Upscaler" + main = "io.anuke.mindustry.tools.Upscaler" classpath = sourceSets.main.runtimeClasspath standardInput = System.in workingDir = "../core/assets-raw/sprites_out/ui/icons" @@ -351,7 +351,7 @@ task pack(dependsOn: classes){ task genSprites(dependsOn: classes, type: JavaExec){ finalizedBy 'antialiasGen' - main = "io.anuke.mindustry.ImagePacker" + main = "io.anuke.mindustry.tools.ImagePacker" classpath = sourceSets.main.runtimeClasspath jvmArgs("-Djava.awt.headless=true") standardInput = System.in @@ -361,7 +361,7 @@ task genSprites(dependsOn: classes, type: JavaExec){ task updateBundles(dependsOn: classes, type: JavaExec){ file(genFolder).mkdirs() - main = "io.anuke.mindustry.BundleLauncher" + main = "io.anuke.mindustry.tools.BundleLauncher" classpath = sourceSets.main.runtimeClasspath standardInput = System.in workingDir = "../core/assets/bundles/" diff --git a/tools/src/io/anuke/mindustry/BundleLauncher.java b/tools/src/io/anuke/mindustry/tools/BundleLauncher.java similarity index 98% rename from tools/src/io/anuke/mindustry/BundleLauncher.java rename to tools/src/io/anuke/mindustry/tools/BundleLauncher.java index 3888f641da..7d99eadac2 100644 --- a/tools/src/io/anuke/mindustry/BundleLauncher.java +++ b/tools/src/io/anuke/mindustry/tools/BundleLauncher.java @@ -1,4 +1,4 @@ -package io.anuke.mindustry; +package io.anuke.mindustry.tools; import io.anuke.arc.collection.Array; import io.anuke.arc.collection.OrderedMap; diff --git a/tools/src/io/anuke/mindustry/Generators.java b/tools/src/io/anuke/mindustry/tools/Generators.java similarity index 99% rename from tools/src/io/anuke/mindustry/Generators.java rename to tools/src/io/anuke/mindustry/tools/Generators.java index 718f994376..91887f0383 100644 --- a/tools/src/io/anuke/mindustry/Generators.java +++ b/tools/src/io/anuke/mindustry/tools/Generators.java @@ -1,4 +1,4 @@ -package io.anuke.mindustry; +package io.anuke.mindustry.tools; import io.anuke.arc.collection.*; import io.anuke.arc.graphics.*; @@ -6,7 +6,7 @@ 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.tools.ImagePacker.*; import io.anuke.mindustry.ctype.*; import io.anuke.mindustry.type.*; import io.anuke.mindustry.ui.*; diff --git a/tools/src/io/anuke/mindustry/Image.java b/tools/src/io/anuke/mindustry/tools/Image.java similarity index 97% rename from tools/src/io/anuke/mindustry/Image.java rename to tools/src/io/anuke/mindustry/tools/Image.java index 30e06b8170..f7c987762b 100644 --- a/tools/src/io/anuke/mindustry/Image.java +++ b/tools/src/io/anuke/mindustry/tools/Image.java @@ -1,9 +1,9 @@ -package io.anuke.mindustry; +package io.anuke.mindustry.tools; import io.anuke.arc.graphics.Color; import io.anuke.arc.graphics.g2d.TextureRegion; import io.anuke.arc.util.Structs; -import io.anuke.mindustry.ImagePacker.GenRegion; +import io.anuke.mindustry.tools.ImagePacker.GenRegion; import javax.imageio.ImageIO; import java.awt.*; diff --git a/tools/src/io/anuke/mindustry/ImagePacker.java b/tools/src/io/anuke/mindustry/tools/ImagePacker.java similarity index 95% rename from tools/src/io/anuke/mindustry/ImagePacker.java rename to tools/src/io/anuke/mindustry/tools/ImagePacker.java index 200da5c602..b5a3787382 100644 --- a/tools/src/io/anuke/mindustry/ImagePacker.java +++ b/tools/src/io/anuke/mindustry/tools/ImagePacker.java @@ -1,12 +1,12 @@ -package io.anuke.mindustry; +package io.anuke.mindustry.tools; import io.anuke.arc.Core; import io.anuke.arc.collection.ObjectMap; import io.anuke.arc.graphics.g2d.*; import io.anuke.arc.graphics.g2d.TextureAtlas.AtlasRegion; import io.anuke.arc.util.*; -import io.anuke.arc.util.Log.LogHandler; -import io.anuke.arc.util.Log.NoopLogHandler; +import io.anuke.arc.util.Log.*; +import io.anuke.mindustry.*; import io.anuke.mindustry.core.ContentLoader; import javax.imageio.ImageIO; @@ -23,8 +23,8 @@ public class ImagePacker{ Log.setLogger(new NoopLogHandler()); Vars.content = new ContentLoader(); - Vars.content.createContent(); - Log.setLogger(new LogHandler()); + Vars.content.createBaseContent(); + Log.setLogger(new DefaultLogHandler()); Files.walk(Paths.get("../../../assets-raw/sprites_out")).forEach(path -> { try{ diff --git a/tools/src/io/anuke/mindustry/tools/ScriptStubGenerator.java b/tools/src/io/anuke/mindustry/tools/ScriptStubGenerator.java new file mode 100644 index 0000000000..ac29c6adb4 --- /dev/null +++ b/tools/src/io/anuke/mindustry/tools/ScriptStubGenerator.java @@ -0,0 +1,79 @@ +package io.anuke.mindustry.tools; + +import io.anuke.arc.*; +import io.anuke.arc.collection.Array; +import io.anuke.arc.collection.*; +import io.anuke.arc.files.*; +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.util.*; +import io.anuke.mindustry.gen.*; +import org.reflections.*; +import org.reflections.scanners.*; +import org.reflections.util.*; + +import java.io.*; +import java.lang.reflect.*; +import java.util.*; + +public class ScriptStubGenerator{ + + public static void main(String[] args){ + String base = "io.anuke.mindustry"; + Array blacklist = Array.with("plugin", "mod", "net", "io", "tools"); + Array nameBlacklist = Array.with("ClientLauncher", "NetClient", "NetServer", "ClassAccess"); + Array> whitelist = Array.with(Draw.class, Fill.class, Lines.class, Core.class, TextureAtlas.class, TextureRegion.class, Time.class, System.class, PrintStream.class, + AtlasRegion.class, String.class, Mathf.class, Angles.class, Color.class, Runnable.class, Object.class, Icon.class, Tex.class, Sounds.class, Musics.class, Call.class); + Array nopackage = Array.with("java.lang", "java"); + + String fileTemplate = "package io.anuke.mindustry.mod;\n" + + "\n" + + "import io.anuke.arc.collection.*;\n" + + "//obviously autogenerated, do not touch\n" + + "public class ClassAccess{\n" + + //"\tstatic final Array> allowedClasses = Array.with($ALLOWED_CLASSES$);\n" + + "\tpublic static final ObjectSet allowedClassNames = ObjectSet.with($ALLOWED_CLASS_NAMES$);\n" + + "}"; + + List classLoadersList = new LinkedList<>(); + classLoadersList.add(ClasspathHelper.contextClassLoader()); + classLoadersList.add(ClasspathHelper.staticClassLoader()); + + Reflections reflections = new Reflections(new ConfigurationBuilder() + .setScanners(new SubTypesScanner(false), new ResourcesScanner()) + .setUrls(ClasspathHelper.forClassLoader(classLoadersList.toArray(new ClassLoader[0]))) + .filterInputsBy(new FilterBuilder() + .include(FilterBuilder.prefix("io.anuke.mindustry")) + .include(FilterBuilder.prefix("io.anuke.arc.func")) + .include(FilterBuilder.prefix("io.anuke.arc.collection")) + .include(FilterBuilder.prefix("io.anuke.arc.scene")) + )); + + Array> classes = Array.with(reflections.getSubTypesOf(Object.class)); + classes.addAll(reflections.getSubTypesOf(Enum.class)); + classes.addAll(whitelist); + classes.sort(Structs.comparing(Class::getName)); + + classes.removeAll(type -> type.isSynthetic() || type.isAnonymousClass() || type.getCanonicalName() == null || Modifier.isPrivate(type.getModifiers()) + || blacklist.contains(s -> type.getName().startsWith(base + "." + s + ".")) || nameBlacklist.contains(type.getSimpleName())); + classes.distinct(); + ObjectSet used = ObjectSet.with(); + + StringBuilder result = new StringBuilder("//Generated class. Do not modify.\n"); + result.append("\n").append(new FileHandle("core/assets/scripts/base.js").readString()).append("\n"); + for(Class type : classes){ + if(used.contains(type.getPackage().getName()) || nopackage.contains(s -> type.getName().startsWith(s))) continue; + result.append("importPackage(Packages.").append(type.getPackage().getName()).append(")\n"); + used.add(type.getPackage().getName()); + } + + //Log.info(result); + + new FileHandle("core/assets/scripts/global.js").writeString(result.toString()); + new FileHandle("core/src/io/anuke/mindustry/mod/ClassAccess.java").writeString(fileTemplate + .replace("$ALLOWED_CLASSES$", classes.toString(", ", type -> type.getName() + ".class")) + .replace("$ALLOWED_CLASS_NAMES$", classes.toString(", ", type -> "\"" + type.getName() + "\""))); + } +} diff --git a/tools/src/io/anuke/mindustry/SquareMarcher.java b/tools/src/io/anuke/mindustry/tools/SquareMarcher.java similarity index 99% rename from tools/src/io/anuke/mindustry/SquareMarcher.java rename to tools/src/io/anuke/mindustry/tools/SquareMarcher.java index 278f9543aa..c795637e25 100644 --- a/tools/src/io/anuke/mindustry/SquareMarcher.java +++ b/tools/src/io/anuke/mindustry/tools/SquareMarcher.java @@ -1,4 +1,4 @@ -package io.anuke.mindustry; +package io.anuke.mindustry.tools; import io.anuke.arc.Core; import io.anuke.arc.files.FileHandle; diff --git a/tools/src/io/anuke/mindustry/Upscaler.java b/tools/src/io/anuke/mindustry/tools/Upscaler.java similarity index 97% rename from tools/src/io/anuke/mindustry/Upscaler.java rename to tools/src/io/anuke/mindustry/tools/Upscaler.java index 12cc32ee3b..5101552ddb 100644 --- a/tools/src/io/anuke/mindustry/Upscaler.java +++ b/tools/src/io/anuke/mindustry/tools/Upscaler.java @@ -1,4 +1,4 @@ -package io.anuke.mindustry; +package io.anuke.mindustry.tools; import io.anuke.arc.*; import io.anuke.arc.backends.sdl.*;