diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md index 335d17f26a..8c24e6af52 100644 --- a/.github/ISSUE_TEMPLATE/feature_request.md +++ b/.github/ISSUE_TEMPLATE/feature_request.md @@ -4,4 +4,4 @@ about: Suggest an idea for this project --- -**Do not make a new issue for feature requests!** Instead, post it in #545. +**Do not make a new issue for feature requests!** Instead, post it on FeatHub: https://feathub.com/Anuken/Mindustry diff --git a/.github/Mindustry-CodeStyle-IJ.xml b/.github/Mindustry-CodeStyle-IJ.xml new file mode 100644 index 0000000000..6a48acd1dd --- /dev/null +++ b/.github/Mindustry-CodeStyle-IJ.xml @@ -0,0 +1,85 @@ + + \ No newline at end of file diff --git a/.github/workflows/gradle.yml b/.github/workflows/gradle.yml index b23caac61e..d7d43c1d44 100644 --- a/.github/workflows/gradle.yml +++ b/.github/workflows/gradle.yml @@ -13,5 +13,5 @@ jobs: uses: actions/setup-java@v1 with: java-version: 1.8 - - name: Run unit tests with gradle - run: ./gradlew test + #- name: Run unit tests with gradle + # run: ./gradlew test diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 0000000000..adf061692e --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,62 @@ +# Contributing + +This is for code contributions. For translations, see [TRANSLATING](TRANSLATING.md). + +## Basic Guidelines + +#### Use an IDE. +Specifically, IntelliJ IDEA. Download the (free) Community Edition of it [here](https://www.jetbrains.com/idea/download/). Some people use other tools, like VS Code, but I would personally not recommend them for Java development. + +#### Always test your changes. +Do not submit something without at least running the game to see if it compiles. +If you are submitting a new block, make sure it has a name and description, and that it works correctly in-game. If you are changing existing block mechanics, test them out first. + + +#### Do not make large changes before discussing them first. +If you are interested in adding a large mechanic/feature or changing large amounts of code, first contact me (Anuken) via [Discord](https://discord.gg/mindustry) (preferred method) or via e-mail (*anukendev@gmail.com*). +For most changes, this should not be necessary. I just want to know if you're doing something big so I can offer advice and/or make sure you're not wasting your time on it. + + +## Style Guidelines + +#### Follow the formatting guidelines. +This means: +- No spaces around parentheses: `if(condition){`, `SomeType s = (SomeType)object` +- Same-line braces. +- 4 spaces indentation +- `camelCase`, **even for constants or enums**. Why? Because `SCREAMING_CASE` is ugly, annoying to type and does not achieve anything useful. Constants are *less* dangerous than variables, not more. +- No underscores for anything. (Yes, I know `Bindings` violates this principle, but that's for legacy reasons and really should be cleaned up some day) + +Import [this style file](.github/Mindustry-CodeStyle-IJ.xml) into IntelliJ to get correct formatting when developing Mindustry. + +#### Do not use incompatible Java features (java.util.function, java.awt). +Android [does not support](https://developer.android.com/studio/write/java8-support#supported_features) many of Java 8's features, such as the packages `java.util.function`, `java.util.stream` or `forEach` in collections. Do not use these in your code. +If you need to use functional interfaces, use the ones in `io.anuke.arc.func`, which are more or less the same with different naming schemes. + +The same applies to any class *outside* of the standard `java.[n]io` / `java.net` / `java.util` packages: Most of them are not supported. +`java.awt` is one of these packages: do not use it, ever. It is not supported on any platform, even desktop - the entire package is removed during JRE minimization. +In general, if you are using IntelliJ, you should be warned about platform incompatiblities. + + +#### 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`). + + +#### Avoid boxed types (Integer, Boolean) +Never create variables or collections with boxed types `Array` or `ObjectMap`. Use the collections specialized for this task, e.g. `IntArray` and `IntMap`. + + +#### Do not allocate anything if possible. +Never allocate `new` objects in the main loop. If you absolutely require new objects, use `Pools` to obtain and free object instances. +Otherwise, use the `Tmp` variables for things like vector/shape operations, or create `static` variables for re-use. +If using a list, make it a static variable and clear it every time it is used. Re-use as much as possible. + +#### Avoid bloated code and unnecessary getters/setters. +This is situational, but in essence what it means is to avoid using any sort of getters and setters unless absolutely necessary. Public or protected fields should suffice for most things. +If something needs to be encapsulated in the future, IntelliJ can handle it with a few clicks. + + +#### 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 diff --git a/README.md b/README.md index 4dce34be64..c39e9ce086 100644 --- a/README.md +++ b/README.md @@ -1,13 +1,17 @@ ![Logo](core/assets/sprites/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) +[![Discord](https://img.shields.io/discord/391020510269669376.svg)](https://discord.gg/mindustry) A sandbox tower defense game written in Java. _[Trello Board](https://trello.com/b/aE2tcUwF/mindustry-40-plans)_ _[Wiki](https://mindustrygame.github.io/wiki)_ +### Contributing + +See [CONTRIBUTING](CONTRIBUTING.md). + ### Building Bleeding-edge live builds are generated automatically for every commit. You can see them [here](https://github.com/Anuken/MindustryBuilds/releases). Old builds might still be on [jenkins](https://jenkins.hellomouse.net/job/mindustry/). @@ -45,6 +49,11 @@ If the terminal returns `Permission denied` or `Command not found` on Mac/Linux, Gradle may take up to several minutes to download files. Be patient.
After building, the output .JAR file should be in `/desktop/build/libs/Mindustry.jar` for desktop builds, and in `/server/build/libs/server-release.jar` for server builds. +### Feature Requests + +[![Feature Requests](https://feathub.com/Anuken/Mindustry?format=svg)](https://feathub.com/Anuken/Mindustry) + + ### Downloads [ diff --git a/android/build.gradle b/android/build.gradle index 8dfa8665c5..5486155564 100644 --- a/android/build.gradle +++ b/android/build.gradle @@ -69,7 +69,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 96f99dcd5f..627a782dd3 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.function.*; +import io.anuke.arc.func.Cons; import io.anuke.arc.scene.ui.layout.*; import io.anuke.arc.util.*; import io.anuke.arc.util.serialization.*; @@ -70,7 +70,7 @@ public class AndroidLauncher extends AndroidApplication{ } @Override - public void showFileChooser(boolean open, String extension, Consumer cons){ + public void showFileChooser(boolean open, String extension, Cons cons){ if(VERSION.SDK_INT >= VERSION_CODES.Q){ Intent intent = new Intent(open ? Intent.ACTION_OPEN_DOCUMENT : Intent.ACTION_CREATE_DOCUMENT); intent.addCategory(Intent.CATEGORY_OPENABLE); @@ -81,7 +81,7 @@ public class AndroidLauncher extends AndroidApplication{ if(uri.getPath().contains("(invalid)")) return; - Core.app.post(() -> Core.app.post(() -> cons.accept(new FileHandle(uri.getPath()){ + Core.app.post(() -> Core.app.post(() -> cons.get(new FileHandle(uri.getPath()){ @Override public InputStream read(){ try{ @@ -106,9 +106,9 @@ public class AndroidLauncher extends AndroidApplication{ checkSelfPermission(Manifest.permission.READ_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED)){ chooser = new FileChooser(open ? "$open" : "$save", file -> file.extension().equalsIgnoreCase(extension), open, file -> { if(!open){ - cons.accept(file.parent().child(file.nameWithoutExtension() + "." + extension)); + cons.get(file.parent().child(file.nameWithoutExtension() + "." + extension)); }else{ - cons.accept(file); + cons.get(file); } }); diff --git a/build.gradle b/build.gradle index 0e557493be..4e1252df97 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" } @@ -26,10 +26,14 @@ allprojects{ if(!project.hasProperty("versionType")) versionType = 'official' appName = 'Mindustry' gdxVersion = '1.9.10' - roboVMVersion = '2.3.8-SNAPSHOT' - steamworksVersion = '1.8.0' + 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") } @@ -149,8 +153,7 @@ project(":desktop"){ compile "com.badlogicgames.gdx:gdx-platform:$gdxVersion:natives-desktop" compile "com.badlogicgames.gdx:gdx-freetype-platform:$gdxVersion:natives-desktop" - compile "com.code-disaster.steamworks4j:steamworks4j:$steamworksVersion" - compile "com.code-disaster.steamworks4j:steamworks4j-server:$steamworksVersion" + compile "com.github.Anuken:steamworks4j:$steamworksVersion" compile arcModule("backends:backend-sdl") compile 'com.github.MinnDevelopment:java-discord-rpc:v2.0.1' @@ -201,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{ diff --git a/core/assets-raw/sprites/blocks/liquid/liquid-overflow-gate-top.png b/core/assets-raw/sprites/blocks/liquid/liquid-overflow-gate-top.png new file mode 100644 index 0000000000..f6bdf7f613 Binary files /dev/null and b/core/assets-raw/sprites/blocks/liquid/liquid-overflow-gate-top.png differ diff --git a/core/assets-raw/sprites/blocks/liquid/liquid-overflow-gate.png b/core/assets-raw/sprites/blocks/liquid/liquid-overflow-gate.png new file mode 100644 index 0000000000..f608e0a6d1 Binary files /dev/null and b/core/assets-raw/sprites/blocks/liquid/liquid-overflow-gate.png differ diff --git a/core/assets-raw/sprites/blocks/liquid/plated-conduit-cap.png b/core/assets-raw/sprites/blocks/liquid/plated-conduit-cap.png new file mode 100644 index 0000000000..f4e8df2bb7 Binary files /dev/null and b/core/assets-raw/sprites/blocks/liquid/plated-conduit-cap.png differ diff --git a/core/assets-raw/sprites/blocks/liquid/plated-conduit-top-0.png b/core/assets-raw/sprites/blocks/liquid/plated-conduit-top-0.png new file mode 100644 index 0000000000..21fd730109 Binary files /dev/null and b/core/assets-raw/sprites/blocks/liquid/plated-conduit-top-0.png differ diff --git a/core/assets-raw/sprites/blocks/liquid/plated-conduit-top-1.png b/core/assets-raw/sprites/blocks/liquid/plated-conduit-top-1.png new file mode 100644 index 0000000000..94c22fd75e Binary files /dev/null and b/core/assets-raw/sprites/blocks/liquid/plated-conduit-top-1.png differ diff --git a/core/assets-raw/sprites/blocks/liquid/plated-conduit-top-2.png b/core/assets-raw/sprites/blocks/liquid/plated-conduit-top-2.png new file mode 100644 index 0000000000..a9bdc10692 Binary files /dev/null and b/core/assets-raw/sprites/blocks/liquid/plated-conduit-top-2.png differ diff --git a/core/assets-raw/sprites/blocks/liquid/plated-conduit-top-3.png b/core/assets-raw/sprites/blocks/liquid/plated-conduit-top-3.png new file mode 100644 index 0000000000..7487e481cb Binary files /dev/null and b/core/assets-raw/sprites/blocks/liquid/plated-conduit-top-3.png differ diff --git a/core/assets-raw/sprites/blocks/liquid/plated-conduit-top-4.png b/core/assets-raw/sprites/blocks/liquid/plated-conduit-top-4.png new file mode 100644 index 0000000000..19fad690a4 Binary files /dev/null and b/core/assets-raw/sprites/blocks/liquid/plated-conduit-top-4.png differ diff --git a/core/assets-raw/sprites/blocks/liquid/plated-conduit-top-5.png b/core/assets-raw/sprites/blocks/liquid/plated-conduit-top-5.png new file mode 100644 index 0000000000..45158534c4 Binary files /dev/null and b/core/assets-raw/sprites/blocks/liquid/plated-conduit-top-5.png differ diff --git a/core/assets-raw/sprites/blocks/liquid/plated-conduit-top-6.png b/core/assets-raw/sprites/blocks/liquid/plated-conduit-top-6.png new file mode 100644 index 0000000000..f5b5cd1157 Binary files /dev/null and b/core/assets-raw/sprites/blocks/liquid/plated-conduit-top-6.png differ diff --git a/core/assets-raw/sprites/blocks/power/diode-arrow.png b/core/assets-raw/sprites/blocks/power/diode-arrow.png new file mode 100644 index 0000000000..2699e370da Binary files /dev/null and b/core/assets-raw/sprites/blocks/power/diode-arrow.png differ diff --git a/core/assets-raw/sprites/blocks/power/diode.png b/core/assets-raw/sprites/blocks/power/diode.png new file mode 100644 index 0000000000..fc2c4ee8b1 Binary files /dev/null and b/core/assets-raw/sprites/blocks/power/diode.png differ diff --git a/core/assets-raw/sprites/blocks/power/illuminator-top.png b/core/assets-raw/sprites/blocks/power/illuminator-top.png new file mode 100644 index 0000000000..8597b28d97 Binary files /dev/null and b/core/assets-raw/sprites/blocks/power/illuminator-top.png differ diff --git a/core/assets-raw/sprites/blocks/power/illuminator.png b/core/assets-raw/sprites/blocks/power/illuminator.png new file mode 100644 index 0000000000..9269a33447 Binary files /dev/null and b/core/assets-raw/sprites/blocks/power/illuminator.png differ diff --git a/core/assets-raw/sprites/effects/circle-end.png b/core/assets-raw/sprites/effects/circle-end.png new file mode 100644 index 0000000000..e63f104191 Binary files /dev/null and b/core/assets-raw/sprites/effects/circle-end.png differ diff --git a/core/assets-raw/sprites/effects/circle-mid.png b/core/assets-raw/sprites/effects/circle-mid.png new file mode 100644 index 0000000000..c6805a606c Binary files /dev/null and b/core/assets-raw/sprites/effects/circle-mid.png differ diff --git a/core/assets-raw/sprites/effects/circle-shadow.png b/core/assets-raw/sprites/effects/circle-shadow.png index 2e9aaec802..129b74296d 100644 Binary files a/core/assets-raw/sprites/effects/circle-shadow.png and b/core/assets-raw/sprites/effects/circle-shadow.png differ diff --git a/core/assets-raw/sprites/ui/alpha-bg.png b/core/assets-raw/sprites/ui/alpha-bg.png new file mode 100644 index 0000000000..9cbc32b1fe Binary files /dev/null and b/core/assets-raw/sprites/ui/alpha-bg.png differ diff --git a/core/assets-raw/sprites/ui/icons/icon-f-droid.png b/core/assets-raw/sprites/ui/icons/icon-f-droid.png new file mode 100644 index 0000000000..1a2eca14f2 Binary files /dev/null and b/core/assets-raw/sprites/ui/icons/icon-f-droid.png differ diff --git a/core/assets-raw/sprites/ui/icons/icon-flip.png b/core/assets-raw/sprites/ui/icons/icon-flip.png new file mode 100644 index 0000000000..d81d741434 Binary files /dev/null and b/core/assets-raw/sprites/ui/icons/icon-flip.png differ diff --git a/core/assets-raw/sprites/units/lich.png b/core/assets-raw/sprites/units/lich.png index d80c0b0294..046d51b3d9 100644 Binary files a/core/assets-raw/sprites/units/lich.png and b/core/assets-raw/sprites/units/lich.png differ diff --git a/core/assets-raw/sprites/units/reaper.png b/core/assets-raw/sprites/units/reaper.png index c6baf138b1..ace8e0a9c2 100644 Binary files a/core/assets-raw/sprites/units/reaper.png and b/core/assets-raw/sprites/units/reaper.png differ diff --git a/core/assets-raw/sprites/units/wraith.png b/core/assets-raw/sprites/units/wraith.png index b95d632036..3b7c673d86 100644 Binary files a/core/assets-raw/sprites/units/wraith.png and b/core/assets-raw/sprites/units/wraith.png differ diff --git a/core/assets/bundles/bundle.properties b/core/assets/bundles/bundle.properties index 4a5b0dd56a..86c6df380e 100644 --- a/core/assets/bundles/bundle.properties +++ b/core/assets/bundles/bundle.properties @@ -10,6 +10,7 @@ link.dev-builds.description = Unstable development builds link.trello.description = Official Trello board for planned features link.itch.io.description = itch.io page with PC downloads link.google-play.description = Google Play store listing +link.f-droid.description = F-Droid catalogue listing link.wiki.description = Official Mindustry wiki linkfail = Failed to open link!\nThe URL has been copied to your clipboard. screenshot = Screenshot saved to {0} @@ -78,29 +79,33 @@ maps.browse = Browse Maps continue = Continue maps.none = [lightgray]No maps found! invalid = Invalid +pickcolor = Pick Color preparingconfig = Preparing Config preparingcontent = Preparing Content uploadingcontent = Uploading Content uploadingpreviewfile = Uploading Preview File committingchanges = Comitting Changes done = Done +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.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.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} @@ -273,6 +278,7 @@ missing = This item has been deleted or moved.\n[lightgray]The workshop listing 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} editor.brush = Brush editor.openin = Open In Editor @@ -520,6 +526,7 @@ blocks.shootrange = Range blocks.size = Size blocks.liquidcapacity = Liquid Capacity blocks.powerrange = Power Range +blocks.powerconnections = Max Connections blocks.poweruse = Power Use blocks.powerdamage = Power/Damage blocks.itemcapacity = Item Capacity @@ -542,6 +549,7 @@ blocks.ammo = Ammo bar.drilltierreq = Better Drill Required bar.drillspeed = Drill Speed: {0}/s +bar.pumpspeed = Pump Speed: {0}/s bar.efficiency = Efficiency: {0}% bar.powerbalance = Power: {0}/s bar.powerstored = Stored: {0}/{1} @@ -554,6 +562,8 @@ bar.heat = Heat bar.power = Power bar.progress = Build Progress bar.spawned = Units: {0}/{1} +bar.input = Input +bar.output = Output bullet.damage = [stat]{0}[lightgray] damage bullet.splashdamage = [stat]{0}[lightgray] area dmg ~[stat] {1}[lightgray] tiles @@ -588,8 +598,10 @@ category.shooting = Shooting category.optional = Optional Enhancements setting.landscape.name = Lock Landscape setting.shadows.name = Shadows +setting.blockreplace.name = Automatic Block Suggestions setting.linear.name = Linear Filtering setting.hints.name = Hints +setting.buildautopause.name = Auto-Pause Building setting.animatedwater.name = Animated Water setting.animatedshields.name = Animated Shields setting.antialias.name = Antialias[lightgray] (requires restart)[] @@ -610,12 +622,17 @@ setting.difficulty.insane = Insane setting.difficulty.name = Difficulty: setting.screenshake.name = Screen Shake setting.effects.name = Display Effects +setting.destroyedblocks.name = Display Destroyed Blocks +setting.conveyorpathfinding.name = Conveyor Placement Pathfinding setting.sensitivity.name = Controller Sensitivity setting.saveinterval.name = Save Interval -setting.seconds = {0} Seconds +setting.seconds = {0} seconds +setting.blockselecttimeout.name = Block Select Timeout +setting.milliseconds = {0} milliseconds setting.fullscreen.name = Fullscreen setting.borderlesswindow.name = Borderless Window[lightgray] (may require restart) -setting.fps.name = Show FPS +setting.fps.name = Show FPS & Ping +setting.blockselectkeys.name = Show Block Select Keys setting.vsync.name = VSync setting.pixelate.name = Pixelate[lightgray] (disables animations) setting.minimap.name = Show Minimap @@ -644,16 +661,36 @@ category.multiplayer.name = Multiplayer command.attack = Attack command.rally = Rally command.retreat = Retreat +placement.blockselectkeys = \n[lightgray]Key: [{0}, 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.move_x.name = Move x -keybind.move_y.name = Move y +keybind.toggle_power_lines.name = Toggle Power Lines +keybind.move_x.name = Move X +keybind.move_y.name = Move Y +keybind.mouse_move.name = Follow Mouse +keybind.dash.name = Dash 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.category_prev.name = Previous Category +keybind.category_next.name = Next Category +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 = Toggle Fullscreen keybind.select.name = Select/Shoot keybind.diagonal_placement.name = Diagonal Placement @@ -667,18 +704,17 @@ keybind.menu.name = Menu keybind.pause.name = Pause keybind.pause_building.name = Pause/Resume Building keybind.minimap.name = Minimap -keybind.dash.name = Dash keybind.chat.name = Chat -keybind.player_list.name = Player list +keybind.player_list.name = Player List keybind.console.name = Console keybind.rotate.name = Rotate keybind.rotateplaced.name = Rotate Existing (Hold) -keybind.toggle_menus.name = Toggle menus -keybind.chat_history_prev.name = Chat history prev -keybind.chat_history_next.name = Chat history next -keybind.chat_scroll.name = Chat scroll +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 +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. @@ -692,6 +728,7 @@ mode.attack.description = Destroy the enemy's base. No waves.\n[gray]Requires a mode.custom = Custom Rules rules.infiniteresources = Infinite Resources +rules.reactorexplosions = Reactor Explosions rules.wavetimer = Wave Timer rules.waves = Waves rules.attack = Attack Mode @@ -707,7 +744,7 @@ 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.waitForWaveToEnd = Waves Wait for Enemies rules.dropzoneradius = Drop Zone Radius:[lightgray] (tiles) rules.respawns = Max respawns per wave rules.limitedRespawns = Limit Respawns @@ -717,6 +754,9 @@ rules.title.resourcesbuilding = Resources & Building rules.title.player = Players rules.title.enemy = Enemies rules.title.unit = Units +rules.title.experimental = Experimental +rules.lighting = Lighting +rules.ambientlight = Ambient Light content.item.name = Items content.liquid.name = Liquids @@ -878,6 +918,8 @@ block.distributor.name = Distributor block.sorter.name = Sorter block.inverted-sorter.name = Inverted Sorter block.message.name = Message +block.illuminator.name = Illuminator +block.illuminator.description = A small, compact, configurable light source. Requires power to function. block.overflow-gate.name = Overflow Gate block.silicon-smelter.name = Silicon Smelter block.phase-weaver.name = Phase Weaver @@ -891,6 +933,7 @@ 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.diode.name = Battery Diode block.battery.name = Battery block.battery-large.name = Large Battery block.combustion-generator.name = Combustion Generator @@ -943,6 +986,7 @@ 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.plated-conduit.name = Plated Conduit block.phase-conduit.name = Phase Conduit block.liquid-router.name = Liquid Router block.liquid-tank.name = Liquid Tank @@ -994,15 +1038,15 @@ unit.eradicator.name = Eradicator unit.lich.name = Lich unit.reaper.name = Reaper tutorial.next = [lightgray] -tutorial.intro = You have entered the[scarlet] Mindustry Tutorial.[]\nUse [[WASD] to move.\n[accent] Hold [[Ctrl] while scrolling[] to zoom in and out.\nBegin by[accent] mining copper[]. Move close to it, then tap a copper ore vein near your core to do this.\n\n[accent]{0}/{1} copper -tutorial.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 = 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.intro = You have entered the[scarlet] Mindustry Tutorial.[]\nUse [accent][[WASD][] to move.\n[accent]Hold [[Ctrl] while scrolling[] to zoom in and out.\nBegin by[accent] mining copper[]. Move close to it, then tap a copper ore vein near your core to do this.\n\n[accent]{0}/{1} copper +tutorial.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 = 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.\nYou can also select the drill by tapping [accent][[2][] then [accent][[1][] quickly, regardless of which tab is open.\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.\nUse the scrollwheel to rotate blocks before placing them.\n[accent]Place 2 conveyors with the line tool, then deliver an item into the core. tutorial.conveyor.mobile = [accent]Conveyors[] are used to transport items to the core.\nMake a line of conveyors from the drill to the core.\n[accent] Place in a line by holding down your finger for a few seconds[] and dragging in a direction.\n\n[accent]Place 2 conveyors with the line tool, then deliver an item into the core. tutorial.turret = Once an item enters your core, it can be used for building.\nKeep in mind that not all items can be used for building.\nItems that are not used for building, such as[accent] coal[] or[accent] scrap[], cannot be put into the core.\nDefensive structures must be built to repel the[lightgray] enemy[].\nBuild a[accent] duo turret[] near your base. -tutorial.drillturret = Duo turrets require[accent] copper ammo []to shoot.\nPlace a drill near the turret.\nLead conveyors into the turret to supply it with copper.\n\n[accent]Ammo delivered: 0/1 +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. @@ -1104,13 +1148,14 @@ block.sorter.description = Sorts items. If an item matches the selection, it is block.inverted-sorter.description = Processes items like a standard sorter, but outputs selected items to the sides instead. 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.overflow-gate.description = 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.plated-conduit.description = Moves liquids at the same rate as pulse conduits, but possesses more armor. Does not accept fluids from the sides by anything other than conduits.\nLeaks less. 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. @@ -1119,6 +1164,7 @@ block.phase-conduit.description = Advanced liquid transport block. Uses power to 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. block.surge-tower.description = An extremely long-range power node with fewer available connections. +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 = 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. diff --git a/core/assets/bundles/bundle_cs.properties b/core/assets/bundles/bundle_cs.properties index bdbc7a552b..cb96d91f74 100644 --- a/core/assets/bundles/bundle_cs.properties +++ b/core/assets/bundles/bundle_cs.properties @@ -3,6 +3,7 @@ credits = Kredity contributors = Překladatelé a Sponzoři discord = Připoj se k Mindustry na Discordu! link.discord.description = Oficiální Mindustry chatroom na Discordu! +link.reddit.description = The Mindustry subreddit link.github.description = Zdrojový kód hry link.changelog.description = Seznam úprav link.dev-builds.description = Nestabilní verze vývoje hry @@ -26,6 +27,7 @@ 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 @@ -78,20 +80,25 @@ uploadingcontent = Nahrávám obsah uploadingpreviewfile = Nahrávám prohlížecí soubor committingchanges = Provádím změny done = Hotovo -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. +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.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} @@ -263,6 +270,7 @@ missing = This item has been deleted or moved.\n[lightgray]The workshop listing 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} editor.brush = Štětec editor.openin = Otevřít v editoru. editor.oregen = Generovat nerostné zdroje. @@ -501,6 +509,7 @@ blocks.shootrange = Dostřel blocks.size = velikost blocks.liquidcapacity = Kapacita tekutin blocks.powerrange = Rozsah energie +blocks.powerconnections = Max Connections blocks.poweruse = Spotřebuje energie blocks.powerdamage = Energie na poškození blocks.itemcapacity = kapacita předmětů @@ -522,6 +531,7 @@ blocks.reload = Střely za sekundu blocks.ammo = Střelivo bar.drilltierreq = Je vyžadován lepší vrt bar.drillspeed = Rychlost vrtu: {0}/s +bar.pumpspeed = Pump Speed: {0}/s bar.efficiency = Efektivita: {0}% bar.powerbalance = Energie: {0} bar.powerstored = Uskladněno: {0}/{1} @@ -566,6 +576,7 @@ category.shooting = Střílí category.optional = Volitelné vylepšení setting.landscape.name = Uzamknout krajinu setting.shadows.name = Stíny +setting.blockreplace.name = Automatic Block Suggestions setting.linear.name = Lineární filtrování setting.hints.name = Hints setting.animatedwater.name = Animovaná voda @@ -588,6 +599,8 @@ setting.difficulty.insane = šílená setting.difficulty.name = Obtížnost: setting.screenshake.name = Třes obrazu setting.effects.name = Zobrazit efekty +setting.destroyedblocks.name = Display Destroyed Blocks +setting.conveyorpathfinding.name = Conveyor Placement Pathfinding setting.sensitivity.name = Citlivost ovladače setting.saveinterval.name = Interval automatického ukládání setting.seconds = {0} Sekund @@ -830,6 +843,8 @@ 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.phase-wall.name = Fázová stěna block.phase-wall-large.name = Velká fázová stěna block.thorium-wall.name = Thoriová stěna @@ -968,6 +983,7 @@ 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.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 = Manuální těžba je neefektivní.\n[accent]Vrty []budou těžit automaticky.\npolož jeden na měděnou rudu. 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.[] @@ -1051,6 +1067,8 @@ block.copper-wall.description = Levný defenzivní blok.\nUžitečný k obraně block.copper-wall-large.description = Levný defenzivní blok.\nUžitečný k obraně tvého jádra a střílen v prvotních vlnách nepřátel.\nZabírá více polí. 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.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.thorium-wall.description = Sílný defenzivní blok.\nDobrá obrana vůči nepřátelům. block.thorium-wall-large.description = Sílný defenzivní blok.\nDobrá obrana vůči nepřátelům..\nZabírá více polí. block.phase-wall.description = Né tak silná jako zeď Thoria ale odráží nepřátelské projektily dokud nejsou moc silné. @@ -1070,7 +1088,7 @@ block.junction.description = Chová se jako most pro dva křížící se pásy d block.bridge-conveyor.description = Pokročilý blok přepravy předmětů. Dovoluje transport předmětů až přez tři pole jakéhokoliv terénu nebo budovy. block.phase-conveyor.description = Pokročilý blok přepravy předmětů. Využívá energii k přepravě od jednoho bodu k druhému po velice dlouhé vzdálenosti. block.sorter.description = Třídí předměty. Jestli je předmět shodný s výběrem, je mu dovoleno projít. Naopak neshodné předměty jsou vypuštěny do prava nebo do leva. -block.inverted-sorter.descriptions = Processes items like a standard sorter, but outputs selected items to the sides instead. +block.inverted-sorter.description = Processes items like a standard sorter, but outputs selected items to the sides instead. block.router.description = Příijmá předměty z jednoho směru a posílá je rovnoměrně do zbylých tří směrů. Užitečný při rozdělení jednoho zdroje směřující do různých cílů. block.distributor.description = Pokročilý směrovač, který z libovolného počtu vstupů vytvoří libovolný počet výstupu a rozdělí přísun předmětů rovnoměrně do každého z nich, obdoba Multiplexeru a Demultiplexeru. block.overflow-gate.description = Kombinace distributoru a děličky která má výstup do leva nebo do prava jen pokud je přední strana zablokovaná. diff --git a/core/assets/bundles/bundle_de.properties b/core/assets/bundles/bundle_de.properties index 85c9b67684..4d21b8d8db 100644 --- a/core/assets/bundles/bundle_de.properties +++ b/core/assets/bundles/bundle_de.properties @@ -3,6 +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.github.description = Quellcode des Spiels link.changelog.description = Liste der Änderungen link.dev-builds.description = Entwicklungs-Builds (instabil) @@ -26,6 +27,7 @@ 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 @@ -78,20 +80,25 @@ uploadingcontent = Uploading Content uploadingpreviewfile = Uploading Preview File committingchanges = Comitting Changes done = Done -mods.alphainfo = Keep in mind that mods are in alpha, and[scarlet] may be very buggy[].\nReport any issues you find to the Mindustry Github or Discord. +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.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} @@ -263,6 +270,7 @@ missing = This item has been deleted or moved.\n[lightgray]The workshop listing 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} editor.brush = Pinsel editor.openin = Öffne im Editor editor.oregen = Erze generieren @@ -501,6 +509,7 @@ blocks.shootrange = Reichweite blocks.size = Größe blocks.liquidcapacity = Flüssigkeitskapazität blocks.powerrange = Stromreichweite +blocks.powerconnections = Max Connections blocks.poweruse = Stromverbrauch blocks.powerdamage = Stromverbrauch/Schadenspunkt blocks.itemcapacity = Materialkapazität @@ -522,6 +531,7 @@ blocks.reload = Schüsse/Sekunde blocks.ammo = Munition bar.drilltierreq = Better Drill Required bar.drillspeed = Bohrgeschwindigkeit: {0}/s +bar.pumpspeed = Pump Speed: {0}/s bar.efficiency = Effizienz: {0}% bar.powerbalance = Strom: {0} bar.powerstored = Stored: {0}/{1} @@ -566,6 +576,7 @@ category.shooting = Schießen category.optional = Optionale Verbesserungen setting.landscape.name = Landschaft sperren setting.shadows.name = Schatten +setting.blockreplace.name = Automatic Block Suggestions setting.linear.name = Lineare Filterung setting.hints.name = Hints setting.animatedwater.name = Animiertes Wasser @@ -588,6 +599,8 @@ 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.sensitivity.name = Controller-Empfindlichkeit setting.saveinterval.name = Autosave Häufigkeit setting.seconds = {0} Sekunden @@ -830,6 +843,8 @@ block.copper-wall.name = Kupfermauer block.copper-wall-large.name = Große Kupfermauer block.titanium-wall.name = Titanmauer block.titanium-wall-large.name = Große Titanmauer +block.plastanium-wall.name = Plastanium Wall +block.plastanium-wall-large.name = Large Plastanium Wall block.phase-wall.name = Phasenmauer block.phase-wall-large.name = Große Phasenmauer block.thorium-wall.name = Thorium-Mauer @@ -968,6 +983,7 @@ unit.lich.name = Lich unit.reaper.name = Reaper tutorial.next = [lightgray] tutorial.intro = Du befindest dich im[scarlet] Mindustry-Tutorial.[]\nBeginne, indem du[accent] Kupfer abbaust[]. Tippe dazu auf ein Kupfervorkommen in der Nähe deiner Basis.\n\n[accent]{0}/{1} Kupfer +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 = Manuelles Abbauen ist ineffizient.\n[accent]Bohrer []können automatisch abbauen.\nTippe auf den Bohrer Tab unten rechts.\nWähle den[accent] Mechanischen Bohrer[].\nPlatziere ihn durch Tippen auf ein Kupfervorkommen.\nMit einem [accent]Rechtsklick[] brichst du den Bau ab. tutorial.drill.mobile = Manuelles Abbauen ist ineffizient.\n[accent]Bohrer []können automatisch abbauen.\nTippe auf den Bohrer Tab unten rechts.\nWähle den[accent] Mechanischen Bohrer[].\nPlatziere ihn durch Tippen auf ein Kupfervorkommen, dann klicke auf das[accent] Häkchen[] unten um deine Auswahl zu bestätigen.\nKlicke auf den[accent] X-Button[] um den Bau abzubrechen. tutorial.blockinfo = Jeder Block hat unterschiedliche Eigenschaften. Jeder Bohrer kann immer nur ein bestimmtes Material abbauen.\nFür Infos und Stats eines Blocks wähle einen Block im Baumenü aus und [accent] klicke auf den "?"-Button.[]\n\n[accent]Schau dir jetzt die Stats des Mechanischen Bohrers an.[] @@ -1051,6 +1067,8 @@ block.copper-wall.description = Ein günstiger Verteidigungsblock.\nNützlich, u block.copper-wall-large.description = Ein günstiger Verteidigungsblock.\nNützlich, um die Basis und Türme in den ersten Wellen zu beschützen.\nBenötigt mehrere Kacheln. block.titanium-wall.description = Ein mittel starker Verteidigungsblock.\nBietet mäßigen Schutz vor Feinden. block.titanium-wall-large.description = Ein mittel starker Verteidigungsblock.\nBeitet mäßigen Schutz vor Feinden.\nBenötigt mehrere Kacheln. +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.thorium-wall.description = Ein starker Verteidigungsblock.\nBietet guten Schutz vor Feinden. block.thorium-wall-large.description = Ein starker Verteidigungsblock.\nBietet Guten Schutz vor Feinden.\nBenötigt mehrere Kacheln. block.phase-wall.description = Nicht so stark, wie eine Thorium-Mauer, aber reflektiert Schüsse bis zu einer gewissen Stärke. @@ -1070,7 +1088,7 @@ block.junction.description = Fungiert als Brücke zwischen zwei kreuzenden Förd block.bridge-conveyor.description = Verbesserter Transportblock. Erlaubt es, Materialien über bis zu 3 Kacheln beliebigen Terrains oder Inhalts zu transportieren. block.phase-conveyor.description = Verbesserter Transportblock. Verwendet Strom, um Materialien zu einem verbundenen Phasen-Förderband über mehrere Kacheln zu teleportieren. block.sorter.description = Sortiert Materialien. Wenn ein Gegenstand der Auswahl entspricht, darf er vorbei. Andernfalls wird er links oder rechts ausgegeben. -block.inverted-sorter.descriptions = Processes items like a standard sorter, but outputs selected items to the sides instead. +block.inverted-sorter.description = Processes items like a standard sorter, but outputs selected items to the sides instead. block.router.description = Akzeptiert Materialien aus einer Richtung und leitet sie gleichmäßig in bis zu drei andere Richtungen weiter. Nützlich, wenn die Materialien aus einer Richtung an mehrere Empfänger verteilt werden sollen. block.distributor.description = Ein weiterentwickelter Verteiler, der Materialien in bis zu sieben Richtungen gleichmäßig verteilt. block.overflow-gate.description = Ein Verteiler, der nur Materialien nach links oder rechts ausgibt, falls der Weg gerade aus blockiert ist. @@ -1134,9 +1152,9 @@ block.spirit-factory.description = Produziert leichte Drohnen, die Erz abbauen u block.phantom-factory.description = Produziert erweiterte Drohnen, die deutlich effizienter sind als Spirit-Drohnen. block.wraith-factory.description = Produziert schnelle Abfangjäger. block.ghoul-factory.description = Produziert schwere Flächenbomber. -block.revenant-factory.description = Produziert schwere Laser-Bodeneinheiten. +block.revenant-factory.description = Produziert schwere Raketen basierte Flugeinheiten. block.dagger-factory.description = Produziert Standard-Bodeneinheiten. -block.crawler-factory.description = Produces fast self-destructing swarm units. +block.crawler-factory.description = Produziert schnelle selbstzerstörende Schwarmeinheiten. block.titan-factory.description = Produziert fortgeschrittene, gepanzerte Bodeneinheiten. block.fortress-factory.description = Produziert schwere Artillerie-Bodeneinheiten. block.repair-point.description = Heilt durchgehend die nächste befreundete, beschädigte Einheit in der Umgebung. diff --git a/core/assets/bundles/bundle_es.properties b/core/assets/bundles/bundle_es.properties index 28e8cc396a..1901f2c3c1 100644 --- a/core/assets/bundles/bundle_es.properties +++ b/core/assets/bundles/bundle_es.properties @@ -3,6 +3,7 @@ credits = Créditos contributors = Traductores y Contribuidores discord = ¡Únete al Discord de Mindustry! link.discord.description = La sala oficial del Discord de Mindustry +link.reddit.description = The Mindustry subreddit link.github.description = Código fuente del juego link.changelog.description = Lista de actualizaciones link.dev-builds.description = Versiones de desarrollo inestables @@ -26,6 +27,7 @@ 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 @@ -78,20 +80,25 @@ uploadingcontent = Uploading Content uploadingpreviewfile = Uploading Preview File committingchanges = Comitting Changes done = Hecho -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. +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.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} @@ -263,6 +270,7 @@ missing = This item has been deleted or moved.\n[lightgray]The workshop listing 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} editor.brush = Pincel editor.openin = Abrir en el Editor editor.oregen = Generación de Minerales @@ -501,6 +509,7 @@ blocks.shootrange = Rango de Disparo blocks.size = Tamaño blocks.liquidcapacity = Capacidad de Líquidos blocks.powerrange = Rango de Energía +blocks.powerconnections = Max Connections blocks.poweruse = Consumo de Energía blocks.powerdamage = Energía/Daño blocks.itemcapacity = Capacidad de Objetos @@ -522,6 +531,7 @@ blocks.reload = Recarga blocks.ammo = Munición bar.drilltierreq = Se requiere un mejor taladro. bar.drillspeed = Velocidad del Taladro: {0}/s +bar.pumpspeed = Pump Speed: {0}/s bar.efficiency = Eficiencia: {0}% bar.powerbalance = Energía: {0} bar.powerstored = Almacenados: {0}/{1} @@ -566,6 +576,7 @@ category.shooting = Disparo category.optional = Mejoras Opcionales setting.landscape.name = Lock Landscape setting.shadows.name = Sombras +setting.blockreplace.name = Automatic Block Suggestions setting.linear.name = Linear Filtering setting.hints.name = Hints setting.animatedwater.name = Agua Animada @@ -588,6 +599,8 @@ setting.difficulty.insane = locura setting.difficulty.name = Dificultad: setting.screenshake.name = Movimiento de la Pantalla setting.effects.name = Mostrar Efectos +setting.destroyedblocks.name = Display Destroyed Blocks +setting.conveyorpathfinding.name = Conveyor Placement Pathfinding setting.sensitivity.name = Sensibilidad del Control setting.saveinterval.name = Intervalo del Autoguardado setting.seconds = {0} Segundos @@ -830,6 +843,8 @@ block.copper-wall.name = Muro de Cobre block.copper-wall-large.name = Muro de Cobre grande block.titanium-wall.name = Muro de Titanio block.titanium-wall-large.name = Muro de Titanio grande +block.plastanium-wall.name = Plastanium Wall +block.plastanium-wall-large.name = Large Plastanium Wall block.phase-wall.name = Muro de Fase grande block.phase-wall-large.name = Muro de Fase grande block.thorium-wall.name = Pared de Torio @@ -968,6 +983,7 @@ unit.lich.name = Lich unit.reaper.name = Reaper tutorial.next = [lightgray] tutorial.intro = Has entrado en el[scarlet]Tutorial de Mindustry.[]\nComienza[accent]minando cobre[]. Toca en una veta de cobre cercana al núcleo para hacer esto.\n\n[accent]{0}/{1} cobre +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 = Minar manualmente es ineficiente.\nLos [accent]taladros pueden minar automáticamente.\nColoca uno en una veta de cobre. tutorial.drill.mobile = Minar manualmente es ineficiente.\nLos [accent]Taladros[] pueden minar automáticamente.\nToca la sección de taladros el la esquina de abajo a la derecha.\nSelecciona el[accent]taladro mecánico[].\nColócalo en una veta de cobre tocándola, después pulsa el [accent]botón de confirmación de debajo para confirmar tu selección.\nPulsa el[accent]botón "X" para cancelar la construcción. tutorial.blockinfo = Cada bloque tiene diferentes estadísticas. Cada taladro solo puede minar ciertos minerales.\nPara comprobar la información y estadísticas de un bloque,[accent] toca el botón "?" mientras lo tienes seleccionado en el menú de construcción.[]\n\n[accent]Accede a las estadísticas del Taladro Mecánico ahora.[] @@ -1051,6 +1067,8 @@ block.copper-wall.description = Un bloque defensivo barato.\nÚtil para defender block.copper-wall-large.description = Un bloque defensivo barato.\nÚtil para defender el núcleo y las torres en las primeras oleadas.\nOcupa múltiples casillas. block.titanium-wall.description = Un bloque defensivo moderadamente fuerte.\nProporciona protección moderada contra los enemigos. block.titanium-wall-large.description = Un bloque defensivo moderadamente fuerte.\nProporciona protección moderada contra los enemigos.\nOcupa múltiples casillas. +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.thorium-wall.description = Un bloque defensivo fuerte.\nBuena protección contra enemigos. block.thorium-wall-large.description = Un bloque defensivo fuerte.\nBuena protección contra enemigos.\nOcupa múltiples casillas. block.phase-wall.description = No es tan fuerte como un muro de torio pero rebota balas al enemigo si no son demasiado fuertes. @@ -1070,7 +1088,7 @@ block.junction.description = Actúa como puente para dos transportadores que se block.bridge-conveyor.description = Bloque avanado de transporte. Puede transportar objetos por encima hasta 3 casillas de cualquier terreno o construcción. block.phase-conveyor.description = Bloque de transporte avanzado. Usa energía para transportar objetos a otro transportador de fase conectado por varias casillas. block.sorter.description = Clasifica objetos. Si un objeto es igual al seleccionado, pasará al frente. Si no, el objeto saldrá por la izquierda y la derecha. -block.inverted-sorter.descriptions = Processes items like a standard sorter, but outputs selected items to the sides instead. +block.inverted-sorter.description = Processes items like a standard sorter, but outputs selected items to the sides instead. block.router.description = Acepta objetos de una dirección y deja objetos equitativamente en hasta 3 direcciones diferentes. Útil para dividir los materiales de una fuente de recursos a múltiples objetivos. block.distributor.description = Un enrutador avanzado que distribuye objetos equitativamente en hasta otras 7 direcciones. block.overflow-gate.description = Un enrutador que solo saca por la izquierda y la derecha si la cinta del frente está llena. diff --git a/core/assets/bundles/bundle_et.properties b/core/assets/bundles/bundle_et.properties index 8bafae658a..adbd5393be 100644 --- a/core/assets/bundles/bundle_et.properties +++ b/core/assets/bundles/bundle_et.properties @@ -3,6 +3,7 @@ credits = Tegijad contributors = Tõlkijad ja panustajad discord = Liitu Mindustry Discordi serveriga! link.discord.description = Ametlik Discordi server +link.reddit.description = The Mindustry subreddit link.github.description = Mängu lähtekood link.changelog.description = Uuenduste nimekiri versioonide kaupa link.dev-builds.description = Arendusversioonide ajalugu @@ -26,6 +27,7 @@ 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 @@ -78,20 +80,25 @@ uploadingcontent = Sisu üleslaadimine uploadingpreviewfile = Eelvaate faili üleslaadimine committingchanges = Muudatuste teostamine done = Valmis -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. +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.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} @@ -263,6 +270,7 @@ missing = This item has been deleted or moved.\n[lightgray]The workshop listing 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} editor.brush = Pintsel editor.openin = Ava redaktoris editor.oregen = Maakide genereerimine @@ -501,6 +509,7 @@ blocks.shootrange = Ulatus blocks.size = Suurus blocks.liquidcapacity = Vedelike mahutavus blocks.powerrange = Energia ulatus +blocks.powerconnections = Max Connections blocks.poweruse = Energiatarve blocks.powerdamage = Energiatarve hävituspunkti kohta blocks.itemcapacity = Ressursside mahutavus @@ -522,6 +531,7 @@ blocks.reload = Lasku/s blocks.ammo = Laskemoon bar.drilltierreq = Nõuab paremat puuri bar.drillspeed = Puurimise kiirus: {0}/s +bar.pumpspeed = Pump Speed: {0}/s bar.efficiency = Kasutegur: {0}% bar.powerbalance = Bilanss: {0}/s bar.powerstored = Puhver: {0}/{1} @@ -566,6 +576,7 @@ category.shooting = Tulistamine category.optional = Valikulised täiustused setting.landscape.name = Lukusta horisontaalpaigutus setting.shadows.name = Varjud +setting.blockreplace.name = Automatic Block Suggestions setting.linear.name = Lineaarne tekstuurivastendus setting.hints.name = Hints setting.animatedwater.name = Animeeritud vesi @@ -588,6 +599,8 @@ setting.difficulty.insane = Hullumeelne setting.difficulty.name = Raskusaste: setting.screenshake.name = Ekraani värisemine setting.effects.name = Näita visuaalefekte +setting.destroyedblocks.name = Display Destroyed Blocks +setting.conveyorpathfinding.name = Conveyor Placement Pathfinding setting.sensitivity.name = Kontrolleri tundlikkus setting.saveinterval.name = Salvestamise intervall setting.seconds = {0} sekundit @@ -830,6 +843,8 @@ block.copper-wall.name = Vasksein block.copper-wall-large.name = Suur vasksein block.titanium-wall.name = Titaansein block.titanium-wall-large.name = Suur titaansein +block.plastanium-wall.name = Plastanium Wall +block.plastanium-wall-large.name = Large Plastanium Wall block.phase-wall.name = Faassein block.phase-wall-large.name = Suur faassein block.thorium-wall.name = Tooriumsein @@ -968,6 +983,7 @@ unit.lich.name = Tulihänd unit.reaper.name = Vanapagan tutorial.next = [lightgray] tutorial.intro = Alustasid[accent] Mindustry mänguõpetusega[].\n[accent]Tuumikust[] väljub sinu [accent]lendmehhaan Ahti[]. Alusta[accent] vase kaevandamisest[]. Selleks liigu tuumiku lähedal asuva vasemaagi juurde ja vajuta sellele.\n\n[accent]{0}/{1} vaske kaevandatud +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 = Käsitsi kaevandamine ei ole tõhus.\n[accent]Puurid []kaevandavad automaatselt.\nVajuta all paremas nurgas asuvale puuride nupule.\nVali[accent] harilik puur[]. Aseta üks puur vasemaagile, kasutades [accent]vasakut hiireklikki[].\n[accent]Parem hiireklikk[] peatab ehitamise. [accent]Hoia Ctrl-klahvi ja libista rullikut[], et suumida sisse ja välja. tutorial.drill.mobile = Käsitsi kaevandamine ei ole tõhus.\n[accent]Puurid []kaevandavad automaatselt.\nVajuta all paremas nurgas asuvale puuride nupule.\nVali[accent] harilik puur[].\nAseta üks puur vasemaagile, , vajutades sellele, ning seejärel vajuta allpool olevale[accent] linnukesele[] valiku kinnitamiseks.\nPaigutuse tühistamiseks vajuta [accent]"X"-nupule[]. tutorial.blockinfo = Igal konstruktsioonil on erinevad omadused. Iga puuriga on võimalik kaevandada vaid kindlaid maake.\nBloki teabe ja omaduste kuvamiseks vali see menüüst ning vajuta seejärel [accent]"?"-nupule.[]\n\n[accent]Vaata hariliku puuri omadusi.[] @@ -1051,6 +1067,8 @@ block.copper-wall.description = Odav kaitsekonstruktsioon.\nKasulik tuumiku ja k block.copper-wall-large.description = Odav kaitsekonstruktsioon.\nKasulik tuumiku ja kahurite kaitsmiseks esimeste lahingulainete ajal.\nUlatub üle mitme bloki. block.titanium-wall.description = Mõõdukalt tugev kaitsekonstruktsioon.\nPakub keskmist kaitset vaenlaste eest. block.titanium-wall-large.description = Mõõdukalt tugev kaitsekonstruktsioon.\nPakub keskmist kaitset vaenlaste eest.\nUlatub üle mitme bloki. +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.thorium-wall.description = Tugev kaitsekonstruktsioon.\nPakub head kaitset vaenlaste eest. block.thorium-wall-large.description = Tugev kaitsekonstruktsioon.\nPakub head kaitset vaenlaste eest.\nUlatub üle mitme bloki. block.phase-wall.description = Tugev kaitsekonstruktsioon, mis on kaetud erilise faaskangapõhise peegeldava ühendiga. Pakub kaitset peaaegu kõiki tüüpi kuulide ja mürskude eest. @@ -1070,7 +1088,7 @@ block.junction.description = Toimib kui sild samal tasapinnal ristuvate konveier block.bridge-conveyor.description = Spetsiaalne konveier, mis liigutab ressursse üle maastiku ja ehitiste kuni 3 bloki ulatuses. block.phase-conveyor.description = Täiustatud konveier, mis kasutab energiat ressursside teleportimiseks järgmise samasuguse konveierini üle mitme bloki. block.sorter.description = Sorteerib ressursse. Kui sisenev ressurss vastab valitud ressursile, siis liigub see otse edasi. Vastasel juhul väljastatakse ressurss vasakule või paremale. -block.inverted-sorter.descriptions = Processes items like a standard sorter, but outputs selected items to the sides instead. +block.inverted-sorter.description = Processes items like a standard sorter, but outputs selected items to the sides instead. block.router.description = Jaotab ressursse kuni kolmes väljuvas suunas võrdselt. Kasulik olukordades, kus ressursse on vaja korraga saata mitmesse kohta.\n\n[scarlet]Ära kasuta neid tootmismasinate sisendite kõrval, kuna väljund ummistab sisendi.[] block.distributor.description = Täiustatud jaotur, mis suunab ressursse kuni seitsmes väljuvas suunas võrdselt. block.overflow-gate.description = Eriline jaotur, mis väljastab vasakule ja paremale ainult siis, kui selle ees olev rada on blokeeritud. diff --git a/core/assets/bundles/bundle_eu.properties b/core/assets/bundles/bundle_eu.properties index 189574bd6d..81927de1c5 100644 --- a/core/assets/bundles/bundle_eu.properties +++ b/core/assets/bundles/bundle_eu.properties @@ -3,6 +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.github.description = Jolasaren iturburu kodea link.changelog.description = Eguneraketaren aldaketen zerrenda link.dev-builds.description = Garapen konpilazio ezegonkorrak @@ -26,6 +27,7 @@ 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 @@ -78,20 +80,25 @@ uploadingcontent = Edukia igotzen uploadingpreviewfile = Aurrebista fitxategia igotzen committingchanges = Aldaketak aplikatzen done = Egina -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. +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.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} @@ -263,6 +270,7 @@ missing = This item has been deleted or moved.\n[lightgray]The workshop listing 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} editor.brush = Brotxa editor.openin = Ireki editorean editor.oregen = Mea sorrera @@ -501,6 +509,7 @@ blocks.shootrange = Irismena blocks.size = Neurria blocks.liquidcapacity = Likido-edukiera blocks.powerrange = Energia irismena +blocks.powerconnections = Max Connections blocks.poweruse = Energia-erabilera blocks.powerdamage = Energia/Kaltea blocks.itemcapacity = Elementu-edukiera @@ -522,6 +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.efficiency = Eraginkortasuna: {0}% bar.powerbalance = Energia: {0}/s bar.powerstored = Bilduta: {0}/{1} @@ -566,6 +576,7 @@ category.shooting = Tirokatzea category.optional = Aukerako hobekuntzak setting.landscape.name = Blokeatu horizontalean setting.shadows.name = Itzalak +setting.blockreplace.name = Automatic Block Suggestions setting.linear.name = Iragazte lineala setting.hints.name = Hints setting.animatedwater.name = Animatutako ura @@ -588,6 +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.sensitivity.name = Kontrolagailuaren sentikortasuna setting.saveinterval.name = Gordetzeko tartea setting.seconds = {0} segundo @@ -830,6 +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.phase-wall.name = Fasezko horma block.phase-wall-large.name = Fasezko horma handia block.thorium-wall.name = Toriozko horma @@ -968,6 +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.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.[] @@ -1051,6 +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.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. @@ -1070,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.descriptions = Processes items like a standard sorter, but outputs selected items to the sides instead. +block.inverted-sorter.description = Processes items like a standard sorter, but outputs selected items to the sides instead. 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_fr.properties b/core/assets/bundles/bundle_fr.properties index 13ee4843d8..68f8ca7b64 100644 --- a/core/assets/bundles/bundle_fr.properties +++ b/core/assets/bundles/bundle_fr.properties @@ -18,14 +18,12 @@ 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 @@ -42,7 +40,6 @@ 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} @@ -50,7 +47,6 @@ 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}[]"? @@ -84,27 +80,30 @@ uploadingcontent = Publication du contenu uploadingpreviewfile = Publication du fichier d'aperçu committingchanges = Validation des modifications done = Fait - -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. +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 mods.none = [LIGHT_GRAY]Aucun mod trouvé! mods.guide = Guide de Modding mods.report = Signaler un Bug +mods.openfolder = Open Mod Folder 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.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 mod.requiresrestart = Le jeu va maintenant s'arrêter pour appliquer les modifications du mod. mod.reloadrequired = [scarlet]Rechargement requis mod.import = Importer un mod -mod.import.github = Importer un mod Github +mod.import.github = Importer un mod GitHub mod.remove.confirm = Ce mod sera supprimé. 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,7 +270,7 @@ missing = Cet élément a été supprimé ou déplacé.\n[lightgray]Le listing d 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 @@ -348,7 +347,6 @@ 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 @@ -363,7 +361,6 @@ 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 @@ -395,7 +392,6 @@ filter.option.floor2 = Sol secondaire filter.option.threshold2 = Seuil secondaire filter.option.radius = Rayon filter.option.percentile = Centile - width = Largeur: height = Hauteur: menu = Menu @@ -411,7 +407,6 @@ 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é @@ -442,7 +437,6 @@ 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. @@ -453,7 +447,6 @@ 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 @@ -468,7 +461,6 @@ 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. @@ -483,7 +475,6 @@ 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 @@ -518,6 +509,7 @@ blocks.shootrange = Portée blocks.size = Taille blocks.liquidcapacity = Capacité liquide blocks.powerrange = Portée électrique +blocks.powerconnections = Nombre maximal de connections blocks.poweruse = Énergie utilisée blocks.powerdamage = Énergie/Dégâts blocks.itemcapacity = Stockage @@ -537,9 +529,9 @@ 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.efficiency = Efficacité: {0}% bar.powerbalance = Énergie: {0}/s bar.powerstored = Stocké: {0}/{1} @@ -552,7 +544,6 @@ bar.heat = Chaleur bar.power = Énergie bar.progress = Progression de la construction bar.spawned = Unités: {0}/{1} - 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 @@ -564,7 +555,6 @@ 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 @@ -586,6 +576,7 @@ 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.linear.name = Filtrage Linéaire setting.hints.name = Astuces setting.animatedwater.name = Eau animée @@ -608,6 +599,8 @@ 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.sensitivity.name = Sensibilité de la manette setting.saveinterval.name = Intervalle des sauvegardes auto setting.seconds = {0} secondes @@ -688,7 +681,6 @@ 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.wavetimer = Minuterie pour les vagues rules.waves = Vagues @@ -715,7 +707,6 @@ rules.title.resourcesbuilding = Ressources & Construction rules.title.player = Joueurs rules.title.enemy = Ennemis rules.title.unit = Unités - content.item.name = Objets content.liquid.name = Liquides content.unit.name = Unités @@ -777,7 +768,6 @@ 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 @@ -853,10 +843,12 @@ block.copper-wall.name = Mur de Cuivre block.copper-wall-large.name = Grand Mur de Cuivre block.titanium-wall.name = Mur de Titane block.titanium-wall-large.name = Grand Mur de Titane +block.plastanium-wall.name = Mur de Plastanium +block.plastanium-wall-large.name = Grand Mur de Plastanium block.phase-wall.name = Mur phasé -block.phase-wall-large.name = Grand mur phasé -block.thorium-wall.name = Mur en Thorium -block.thorium-wall-large.name = Mur en Thorium large +block.phase-wall-large.name = Grand Mur phasé +block.thorium-wall.name = Mur de Thorium +block.thorium-wall-large.name = Grand Mur de Thorium block.door.name = Porte block.door-large.name = Grande Porte block.duo.name = Duo @@ -990,7 +982,8 @@ 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.[]\nCommence en minant du [accent]cuivre[]. Pour cela, appuyez sur une veine de minerai de cuivre près de votre noyau.\n\n[accent]{0}/{1} cuivre +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.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. tutorial.blockinfo = Chaque bloc a des statistiques différentes. Chaque foreuse ne peut miner que certains minerais.\nPour vérifier les informations et les statistiques d'un bloc, appuyez sur le [accent]bouton "?" tout en le sélectionnant dans le menu de construction.[]\n\n[accent]Maintenant, accédez aux statistiques de la foreuse mécanique.[] @@ -1009,7 +1002,6 @@ 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. @@ -1075,6 +1067,8 @@ block.copper-wall.description = Un bloc défensif à faible coût.\nUtile pour p block.copper-wall-large.description = Un bloc défensif à faible coût.\nUtile pour protéger la base et les tourelles dans les premières lors des premières vagues.\n2 x 2. block.titanium-wall.description = Un bloc défensif standard.\nProcure une protection modérée contre les ennemis. block.titanium-wall-large.description = Un bloc défensif standard.\nProcure une protection modérée contre les ennemis.\nCouvre plusieurs cases. +block.plastanium-wall.description = Un mur spécial qui absorbe les arcs éléctriques et bloque les connections automatiques des transmetteurs énergétiques. +block.plastanium-wall-large.description = Un mur spécial qui absorbe les arcs éléctriques et bloque les connections automatiques des transmetteurs énergétiques.\nCouvre plusieurs cases. block.thorium-wall.description = Un bloc défensif puissant.\nProcure une très bonne protection contre les ennemis. block.thorium-wall-large.description = Un bloc défensif puissant.\nProcure une très bonne protection contre les ennemis.\nCouvre plusieurs cases. block.phase-wall.description = Moins puissant qu'un mur en Thorium mais déviera les balles sauf si elles sont trop puissantes. diff --git a/core/assets/bundles/bundle_fr_BE.properties b/core/assets/bundles/bundle_fr_BE.properties index fce9241eda..52e9efb2c2 100644 --- a/core/assets/bundles/bundle_fr_BE.properties +++ b/core/assets/bundles/bundle_fr_BE.properties @@ -3,6 +3,7 @@ credits = Crédits contributors = Traducteurs et contributeurs discord = Rejoignez le discord de Mindustry ! link.discord.description = Le discord officiel de Mindustry +link.reddit.description = The Mindustry subreddit link.github.description = Code source du jeu link.changelog.description = Liste des mises à jour link.dev-builds.description = Versions instables de développement @@ -26,6 +27,7 @@ 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 @@ -78,20 +80,25 @@ uploadingcontent = Uploading Content uploadingpreviewfile = Uploading Preview File committingchanges = Comitting Changes done = Done -mods.alphainfo = Keep in mind that mods are in alpha, and[scarlet] may be very buggy[].\nReport any issues you find to the Mindustry Github or Discord. +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.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} @@ -263,6 +270,7 @@ missing = This item has been deleted or moved.\n[lightgray]The workshop listing 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} editor.brush = Pinceau editor.openin = Ouvrir dans l'éditeur editor.oregen = Génération des minerais @@ -501,6 +509,7 @@ blocks.shootrange = Portée blocks.size = Taille blocks.liquidcapacity = Capacité en liquide blocks.powerrange = Distance de transmission +blocks.powerconnections = Max Connections blocks.poweruse = Énergie utilisée blocks.powerdamage = Énergie/Dégâts blocks.itemcapacity = Stockage @@ -522,6 +531,7 @@ blocks.reload = Tirs/Seconde blocks.ammo = Munition bar.drilltierreq = Better Drill Required bar.drillspeed = Vitesse de forage: {0}/s +bar.pumpspeed = Pump Speed: {0}/s bar.efficiency = Efficacité: {0}% bar.powerbalance = Énergie: {0} bar.powerstored = Stored: {0}/{1} @@ -566,6 +576,7 @@ category.shooting = Défense category.optional = Améliorations facultatives setting.landscape.name = Verrouiller la rotation en mode paysage setting.shadows.name = Ombres +setting.blockreplace.name = Automatic Block Suggestions setting.linear.name = Filtrage linéaire setting.hints.name = Hints setting.animatedwater.name = Eau animée @@ -588,6 +599,8 @@ setting.difficulty.insane = Êxtreme setting.difficulty.name = Difficulté: setting.screenshake.name = Tremblement d'écran setting.effects.name = Montrer les effets +setting.destroyedblocks.name = Display Destroyed Blocks +setting.conveyorpathfinding.name = Conveyor Placement Pathfinding setting.sensitivity.name = Contôle de la sensibilité setting.saveinterval.name = Intervalle des sauvegardes auto setting.seconds = {0} Secondes @@ -830,6 +843,8 @@ block.copper-wall.name = Mur de cuivre block.copper-wall-large.name = Grand mur de cuivre block.titanium-wall.name = Mur de titane block.titanium-wall-large.name = Grand mur de titane +block.plastanium-wall.name = Plastanium Wall +block.plastanium-wall-large.name = Large Plastanium Wall block.phase-wall.name = Mur phasé block.phase-wall-large.name = Grand mur phasé block.thorium-wall.name = Mur en thorium @@ -968,6 +983,7 @@ unit.lich.name = Lich unit.reaper.name = Reaper tutorial.next = [lightgray] tutorial.intro = Vous êtes entré dans le[scarlet] Tutoriel de Mindustry.[]\nCommencez par[accent] miner du cuivre[]. Appuyez ou cliquez sur une veine de minerai de cuivre près de votre base pour commencer à miner.\n\n[accent]{0}/{1} cuivre +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 = Le minage manuel est inefficace.\n[accent]Des foreuses[]peuvent miner automatiquement.\nPlacez-en une sur un filon de cuivre. tutorial.drill.mobile = Le minage manuel est inefficace.\n[accent]Des foreuses[]peuvent miner automatiquement.\nAppuyez sur l'onglet de forage en bas à droite.\nSélectionnez la[accent] perceuse mécanique[].\nPlacez-la sur une veine de cuivre, puis appuyez sur la[accent] coche(V)[] ci-dessous pour confirmer votre sélection.\nAppuyez sur le [accent] bouton X[]pour annuler le placement. tutorial.blockinfo = Chaque bloc a des statistiques différentes. Chaque foreuse ne peut extraire que certains minerais.\nPour vérifier les informations et les statistiques d'un bloc,[accent] tapez sur le "?" tout en le sélectionnant dans le menu de compilation.[]\n\n[accent]Accédez aux statistiques de la foreuse mécanique maintenant.[] @@ -1051,6 +1067,8 @@ block.copper-wall.description = Un bloc défensif bon marché.\nUtile pour prot block.copper-wall-large.description = Un bloc défensif bon marché.\nUtile pour protéger le noyau et les tourelles lors des premières vagues.\nS'étend sur plusieurs tuiles. block.titanium-wall.description = Un bloc défensif modérément fort.\nFournit une protection modérée contre les ennemis. block.titanium-wall-large.description = Un bloc défensif modérément fort.\nFournit une protection modérée contre les ennemis.\nS'étend sur plusieurs tuiles. +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.thorium-wall.description = Un puissant bloc défensif.\nBonne protection contre les ennemis. block.thorium-wall-large.description = Un puissant bloc défensif.\nBonne protection contre les ennemis.\nS'étend sur plusieurs tuiles. block.phase-wall.description = Pas aussi fort qu'un mur de thorium, mais détournera les balles à moins qu'elles ne soient trop puissantes. @@ -1070,7 +1088,7 @@ block.junction.description = Agit comme un pont pour deux bandes transporteuses block.bridge-conveyor.description = Bloc de transport d'articles avancé. Permet de transporter des objets sur plus de 3 tuiles de n'importe quel terrain ou bâtiment. block.phase-conveyor.description = Bloc de transport d'articles avancé.\nUtilise le pouvoir de téléporter des articles vers un convoyeur de phase connecté sur plusieurs carreaux. 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.descriptions = Processes items like a standard sorter, but outputs selected items to the sides instead. +block.inverted-sorter.description = Processes items like a standard sorter, but outputs selected items to the sides instead. block.router.description = Accepte les éléments d'une direction et les envoie dans 3 autres directions de manière égale. Utile pour séparer les matériaux d'une source en plusieurs cibles. block.distributor.description = Un routeur avancé qui divise les articles en 7 autres directions de manière égale. [scarlet]Seule et unique ![] 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é. diff --git a/core/assets/bundles/bundle_in_ID.properties b/core/assets/bundles/bundle_in_ID.properties index a79ccbb1e7..1f253e9698 100644 --- a/core/assets/bundles/bundle_in_ID.properties +++ b/core/assets/bundles/bundle_in_ID.properties @@ -3,6 +3,7 @@ credits = Kredit contributors = Translator dan Kontributor discord = Bergabung di Discord Mindustry! link.discord.description = Discord Mindustry resmi +link.reddit.description = The Mindustry subreddit link.github.description = Sumber kode permainan link.changelog.description = Daftar rekam pembaruan link.dev-builds.description = Bentuk pengembangan (kurang stabil) @@ -26,6 +27,7 @@ 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 @@ -78,20 +80,25 @@ uploadingcontent = Mengupload Content uploadingpreviewfile = Mengupload File Tinjauan committingchanges = Membuat Perubahan done = Selesai -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. +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.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} @@ -263,6 +270,7 @@ missing = This item has been deleted or moved.\n[lightgray]The workshop listing 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} editor.brush = Kuas editor.openin = Buka di Penyunting editor.oregen = Generasi Sumber Daya @@ -501,6 +509,7 @@ blocks.shootrange = Jarak blocks.size = Ukuran blocks.liquidcapacity = Kapasitas Zat Cair blocks.powerrange = Jarak Tenaga +blocks.powerconnections = Max Connections blocks.poweruse = Penggunaan Tenaga blocks.powerdamage = Tenaga/Pukulan blocks.itemcapacity = Kapasitas Item @@ -522,6 +531,7 @@ blocks.reload = Tembakan/Detik blocks.ammo = Amunisi bar.drilltierreq = Better Drill Required bar.drillspeed = Kecepatan Bor: {0}/s +bar.pumpspeed = Pump Speed: {0}/s bar.efficiency = Daya Guna: {0}% bar.powerbalance = Tenaga: {0}/s bar.powerstored = Stored: {0}/{1} @@ -566,6 +576,7 @@ category.shooting = Menembak category.optional = Peningkatan Opsional setting.landscape.name = Kunci Pemandangan setting.shadows.name = Bayangan +setting.blockreplace.name = Automatic Block Suggestions setting.linear.name = Linier Filter setting.hints.name = Hints setting.animatedwater.name = Animasi Air @@ -588,6 +599,8 @@ setting.difficulty.insane = Gila! setting.difficulty.name = Tingkat Kesulitan: setting.screenshake.name = Layar Getar setting.effects.name = Munculkan Efek +setting.destroyedblocks.name = Display Destroyed Blocks +setting.conveyorpathfinding.name = Conveyor Placement Pathfinding setting.sensitivity.name = Sensitivitas Kontroler setting.saveinterval.name = Jarak Menyimpan setting.seconds = {0} Detik @@ -830,6 +843,8 @@ block.copper-wall.name = Dinding Tembaga block.copper-wall-large.name = Dinding Tembaga Besar block.titanium-wall.name = Dinding Titanium block.titanium-wall-large.name = Dinding Titanium Besar +block.plastanium-wall.name = Plastanium Wall +block.plastanium-wall-large.name = Large Plastanium Wall block.phase-wall.name = Dinding Phase block.phase-wall-large.name = Dinding Phase Besar block.thorium-wall.name = Dinding Thorium @@ -968,6 +983,7 @@ unit.lich.name = Lich unit.reaper.name = Maut 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.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 = Menambang manual tidak efisien.\n[accent]Bor []bisa menambang otomatis.\nTaruh satu di sekumpulan tembaga. 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.[] @@ -1051,6 +1067,8 @@ block.copper-wall.description = Blok pelindung murah.\nBerguna untuk melindungi block.copper-wall-large.description = Blok pelindung murah.\nBerguna untuk melindungi inti dan menara di beberapa gelombang awal.\nSebesar 4 blok. 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.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.thorium-wall.description = Blok pelindung yang kuat.\npelindung bagus dari musuh. block.thorium-wall-large.description = Blok pelindung yang kuat.\npelindung bagus dari musuh.\nSebesar 4 blok. block.phase-wall.description = Tidak sekuat dinding thorium tetapi akan memantulkan peluru senjata jika tidak terlalu kuat. @@ -1070,7 +1088,7 @@ block.junction.description = Berguna seperti jembatan untuk dua pengantar yang b block.bridge-conveyor.description = Blok Transportasi Item Canggih. bisa memindahkan item hingga 3 blok panjang melewati apapun lapangan atau bangunan. block.phase-conveyor.description = Blok transportasi canggih. Menggunakan tenaga untuk teleportasi item ke sambungan pengantar phase melewati beberapa blok. block.sorter.description = Memilah Item. Jika item cocok dengan seleksi, itemnya diperbolehkan lewat. Jika Tidak, item akan dikeluarkan dari kiri dan/atau kanan. -block.inverted-sorter.descriptions = Processes items like a standard sorter, but outputs selected items to the sides instead. +block.inverted-sorter.description = Processes items like a standard sorter, but outputs selected items to the sides instead. block.router.description = Menerima bahan dari satu arah dan mengeluarkannya ke 3 arah yang sama. Bisa juga menyimpan sejumlah bahan. Berguna untuk memisahkan bahan dari satu sumber ke target yang banyak. block.distributor.description = Pemisah canggih yang memisah item ke 7 arah berbeda bersamaan. block.overflow-gate.description = Kombinasi antara pemisah dan penyortir yang hanya mengeluarkan item ke kiri dan/atau ke kanan jika bagian depan tertutup. diff --git a/core/assets/bundles/bundle_it.properties b/core/assets/bundles/bundle_it.properties index c36291d758..d1f19ae8b1 100644 --- a/core/assets/bundles/bundle_it.properties +++ b/core/assets/bundles/bundle_it.properties @@ -3,6 +3,7 @@ credits = Crediti contributors = Traduttori e Contributori 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 @@ -26,6 +27,7 @@ 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... schematic.exportfile = Esporta file schematic.importfile = Importa File @@ -78,26 +80,30 @@ uploadingcontent = Carico il contenuto uploadingpreviewfile = Carico file di anteprima committingchanges = Applico le modifiche done = Fatto -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 = 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. 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 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.enable = Abilita mod.requiresrestart = . mod.reloadrequired = [scarlet]Riavvio necessario mod.import = Importa una mod -mod.import.github = Import Github 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 -. about.button = Info name = Nome: noname = Scegli un [accent] nome[] prima di unirti. @@ -264,6 +270,7 @@ missing = This item has been deleted or moved.\n[lightgray]The workshop listing 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} editor.brush = Pennello editor.openin = Apri nell'editor editor.oregen = Generazione dei minerali @@ -502,6 +509,7 @@ blocks.shootrange = Raggio blocks.size = Grandezza blocks.liquidcapacity = Capacità del liquido blocks.powerrange = Raggio Energia +blocks.powerconnections = Max Connections blocks.poweruse = Utilizzo energia blocks.powerdamage = Energia/Danno blocks.itemcapacity = Capacità @@ -523,6 +531,7 @@ blocks.reload = Ricarica blocks.ammo = Munizioni bar.drilltierreq = Miglior trivella richiesta bar.drillspeed = Velocità scavo: {0}/s +bar.pumpspeed = Pump Speed: {0}/s bar.efficiency = Efficienza: {0}% bar.powerbalance = Energia: {0} bar.powerstored = Stored: {0}/{1} @@ -567,6 +576,7 @@ category.shooting = Potenza di fuoco category.optional = Miglioramenti Opzionali 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 @@ -589,6 +599,8 @@ 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.conveyorpathfinding.name = Conveyor Placement Pathfinding setting.sensitivity.name = Sensibilità del controller setting.saveinterval.name = Intervallo di salvataggio automatico setting.seconds = {0} Secondi @@ -831,6 +843,8 @@ 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 @@ -969,6 +983,7 @@ 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.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. [] @@ -1052,6 +1067,8 @@ block.copper-wall.description = Un blocco difensivo economico.\nUtile per proteg block.copper-wall-large.description = Un blocco difensivo economico.\nUtile per proteggere il nucleo e le torrette nelle prime ondate. \nOccupa più blocchi 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.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. @@ -1071,7 +1088,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.descriptions = Processes items like a standard sorter, but outputs selected items to the sides instead. +block.inverted-sorter.description = Processes items like a standard sorter, but outputs selected items to the sides instead. 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. diff --git a/core/assets/bundles/bundle_ja.properties b/core/assets/bundles/bundle_ja.properties index 6239dad8b0..14a3e7e066 100644 --- a/core/assets/bundles/bundle_ja.properties +++ b/core/assets/bundles/bundle_ja.properties @@ -3,6 +3,7 @@ credits = クレジット contributors = 翻訳や開発に協力してくださった方々 discord = MindustryのDiscordに参加! link.discord.description = Mindustryの公式Discordグループ +link.reddit.description = The Mindustry subreddit link.github.description = このゲームのソースコード link.changelog.description = 変更履歴 link.dev-builds.description = 不安定な開発版 @@ -26,6 +27,7 @@ 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 @@ -78,25 +80,30 @@ uploadingcontent = コンテンツをアップロードしています uploadingpreviewfile = プレビューファイルをアップロードしています committingchanges = 変更を適応中 done = 完了 -mods.alphainfo = モードは実験的です,覚えておいてください。 [scarlet] エラーが含まれている可能性があります[]。\n 発見した問題をMindustry Githubに報告してください. +feature.unsupported = Your device does not support this feature. +mods.alphainfo = Mods機能は実験的なものです。[scarlet] エラーが含まれている可能性があります[]。\n 発見した問題をMindustry GitHubに報告してください。 mods.alpha = [accent](Alpha) mods = Mods -mods.none = [LIGHT_GRAY]MOD見つかりませんでした! +mods.none = [LIGHT_GRAY]Modが見つかりませんでした! mods.guide = Modding Guide mods.report = Report Bug -mod.enabled = [lightgray]Enabled -mod.disabled = [scarlet]Disabled -mod.disable = 可能にしません -mod.enable = 可能にする -mod.requiresrestart = このモードをインストールするため, このゲームは再起動します -mod.reloadrequired = [scarlet]リロード必須 -mod.import = モードをインポート -mod.import.github = Import Github Mod -mod.remove.confirm = このモードを削除されます +mods.openfolder = Open Mod Folder +mod.enabled = [lightgray]有効 +mod.disabled = [scarlet]無効 +mod.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 = 有効化 +mod.requiresrestart = このModをインストールするためにはゲームの再起動が必要です。 +mod.reloadrequired = [scarlet]Modを有効にするには、この画面を開き直してください。 +mod.import = Modをインポート +mod.import.github = Import GitHub Mod +mod.remove.confirm = このModを削除します。 mod.author = [LIGHT_GRAY]著者:[] {0} -mod.missing = このセーブ には、アップグレードされた可能性があるMODS、またはここに存在しないMODSが必要です。 メモリのセーブを保存する! ロードしてもよろしいですか?\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.missing = このセーブには、アップグレードされた可能性があるModsか、ここに存在しないModsが必要です。 メモリのセーブを保存する! ロードしてもよろしいですか?\n[lightgray]MODS:\n{0} +mod.preview.missing = このModをワークショップで公開するには、Modのプレビュー画像を設定する必要があります。\n[accent] preview.png[] というファイル名の画像をmodsのフォルダに配置し、再試行してください。 +mod.folder.missing = ワークショップで公開できるのは、フォルダ形式のModのみとなります。\nModをフォルダ形式に変換するには、ファイルをフォルダに解凍し、古いzipを削除してからゲームを再起動するか、modを再読み込みしてください。 about.button = 情報 name = 名前: noname = [accent]プレイヤー名[]を入力してください。 @@ -263,6 +270,7 @@ missing = This item has been deleted or moved.\n[lightgray]The workshop listing 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} editor.brush = ブラシ editor.openin = エディターで開く editor.oregen = 鉱石の生成 @@ -501,6 +509,7 @@ blocks.shootrange = 範囲 blocks.size = 大きさ blocks.liquidcapacity = 液体容量 blocks.powerrange = 電力範囲 +blocks.powerconnections = Max Connections blocks.poweruse = 電力使用量 blocks.powerdamage = 電力/ダメージ blocks.itemcapacity = アイテム容量 @@ -522,6 +531,7 @@ blocks.reload = ショット/秒 blocks.ammo = 弾薬 bar.drilltierreq = より良いドリルが必要です bar.drillspeed = 採掘速度: {0}/秒 +bar.pumpspeed = Pump Speed: {0}/s bar.efficiency = 効率: {0}% bar.powerbalance = 電力: {0}/秒 bar.powerstored = Stored: {0}/{1} @@ -566,6 +576,7 @@ category.shooting = ショット category.optional = 強化オプション setting.landscape.name = 横画面で固定 setting.shadows.name = 影 +setting.blockreplace.name = Automatic Block Suggestions setting.linear.name = リニアフィルター setting.hints.name = Hints setting.animatedwater.name = 水のアニメーション @@ -588,6 +599,8 @@ 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.sensitivity.name = 操作感度 setting.saveinterval.name = 自動保存間隔 setting.seconds = {0} 秒 @@ -830,6 +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.phase-wall.name = フェーズファイバーの壁 block.phase-wall-large.name = 巨大なフェーズファイバーの壁 block.thorium-wall.name = トリウムの壁 @@ -968,6 +983,7 @@ unit.lich.name = リッチ unit.reaper.name = リーパー tutorial.next = [lightgray]<タップして続ける> tutorial.intro = [scarlet]Mindustry チュートリアル[]へようこそ。\nまずは、コアの近くにある銅鉱石をタップして、[accent]銅を採掘[]してみましょう。\n\n[accent]銅: {0}/{1} +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 = 手動で採掘するのは非効率的です。\n[accent]ドリル[]を使えば自動で採掘できます。\n右下にあるドリルのタブをクリックして、\n[accent]機械ドリル[]を選択して、銅鉱脈に設置してみましょう。\n[accent]右クリック[]で建設を止めることができ、[accent]Ctrlキーを押しながらスクロール[]することで、ズームができます。 tutorial.drill.mobile = 手動で採掘するのは非効率的です。\n[accent]ドリル[]を使えば自動で採掘できます。\n右下にあるドリルのタブをタップして、\n[accent]機械ドリル[]を選択しましょう。\nタップでドリルを銅鉱脈に配置したら、下にある[accent]チェックマーク[]を押すことで、建設が開始されます。\n[accent]X ボタン[]で建設をキャンセルできます。 tutorial.blockinfo = それぞれのブロックには異なる性質があります。特定のドリルでしか採掘できない鉱石もあります。\nブロックの情報や性質を知りたかったら、[accent]ビルドメニューにある "?" ボタンを押してください。[]\n\n[accent]機械ドリルの性質を見てみましょう。[] @@ -1051,6 +1067,8 @@ block.copper-wall.description = 安価な防壁ブロックです。\n最初の block.copper-wall-large.description = 安価な大型防壁ブロックです。\n最初のウェーブでコアやターレットを保護するのに有用です。 block.titanium-wall.description = 適度に強力な防壁ブロックです。\n中程度の攻撃から保護します。 block.titanium-wall-large.description = 適度に強力な大型防壁ブロックです。\n中程度の攻撃から保護します。 +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.thorium-wall.description = 強化された防壁ブロックです。\n敵からの保護により強固です。 block.thorium-wall-large.description = 強化された大型防壁ブロックです。\n敵からの保護により強固です。 block.phase-wall.description = トリウムの壁ほど強固ではないが、強力な弾でなければ弾き返すことができます。 @@ -1070,7 +1088,7 @@ block.junction.description = 十字に交差したコンベアーをそれぞれ block.bridge-conveyor.description = 高度な輸送ブロックです。地形や建物を超えて、3ブロック離れた場所にアイテムを輸送することができます。 block.phase-conveyor.description = 改良されたアイテム転送ブロックです。電力を使用して、離れた場所にあるフェーズコンベアーにアイテムを転送することができます。 block.sorter.description = アイテムを分別して搬出します。設定したアイテムは通過させます。他のアイテムが搬入されると側面にアイテムを搬出します。 -block.inverted-sorter.descriptions = Processes items like a standard sorter, but outputs selected items to the sides instead. +block.inverted-sorter.description = Processes items like a standard sorter, but outputs selected items to the sides instead. 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 2f0e7cc3d1..51ef110c8f 100644 --- a/core/assets/bundles/bundle_ko.properties +++ b/core/assets/bundles/bundle_ko.properties @@ -1,6 +1,6 @@ credits.text = 제작자 [ROYAL]Anuken[] - [SKY]anukendev@gmail.com[] / [scarlet]한국어 번역자[] - [royal]Potion[] credits = 제작자 -contributors = 번역 및 기여자들 +contributors = 번역 및 개발 기여자들 discord = Mindustry Discord 에 참여해보세요! link.discord.description = 공식 Mindustry Discord 서버 link.reddit.description = Mindustry 레딧 @@ -18,14 +18,12 @@ gameover = 게임 오버 gameover.pvp = [accent]{0}[] 팀이 승리했습니다! highscore = [accent]최고점수 달성! copied = 복사됨. - load.sound = 소리 load.map = 맵 load.image = 사진 load.content = 컨텐츠 load.system = 시스템 load.mod = 모드 - schematic = 설계도 schematic.add = 설계도 저장하기 schematics = 설계도 모음 @@ -41,8 +39,7 @@ schematic.flip = 좌우 뒤집기 :[accent][[{0}][] / 상하 뒤집기 : [accent schematic.saved = 설계도 저장됨. schematic.delete.confirm = 삭제된 설계도는 복구할 수 없습니다. 정말로 삭제하시겠습니까? schematic.rename = 설계도명 변경 -schematic.info = 크기 : {0}x{1}, 사용된 블럭 : {2} - +schematic.info = 크기 : {0}x{1}, 블럭 수 : {2} stat.wave = 버틴 단계 수 : [accent]{0} stat.enemiesDestroyed = 파괴한 적 수 : [accent]{0} stat.built = 건설한 건물 수 : [accent]{0} @@ -50,7 +47,6 @@ stat.destroyed = 파괴된 건물 수 : [accent]{0} stat.deconstructed = 파괴한 건물 수 : [accent]{0} stat.delivered = 획득한 자원 : stat.rank = 최종 점수 : [accent]{0} - launcheditems = [accent]창고 launchinfo = [출격되지 않음][[출격]파랑색으로 표시된 자원들을 획득합니다. map.delete = 정말로 "[accent]{0}[]" 맵을 삭제하시겠습니까? @@ -84,27 +80,30 @@ uploadingcontent = 컨텐츠 업로드 uploadingpreviewfile = 미리보기 파일 업로드 committingchanges = 바뀐 점 적용 done = 완료 - +feature.unsupported = 당신의 기기는 이 기능을 지원하지 않습니다. mods.alphainfo = 현재의 모드는 첫 번째 시도이며, 그리고[scarlet] 버그가 매우 많음을 명심하십시오[].\n만약 버그를 발견할경우 Mindustry 깃허브 또는 디스코드로 제보해주세요. mods.alpha = [scarlet](Alpha) mods = 모드 -mods.none = [LIGHT_GRAY]모드가 발견되지 않았습니다! +mods.none = [LIGHT_GRAY]추가한 모드가 없습니다! mods.guide = 모드 가이드 mods.report = 버그 신고 -mod.enabled = [lightgray]활성화 -mod.disabled = [scarlet]비활성화 +mods.openfolder = Open Mod Folder +mod.enabled = [firebrick]활성화 +mod.disabled = [lightgray]비활성화 mod.disable = 비활성화 +mod.delete.error = 모드를 삭제할 수 없습니다. 아마도 해당 모드가 사용중인 것 같습니다. +mod.missingdependencies = [scarlet]의존되는 모드: {0} +mod.nowdisabled = [scarlet]모드 '{0}'는 다음의 모드에 의존합니다 :[accent] {1}\n[lightgray]이 모드를 먼저 다운로드해야합니다.\n이 모드는 자동으로 비활성화됩니다. mod.enable = 활성화 mod.requiresrestart = 모드 변경사항을 적용하기 위해 게임을 종료합니다. -mod.reloadrequired = [scarlet]새로고침 요구됨 +mod.reloadrequired = [scarlet]새로고침 예정됨 mod.import = 모드 추가 mod.import.github = 깃허브 모드 추가 -mod.remove.confirm = 모드가 삭제되었습니다. +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모드를 폴더 형태로 바꾸려면 파일을 폴더에 압축 해제하고 이전 압축파일을 제거한 후, 게임을 재시작하거나 모드를 다시 로드하십시오. - about.button = 정보 name = 이름 : noname = 먼저 [accent] [] 을 설정하세요. @@ -135,7 +134,7 @@ server.kicked.customClient = 이 서버는 직접 빌드한 버전을 지원하 server.kicked.gameover = 코어가 파괴되었습니다... server.versions = 클라이언트 버전 : [accent] {0}[]\n서버 버전 : [accent] {1}[] host.info = [accent]호스트[] 버튼은 현재 네트워크의 [scarlet]6567[] 포트를 사용합니다.\n[LIGHT_GRAY]같은 Wi-Fi 또는 로컬 네트워크[] 에서 서버 목록을 볼 수 있습니다.\n\n만약 플레이어들이 이 IP를 통해 어디에서나 연결할 수 있게 하고 싶다면, 공유기 설정에서 [accent]포트 포워딩[]을 하시거나 VPN을 사용하셔야 합니다.\n\n[LIGHT_GRAY]참고: LAN 게임 연결에 문제가 있는 사람이 있다면, 방화벽 설정에서 Mindustry 가 로컬 네트워크에 액세스하도록 허용했는지 확인해주세요. -join.info = 여기서 서버 추가를 누르신 후, [accent]서버 IP[]를 입력하여 다른 서버에 접속할 수 있습니다.\n또는 [accent]로컬 네트워크(LAN)[] 서버를 검색하여 접속할 수 있습니다.\nLAN 및 WAN 멀티 플레이어 모두 지원합니다.\n\n[LIGHT_GRAY]참고:여기에서는 자동으로 글로벌 서버를 추가하지 않습니다. IP로 다른 사람의 서버에 접속하려면 직접 서버 주소를 찾아서 적으셔야합니다.[]\n\n[ROYAL]한국의 서버로는 [accent]mindustry.kr[]의 (포트없음), 6568포트와 server1.mindustry.r-e.kr의 8000, 8002 포트가 있습니다.\n서버 주소 입력방법은 < 주소:포트 >의 형식입니다.\n[royal]포트가 없을 시에는 그냥 주소만 입력하시면 됩니다. +join.info = 여기서 서버 추가를 누르신 후, [accent]서버 IP[]를 입력하여 다른 서버에 접속할 수 있습니다.\n또는 [accent]로컬 네트워크(LAN)[] 서버를 검색하여 접속할 수 있습니다.\nLAN 및 WAN 멀티 플레이어 모두 지원합니다.\n\n[LIGHT_GRAY]참고:여기에서는 자동으로 글로벌 서버를 추가하지 않습니다. IP로 다른 사람의 서버에 접속하려면 직접 서버 주소를 찾아서 적으셔야합니다.[]\n\n[ROYAL]한국의 서버로는 [accent]mindustry.kr[]의 6567, 6568포트와 [accent]server1.mindustry.r-e.kr[]의 8000, 8002 포트가 있습니다.\n서버 주소 입력방법은 < 주소:포트 >의 형식입니다.\n[royal]포트가 없을 시에는 그냥 주소만 입력하시면 됩니다.\n\n[royal]예시) mindustry.kr의 6567포트\nmindustry.kr:6567\n포트가 6567일 경우에는 :6567을 생략할 수 있습니다. hostserver = 서버 열기 invitefriends = 친구 초대 hostserver.mobile = 서버\n열기 @@ -247,8 +246,8 @@ wave.waiting = [green]{0}초[]후 다음 단계 시작 wave.waveInProgress = [LIGHT_GRAY]단계 진행중 waiting = [LIGHT_GRAY]대기중... waiting.players = 다른 플레이어를 기다리는 중.. -wave.enemies = [LIGHT_GRAY]적 유닛{0} 마리 남았음 -wave.enemy = [LIGHT_GRAY]적 유닛{0} 마리 남음 +wave.enemies = [LIGHT_GRAY]적 유닛 {0}마리 남았음 +wave.enemy = [LIGHT_GRAY]적 유닛 {0}마리 남음 loadimage = 사진 불러오기 saveimage = 사진 저장 unknown = 알 수 없음 @@ -271,7 +270,7 @@ missing = 이 항목은 삭제되거나 이동되었습니다.\n[lightgray]워 publishing = [accent]업로드 중... publish.confirm = 맵을 업로드 하시겠습니까?\n\n[lightgray]먼저 워크샵 EULA에 동의하시지 않으면 맵이 표시되지 않습니다! publish.error = 맵 업로드 오류 : {0} - +steam.error = 스팀 서비스를 초기화하는데 실패했습니다.\n에러 코드 : {0} editor.brush = 브러쉬 editor.openin = 편집기 열기 editor.oregen = 광물 무작위 생성 @@ -348,7 +347,6 @@ editor.overwrite = [accept]경고!이 명령은 기존 맵을 덮어씌우게 editor.overwrite.confirm = [scarlet]경고![] 이 이름을 가진 맵이 이미 있습니다. 덮어 쓰시겠습니까? editor.exists = 같은 이름의 맵이 이미 존재합니다. editor.selectmap = 불러올 맵 선택 : - toolmode.replace = 재배치 toolmode.replace.description = 블록을 배치합니다. toolmode.replaceall = 모두 재배치 @@ -363,7 +361,6 @@ toolmode.fillteams = 팀 채우기 toolmode.fillteams.description = 블록 대신 팀 건물로 채웁니다. toolmode.drawteams = 팀 그리기 toolmode.drawteams.description = 블록 대신 팀 건물을 배치합니다. - filters.empty = [LIGHT_GRAY]필터가 없습니다!! 아래 버튼을 눌러 추가하세요. filter.distort = 왜곡 filter.noise = 맵 전체에 타일 혹은 블럭 뿌리기 @@ -395,7 +392,6 @@ filter.option.floor2 = 2번째 바닥 filter.option.threshold2 = 2번째 한계점 filter.option.radius = 반경 filter.option.percentile = 백분위수 - width = 넓이 : height = 높이 : menu = 메뉴 @@ -411,7 +407,6 @@ tutorial = 튜토리얼 tutorial.retake = 튜토리얼 editor = 편집기 mapeditor = 맵 편집기 - abandon = 지역 포기 abandon.text = 이 구역의 모든 자원이 적에게 빼앗길 것입니다. locked = 잠김 @@ -431,18 +426,17 @@ uncover = 지역 개방 configure = 코어 시작자원 설정 bannedblocks = 금지된 블럭들 addall = 모두 추가 -configure.locked = 시 시작자원 설정이 해금됩니다. +configure.locked = [lightgray]{0}시 시작자원 설정이 해금됩니다. configure.invalid = 해당 값은 0 과 {0} 사이여야 합니다. zone.unlocked = [LIGHT_GRAY] 잠금 해제되었습니다! zone.requirement.complete = {0} 단계 달성 성공! \n{1} 지역 요구사항이 충족되었습니다! zone.config.unlocked = 시작자원 설정 해금! : [lightgray]\n{0} zone.resources = 감지된 자원 목록 : -zone.objective = [lightgray]게임 모드 : [accent]{0} +zone.objective = [lightgray]지역 임무 : [accent]{0} zone.objective.survival = 생존 -zone.objective.attack = 적 코어 +zone.objective.attack = 적 코어 파괴 add = 추가... boss.health = 보스 체력 - connectfail = [crimson]{0}[accent] 서버에 연결하지 못했습니다.[] error.unreachable = 서버에 연결하지 못했습니다.\n서버 주소가 정확히 입력되었나요? error.invalidaddress = 잘못된 주소입니다. @@ -453,7 +447,6 @@ error.mapnotfound = 맵 파일을 찾을 수 없습니다! error.io = 네트워크 I/O 오류. error.any = 알 수 없는 네트워크 오류. error.bloom = 블룸 그래픽 효과를 적용하지 못했습니다.\n당신의 기기가 이 기능을 지원하지 않는 것일 수도 있습니다. - zone.groundZero.name = 전초기지 zone.desertWastes.name = 쓰레기 사막 zone.craters.name = 크레이터 @@ -468,7 +461,6 @@ 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]이 지역에서의 착륙장소는 확실하지 않습니다. @@ -483,7 +475,6 @@ zone.nuclearComplex.description = 과거 토륨의 생산, 연구와 처리를 zone.fungalPass.description = 고산지대과 포자지대 사이의 지역입니다. 소규모의 적 정찰기지가 있으니 디거와 크롤러를 이용해 적의 코어를 파괴하십시오. zone.impact0078.description = [ROYAL]죄송합니다. 아직 설명이 준비되지 않았습니다. zone.crags.description = [ROYAL]죄송합니다. 아직 설명이 준비되지 않았습니다. - settings.language = 언어 settings.data = 게임 데이터 settings.reset = 설정 초기화 @@ -518,6 +509,7 @@ blocks.shootrange = 사거리 blocks.size = 크기 blocks.liquidcapacity = 액체 용량 blocks.powerrange = 전력 범위 +blocks.powerconnections = Max Connections blocks.poweruse = 전력 사용 blocks.powerdamage = 전력/데미지 blocks.itemcapacity = 저장 용량 @@ -537,9 +529,9 @@ blocks.inaccuracy = 오차각 blocks.shots = 공격 속도 blocks.reload = 재장전 blocks.ammo = 탄약 - bar.drilltierreq = 더 좋은 드릴이 요구됨 bar.drillspeed = 초당 {0}개 채굴중 +bar.pumpspeed = Pump Speed: {0}/s bar.efficiency = 활성화율 : {0}% bar.powerbalance = 초당 {0} 발전중 bar.powerstored = 총 전력 저장량 : {0}/{1} @@ -552,7 +544,6 @@ bar.heat = 발열 bar.power = 전력 bar.progress = 생산 진행도 bar.spawned = 최대 {1}기 중 {0}기 생산됨 - bullet.damage = [lightgray]피해량 : [stat]{0}[] bullet.splashdamage = [lightgray]범위 피해량 : [stat]{0}[] / [lightgray]피해 범위 : [stat]{1}[lightgray] 타일 bullet.incendiary = [stat]방화 @@ -564,7 +555,6 @@ bullet.freezing = [stat]빙결 bullet.tarred = [stat]타르 bullet.multiplier = 추가 타격 횟수 : [stat]{0}[lightgray] bullet.reload = 공격 속도 : [stat]{0}[lightgray] - unit.blocks = 블록 unit.powersecond = 전력/초 unit.liquidsecond = 액체/초 @@ -576,7 +566,7 @@ unit.seconds = 초 unit.persecond = /초 unit.timesspeed = x 배 unit.percent = % -unit.items = 아이템 +unit.items = 자원 category.general = 일반 category.power = 전력 category.liquids = 액체 @@ -586,8 +576,9 @@ category.shooting = 사격 category.optional = 보조 아이템 setting.landscape.name = 가로화면으로 고정 setting.shadows.name = 그림자 +setting.blockreplace.name = 블럭 제안 자동화 setting.linear.name = 선형 필터링 -setting.hints.name = 도움말 표시 +setting.hints.name = 힌트 활성화 setting.animatedwater.name = 움직이는 물 setting.animatedshields.name = 움직이는 보호막 setting.antialias.name = 안티 에일리어싱[LIGHT_GRAY] (재시작 필요)[] @@ -608,6 +599,8 @@ 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.sensitivity.name = 컨트롤러 감도 setting.saveinterval.name = 저장 간격 setting.seconds = 초 @@ -688,7 +681,6 @@ mode.pvp.description = 실제 플레이어와 PvP를 합니다. 맵에 적어도 mode.attack.name = 공격 mode.attack.description = 적 기지를 파괴하세요. 맵에 빨간팀 코어가 있어야 플레이 가능합니다. mode.custom = 사용자 정의 규칙 - rules.infiniteresources = 무한 자원 rules.wavetimer = 단계 rules.waves = 단계 @@ -715,7 +707,6 @@ rules.title.resourcesbuilding = 자원 & 건축 rules.title.player = 플레이어들 rules.title.enemy = 적 rules.title.unit = 유닛 - content.item.name = 아이템 content.liquid.name = 액체 content.unit.name = 유닛 @@ -758,10 +749,10 @@ mech.dart-ship.weapon = 소총 mech.javelin-ship.name = 재블린 mech.javelin-ship.weapon = 유도 미사일 mech.javelin-ship.ability = 가속 전격 생성기 -mech.trident-ship.name = 삼지창 +mech.trident-ship.name = 트라이던트 mech.trident-ship.weapon = 폭탄 저장고 -mech.glaive-ship.name = 글레브 -mech.glaive-ship.weapon = 방화총 +mech.glaive-ship.name = 글레이브 +mech.glaive-ship.weapon = 중무장 인화성 소총 item.explosiveness = [LIGHT_GRAY]폭발성 : {0} item.flammability = [LIGHT_GRAY]인화성 : {0} item.radioactivity = [LIGHT_GRAY]방사능 : {0} @@ -777,7 +768,6 @@ 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 = 소금 @@ -853,6 +843,8 @@ block.copper-wall.name = 구리 벽 block.copper-wall-large.name = 대형 구리 벽 block.titanium-wall.name = 티타늄 벽 block.titanium-wall-large.name = 대형 티타늄 벽 +block.plastanium-wall.name = 플라스터늄 벽 +block.plastanium-wall-large.name = 대형 플라스터늄 벽 block.phase-wall.name = 메타 벽 block.phase-wall-large.name = 대형 메타 벽 block.thorium-wall.name = 토륨 벽 @@ -932,10 +924,10 @@ block.spirit-factory.name = 수리 드론 공장 block.phantom-factory.name = 건설 드론 공장 block.wraith-factory.name = 유령 전투기 공장 block.ghoul-factory.name = 구울 폭격기 공장 -block.dagger-factory.name = 대거 기체 공장 -block.crawler-factory.name = 크롤러 기체 공장 -block.titan-factory.name = 타이탄 기체 공장 -block.fortress-factory.name = 포트리스 기체 공장 +block.dagger-factory.name = 대거 공장 +block.crawler-factory.name = 크롤러 공장 +block.titan-factory.name = 타이탄 공장 +block.fortress-factory.name = 포트리스 공장 block.revenant-factory.name = 망령 전함 공장 block.repair-point.name = 수리 지점 block.pulse-conduit.name = 퓨즈 파이프 @@ -984,13 +976,14 @@ unit.ghoul.name = 구울 폭격기 unit.wraith.name = 유령 전투기 unit.fortress.name = 포트리스 unit.revenant.name = 망령 전함 -unit.eruptor.name = 분화자 -unit.chaos-array.name = 혼돈 배열 -unit.eradicator.name = 박멸 -unit.lich.name = 리치 +unit.eruptor.name = 이어럽터 +unit.chaos-array.name = 혼돈의 군대 +unit.eradicator.name = 파괴자 +unit.lich.name = 사자왕 unit.reaper.name = 사신 tutorial.next = [lightgray]< 이 곳을 터치해 진행하세요. > -tutorial.intro = Mindustry 튜토리얼을 시작하겠습니다. 튜토리얼은 [accent]모바일은 뒤로가기, 데스크탑은 esc버튼[]을 누르고 [accent]나가기 버튼[]을 눌러 종료가 가능합니다.\n[accent]구리[]를 18개 채광하세요. 코어 주위에 있는 주황색의 구리 광물을 터치함으로써 구리를 채광할 수 있습니다.\n\n[accent]현재 모은 구리의 개수 : {0}/{1} 개[] +tutorial.intro = [scarlet]Mindustry 튜토리얼[]을 시작하겠습니다.\n [WASD] 키를 눌러 이동할 수 있습니다.\n[accent]Ctrl 키를 누르고 마우스 휠을 돌려 확대 또는 축소가 가능합니다.\n[accent]주황색의 광맥[]을 눌러 [accent]구리[]를 채광하세요.\n구리를 채광한 후에는 코어 근처로 이동한 뒤, 당신의 기체에서 코어로 드래그해 구리를 코어에 넣으세요. 코어 근처에서 채광하면 자동으로 옮겨집니다.\n\n임무 : 구리 채광({0}/{1}) +tutorial.intro.mobile = [scarlet]Mindustry 튜토리얼[]을 시작하겠습니다.\n화면을 드래그하여 이동이 가능합니다.\n두 손가락을 화면에 누른 후 모으거나 벌려 확대와 축소가 가능합니다.\n[accent]주황색의 광맥[]을 눌러 [accent]구리[]를 채광하세요.\n구리를 채광한 후에는 코어 근처로 이동한 뒤, 당신의 기체에서 코어로 드래그해 구리를 코어에 넣으세요. 코어 근처에서 채광하면 자동으로 옮겨집니다.\n\n임무 : 구리 채광({0}/{1}) tutorial.drill = 수동으로 채광하는 것은 효율이 낮습니다.\n[accent]드릴[]은 자동으로 드릴 바로 아래에 있는 광물들을 채광합니다.\n드릴 카테고리의 기계식 드릴을 선택하여 구리 광맥위에 설치하세요.\n마우스 오른쪽 버튼으로 취소가 가능합니다. tutorial.drill.mobile = 수동으로 채광하는 것은 효율이 낮습니다.\n[accent]드릴[]은 자동으로 드릴 바로아래에 있는 광물들을 채광합니다.\n드릴 카테고리의 기계식 드릴을 선택하여 구리 광맥위에 설치하세요.\n취소 버튼을 눌러 건축하기 전의 설계를 취소할 수 있습니다. tutorial.blockinfo = 블록들은 각각 능력이 다르며, 하위 티어의 드릴은 채광할 수 있는 광물의 종류가 적습니다.\n블럭의 정보를 확인하기 위해서는,[accent] 카테고리의 블럭을 누른 후, "?"버튼을 클릭하여 블럭의 정보를 확인하세요.[]\n[royal]궁금한 블럭의 정보를 아무거나 한번 확인해보세요. @@ -1009,7 +1002,6 @@ 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]액체를 활용하기 위한 필수품입니다. @@ -1075,6 +1067,8 @@ block.copper-wall.description = 게임 시작 초기에 방어용으로 적합 block.copper-wall-large.description = 구리 벽 4개를 뭉친 블럭입니다. block.titanium-wall.description = 흑연이 생산될 즈음에 사용하기 적합합니다. block.titanium-wall-large.description = 티타늄 벽 4개를 뭉친 블럭입니다. +block.plastanium-wall.description = 아크, 델타와 같은 전기 공격을 막는 특수한 벽입니다. 또한, 이 벽 주위에 전기를 사용하는 건물을 배치할 시 그 건물에는 노드가 자동으로 연결하지 않습니다. +block.plastanium-wall-large.description = 아크, 델타와 같은 전기 공격을 막는 특수한 벽입니다. 또한, 이 벽 주위에 전기를 사용하는 건물을 배치할 시 그 건물에는 노드가 자동으로 연결하지 않습니다.\n도배해서 사용하세요. block.thorium-wall.description = 쉬운 생산이 가능한 마지막 방어벽입니다. block.thorium-wall-large.description = 토륨 벽 4개를 뭉친 블럭입니다. block.phase-wall.description = 토륨 벽만큼 강하지 않지만 벽을 향해 날아오는 총알이 너무 강력하지 않으면 총알을 튕겨냅니다. @@ -1094,7 +1088,7 @@ block.junction.description = 2개의 컨베이어 벨트를 교차시키는 다 block.bridge-conveyor.description = 자원 수송 블록.\n지형이나 건물을 넘어 최대 3개 타일을 건너뛰고 자원을 운송할 수 있습니다. block.phase-conveyor.description = 고급 자원 수송 블록.\n지형이나 건물을 넘어 최대 11개 타일을 건너뛰고 자원을 운송할 수 있습니다. 전기를 사용하고, 기본 터널 컨베이어보다 빠릅니다. block.sorter.description = 자원을 넣어서 필터에 설정된 자원일 경우 바로 앞으로 통과하며, 그렇지 않을 경우 옆으로 이동시킵니다. -block.inverted-sorter.descriptions = 필터처럼 자원을 이동시키는 대신에, 선택한 자원을 양 옆으로 출력합니다. +block.inverted-sorter.description = Processes items like a standard sorter, but outputs selected items to the sides instead. block.router.description = 한 방향에서 자원을 넣을 시 최대 3개의 다른 방향으로 균등하게 내보냅니다. 자원을 한 곳에서 여러 방향으로 분배하는 데 유용합니다. block.distributor.description = 자원을 최대 7개의 다른 방향으로 균등하게 분베하는 고급 분배기. block.overflow-gate.description = 평소에는 자원의 들어온 방향으로 자원을 통과시키지만, 정면이 자원으로 꽉 차거나 다른 사유로 막힐 시 옆으로 자원을 내보냅니다. diff --git a/core/assets/bundles/bundle_nl.properties b/core/assets/bundles/bundle_nl.properties index 8c63a05598..a9bf6129f3 100644 --- a/core/assets/bundles/bundle_nl.properties +++ b/core/assets/bundles/bundle_nl.properties @@ -3,6 +3,7 @@ credits = Credits contributors = Vertalers en Medewerkers discord = Word lid van de Mindustry Discord! link.discord.description = De officiële Mindustry discord chatroom +link.reddit.description = The Mindustry subreddit link.github.description = Game broncode link.changelog.description = Lijst van Updates link.dev-builds.description = Onstabiele ontwikkeling builds @@ -26,6 +27,7 @@ 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 @@ -78,20 +80,25 @@ uploadingcontent = Uploading Content uploadingpreviewfile = Uploading Preview File committingchanges = Comitting Changes done = Done -mods.alphainfo = Keep in mind that mods are in alpha, and[scarlet] may be very buggy[].\nReport any issues you find to the Mindustry Github or Discord. +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.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} @@ -263,6 +270,7 @@ missing = This item has been deleted or moved.\n[lightgray]The workshop listing 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} editor.brush = Brush editor.openin = Open In Editor editor.oregen = Ore Generation @@ -501,6 +509,7 @@ blocks.shootrange = Range blocks.size = Size blocks.liquidcapacity = Liquid Capacity blocks.powerrange = Power Range +blocks.powerconnections = Max Connections blocks.poweruse = Power Use blocks.powerdamage = Power/Damage blocks.itemcapacity = Item Capacity @@ -522,6 +531,7 @@ blocks.reload = Shots/Second blocks.ammo = Ammo bar.drilltierreq = Better Drill Required bar.drillspeed = Drill Speed: {0}/s +bar.pumpspeed = Pump Speed: {0}/s bar.efficiency = Efficiency: {0}% bar.powerbalance = Power: {0} bar.powerstored = Stored: {0}/{1} @@ -566,6 +576,7 @@ category.shooting = Shooting category.optional = Optional Enhancements setting.landscape.name = Lock Landscape setting.shadows.name = Shadows +setting.blockreplace.name = Automatic Block Suggestions setting.linear.name = Linear Filtering setting.hints.name = Hints setting.animatedwater.name = Animated Water @@ -588,6 +599,8 @@ setting.difficulty.insane = insane setting.difficulty.name = Difficulty: setting.screenshake.name = Screen Shake setting.effects.name = Display Effects +setting.destroyedblocks.name = Display Destroyed Blocks +setting.conveyorpathfinding.name = Conveyor Placement Pathfinding setting.sensitivity.name = Controller Sensitivity setting.saveinterval.name = Autosave Interval setting.seconds = {0} Seconds @@ -830,6 +843,8 @@ 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.plastanium-wall.name = Plastanium Wall +block.plastanium-wall-large.name = Large Plastanium Wall block.phase-wall.name = Phase Wall block.phase-wall-large.name = Large Phase Wall block.thorium-wall.name = Thorium Wall @@ -968,6 +983,7 @@ 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.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 = Mining manually is inefficient.\n[accent]Drills []can mine automatically.\nPlace one on a copper vein. 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.[] @@ -1051,6 +1067,8 @@ block.copper-wall.description = A cheap defensive block.\nUseful for protecting 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.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.thorium-wall.description = A strong defensive block.\nGood protection from enemies. block.thorium-wall-large.description = A strong defensive block.\nGood protection from enemies.\nSpans multiple tiles. block.phase-wall.description = Not as strong as a thorium wall but will deflect bullets unless they are too powerful. @@ -1070,7 +1088,7 @@ block.junction.description = Acts as a bridge for two crossing conveyor belts. U 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.inverted-sorter.descriptions = Processes items like a standard sorter, but outputs selected items to the sides instead. +block.inverted-sorter.description = Processes items like a standard sorter, but outputs selected items to the sides instead. block.router.description = Accepts items from one direction and outputs them to up to 3 other directions equally. Useful for splitting the materials from one source to multiple targets. block.distributor.description = An advanced router which splits items to up to 7 other directions equally. block.overflow-gate.description = A combination splitter and router that only outputs to the left and right if the front path is blocked. diff --git a/core/assets/bundles/bundle_nl_BE.properties b/core/assets/bundles/bundle_nl_BE.properties index 9740efd921..1756cd5135 100644 --- a/core/assets/bundles/bundle_nl_BE.properties +++ b/core/assets/bundles/bundle_nl_BE.properties @@ -3,6 +3,7 @@ credits = Credits contributors = Vertalers en medewerkers discord = Sluit je aan bij de Mindustry discord server! link.discord.description = De officiële Mindustry discord chatroom +link.reddit.description = The Mindustry subreddit link.github.description = Broncode link.changelog.description = Lijst met updatewijzigingen link.dev-builds.description = Onstabiele versies @@ -16,28 +17,29 @@ screenshot.invalid = Kaart te groot, mogelijks te weinig geheugen voor een scree gameover = Game Over gameover.pvp = Het[accent] {0}[] team heeft gewonnen! highscore = [accent]Nieuw record! -copied = Copied. -load.sound = Sounds -load.map = Maps +copied = Gekopieerd. +load.sound = Geluiden +load.map = Kaarten load.image = Images load.content = Content load.system = System load.mod = Mods -schematic = Schematic -schematic.add = Save Schematic... -schematics = Schematics -schematic.import = Import Schematic... -schematic.exportfile = Export File -schematic.importfile = Import File +schematic = Blauwdruk +schematic.add = Blauwdruk Opslaan... +schematics = Blauwdrukken +schematic.replace = Er bestaat al een blaudruk met deze naam. Vervangen? +schematic.import = Importeer Blauwdruk... +schematic.exportfile = Exporteer Bestand +schematic.importfile = Exporteer Bestand schematic.browseworkshop = Browse Workshop -schematic.copy = Copy to Clipboard -schematic.copy.import = Import from Clipboard -schematic.shareworkshop = Share on Workshop +schematic.copy = Kopieer naar Klembord +schematic.copy.import = Importeer vanaf Klembord +schematic.shareworkshop = Deel op Workshop schematic.flip = [accent][[{0}][]/[accent][[{1}][]: Flip Schematic -schematic.saved = Schematic saved. +schematic.saved = Blauwdruk opgeslagen. schematic.delete.confirm = This schematic will be utterly eradicated. -schematic.rename = Rename Schematic -schematic.info = {0}x{1}, {2} blocks +schematic.rename = Blauwdruk Hernoemen +schematic.info = {0}x{1}, {2} blokken stat.wave = Je overleefde tot aanvalsgolf: [accent]{0}[]. stat.enemiesDestroyed = Vijanden vernietigd:[accent] {0} stat.built = Gebouwen gebouwd:[accent] {0} @@ -46,7 +48,7 @@ stat.deconstructed = Gebouwen afgebroken:[accent] {0} stat.delivered = Gronstoffen meegenomen: stat.rank = Eindresultaat: [accent]{0} launcheditems = [accent]Meegenomen grondstoffen -launchinfo = [unlaunched][[LAUNCH] your core to obtain the items indicated in blue. +launchinfo = [unlaunched][[LAUNCH] je kern om de met blauw aangeduide voorwerpen te verkrijgen. map.delete = Ben je zeker dat je de kaart "[accent]{0}[]" wilt verwijderen? level.highscore = Beste score: [accent]{0} level.select = Selecteer level @@ -55,14 +57,14 @@ showagain = Toon dit volgende keer niet meer. coreattack = < Kern wordt aangevallen! > nearpoint = [[ [scarlet]VERLAAT dit gebied onmiddelijk[] ]\nDirecte vernietiging... database = Kern Database -savegame = opslaan -loadgame = openen +savegame = Opslaan +loadgame = Openen joingame = Multiplayer customgame = Aangepaste versie newgame = Nieuw spel none = minimap = Kaartje -position = Position +position = Positie close = Sluit website = Website quit = Verlaat @@ -72,35 +74,40 @@ maps.browse = Browse Maps continue = Ga verder maps.none = [LIGHT_GRAY]Geen kaarten gevonden! invalid = Invalid -preparingconfig = Preparing Config -preparingcontent = Preparing Content -uploadingcontent = Uploading Content -uploadingpreviewfile = Uploading Preview File -committingchanges = Comitting Changes -done = Done -mods.alphainfo = Keep in mind that mods are in alpha, and[scarlet] may be very buggy[].\nReport any issues you find to the Mindustry Github or Discord. +preparingconfig = Config Voorbereiden +preparingcontent = Content Voorbereiden +uploadingcontent = Content 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 = Mods -mods.none = [LIGHT_GRAY]No mods found! -mods.guide = Modding Guide -mods.report = Report Bug -mod.enabled = [lightgray]Enabled -mod.disabled = [scarlet]Disabled -mod.disable = Disable +mods.none = [LIGHT_GRAY]Geen mods gevonden! +mods.guide = Handleiding tot Modding +mods.report = Bug Rapporteren +mods.openfolder = Open Mod Folder +mod.enabled = [lightgray]Ingeschakeld +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.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.reloadrequired = [scarlet]Herladen Vereist +mod.import = Importeer Mod +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 name = Naam: noname = Kies eerst[accent] een naam[]. -filename = Bestands naam: +filename = Bestandsnaam: unlocked = Ontgrendeld! completed = [accent]Voltooid techtree = Technische vooruitgang @@ -263,6 +270,7 @@ missing = This item has been deleted or moved.\n[lightgray]The workshop listing 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} editor.brush = Brush editor.openin = Open In Editor editor.oregen = Ore Generation @@ -501,6 +509,7 @@ blocks.shootrange = Range blocks.size = Size blocks.liquidcapacity = Liquid Capacity blocks.powerrange = Power Range +blocks.powerconnections = Max Connections blocks.poweruse = Power Use blocks.powerdamage = Power/Damage blocks.itemcapacity = Item Capacity @@ -522,6 +531,7 @@ blocks.reload = Shots/Second blocks.ammo = Ammo bar.drilltierreq = Better Drill Required bar.drillspeed = Drill Speed: {0}/s +bar.pumpspeed = Pump Speed: {0}/s bar.efficiency = Efficiency: {0}% bar.powerbalance = Power: {0}/s bar.powerstored = Stored: {0}/{1} @@ -566,6 +576,7 @@ category.shooting = Shooting category.optional = Optional Enhancements setting.landscape.name = Lock Landscape setting.shadows.name = Shadows +setting.blockreplace.name = Automatic Block Suggestions setting.linear.name = Linear Filtering setting.hints.name = Hints setting.animatedwater.name = Animated Water @@ -588,6 +599,8 @@ setting.difficulty.insane = insane setting.difficulty.name = Difficulty: setting.screenshake.name = Screen Shake setting.effects.name = Display Effects +setting.destroyedblocks.name = Display Destroyed Blocks +setting.conveyorpathfinding.name = Conveyor Placement Pathfinding setting.sensitivity.name = Controller Sensitivity setting.saveinterval.name = Autosave Interval setting.seconds = {0} Seconds @@ -830,6 +843,8 @@ 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.plastanium-wall.name = Plastanium Wall +block.plastanium-wall-large.name = Large Plastanium Wall block.phase-wall.name = Phase Wall block.phase-wall-large.name = Large Phase Wall block.thorium-wall.name = Thorium Wall @@ -968,6 +983,7 @@ 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.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 = Handmatig delven is inefficiënt.\n[accent]Boren []kunnen automatisch delven.\nPlaats er een op een koperader. 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.[] @@ -1051,6 +1067,8 @@ block.copper-wall.description = A cheap defensive block.\nUseful for protecting 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.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.thorium-wall.description = A strong defensive block.\nGood protection from enemies. block.thorium-wall-large.description = A strong defensive block.\nGood protection from enemies.\nSpans multiple tiles. block.phase-wall.description = Not as strong as a thorium wall but will deflect bullets unless they are too powerful. @@ -1070,7 +1088,7 @@ block.junction.description = Acts as a bridge for two crossing conveyor belts. U 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.inverted-sorter.descriptions = Processes items like a standard sorter, but outputs selected items to the sides instead. +block.inverted-sorter.description = Processes items like a standard sorter, but outputs selected items to the sides instead. block.router.description = Accepts items from one direction and outputs them to up to 3 other directions equally. Useful for splitting the materials from one source to multiple targets. block.distributor.description = An advanced router which splits items to up to 7 other directions equally. block.overflow-gate.description = A combination splitter and router that only outputs to the left and right if the front path is blocked. diff --git a/core/assets/bundles/bundle_pl.properties b/core/assets/bundles/bundle_pl.properties index 02056031d3..95914d3862 100644 --- a/core/assets/bundles/bundle_pl.properties +++ b/core/assets/bundles/bundle_pl.properties @@ -3,15 +3,16 @@ credits = Zasłużeni contributors = Tłumacze i pomocnicy discord = Odwiedź nasz serwer Discord! link.discord.description = Oficjalny serwer Discord Mindustry +link.reddit.description = Subreddit Mindustry link.github.description = Kod źródłowy gry -link.changelog.description = Informacje o aktualizacjach +link.changelog.description = Historia aktualizacji 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.wiki.description = Oficjana Wiki Mindustry linkfail = Nie udało się otworzyć linku!\nURL został skopiowany. -screenshot = Zapisano zdjęcie do {0} +screenshot = Zapisano zdjęcie w {0} screenshot.invalid = Zrzut ekranu jest zbyt duży. Najprawdopodobniej brakuje miejsca w pamięci urządzenia. gameover = Koniec Gry gameover.pvp = Zwyciężyła drużyna [accent]{0}[]! @@ -23,21 +24,22 @@ load.image = Obrazy load.content = Treść load.system = System load.mod = Mody -schematic = Schematic -schematic.add = Save Schematic... -schematics = Schematics -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 +schematic = Schemat +schematic.add = Zapisz schemat... +schematics = Schematy +schematic.replace = Schemat o takiej nazwie już istnieje. Czy chcesz go zastąpić? +schematic.import = Importuj Schemat... +schematic.exportfile = Eksportuj plik +schematic.importfile = Importuj plik +schematic.browseworkshop = Przeglądaj Warsztat +schematic.copy = Zapisano w schowku +schematic.copy.import = Importuj ze schowka +schematic.shareworkshop = Podziel się na Warsztacie +schematic.flip = [accent][[{0}][]/[accent][[{1}][]: Odwróć schemat +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} @@ -53,7 +55,7 @@ level.select = Wybrany poziom level.mode = Tryb gry: showagain = Nie pokazuj tego więcej coreattack = < Rdzeń jest atakowany! > -nearpoint = [[ [scarlet]OPUŚĆ PUNKT ZRZUTU NATYCHMIAST[] ]\nnadciąga zniszczenie +nearpoint = [[ [scarlet]NATYCHMIAST OPUŚĆ PUNKT ZRZUTU[] ]\nnadciąga zniszczenie database = Centralna baza danych savegame = Zapisz Grę loadgame = Wczytaj Grę @@ -62,7 +64,7 @@ customgame = Własna Gra newgame = Nowa Gra none = minimap = Minimapa -position = Position +position = Pozycja close = Zamknij website = Strona Gry quit = Wyjdź @@ -78,25 +80,30 @@ uploadingcontent = Przesyłanie Zawartości uploadingpreviewfile = Przesyłanie Pliku Podglądu committingchanges = Zatwierdzanie Zmian done = Gotowe -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. +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 mods.none = [LIGHT_GRAY]Nie znaleziono modów! -mods.guide = Modding Guide -mods.report = Report Bug +mods.guide = Poradnik do modów +mods.report = Zgłoś Błąd +mods.openfolder = Otwórz folder z modami mod.enabled = [lightgray]Włączony mod.disabled = [scarlet]Wyłączony -mod.disable = Disable -mod.enable = Enable +mod.disable = Wyłącz +mod.delete.error = Nie udało się usunąć moda. Plik może być w użyciu. +mod.missingdependencies = [scarlet]Brakujące zależności: {0} +mod.nowdisabled = [scarlet]Brakuje zależności dla moda '{0}':[accent] {1}\n[lightgray]Najpierw trzeba ściągnąć te mody.\nMod zostanie automatycznie wyłączony. +mod.enable = Włącz mod.requiresrestart = Gra się wyłączy aby wprowadzić zmiany moda. -mod.reloadrequired = [scarlet]Reload Required +mod.reloadrequired = [scarlet]Wymagany restart mod.import = Importuj Mod -mod.import.github = Import Github Mod +mod.import.github = Importuj mod z GitHuba mod.remove.confirm = Ten mod zostanie usunięty. mod.author = [LIGHT_GRAY]Autor:[] {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.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[] @@ -118,7 +125,7 @@ server.kicked.clientOutdated = Nieaktualna gra! Zaktualizują ją! server.kicked.serverOutdated = Nieaktualny serwer! Poproś hosta o jego aktualizację. server.kicked.banned = Zostałeś zbanowany na tym serwerze. server.kicked.typeMismatch = Ten serwer jest niekompatybilny z twoją wersją gry. -server.kicked.playerLimit = Serwer pełny. Poczekaj na wolny slot. +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. @@ -126,8 +133,8 @@ server.kicked.idInUse = Jesteś już na serwerze! Używanie tego samego konta na 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.[]\nKtokolwiek z tym samym [LIGHT_GRAY]wifi lub hotspotem[] powinien zobaczyć twój serwer.\n\nJeśli chcesz, aby każdy z twoim IP mógł dołączyć, [accent]przekierowywanie portów[] jest potrzebne.\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]IP serwera[], aby dołączyć lub wyszukaj [accent]serwery w lokalnej sieci[], do których chcesz 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ć się hosta o IP. +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. hostserver = Stwórz Serwer invitefriends = Zaproś Znajomych hostserver.mobile = Hostuj\nGrę @@ -210,7 +217,7 @@ warning = Uwaga. confirm = Potwierdź delete = Usuń view.workshop = Pokaż w Warsztacie -workshop.listing = Edit Workshop Listing +workshop.listing = Edytuj pozycję w Warsztacie ok = OK open = Otwórz customize = Dostosuj @@ -230,10 +237,10 @@ quit.confirm.tutorial = Czy jesteś pewien tego co robisz?\nSamouczek może zost loading = [accent]Ładowanie... reloading = [accent]Reloading Mods... saving = [accent]Zapisywanie... -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}][] by wyczyścić plan +selectschematic = [accent][[{0}][] by wybrać+skopiować +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 @@ -252,17 +259,18 @@ map.nospawn = Ta mapa nie zawiera żadnego rdzenia! Dodaj [ROYAL]niebieski[] rdz 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.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 = 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! -workshop.menu = Select what you would like to do with this item. -workshop.info = Item Info -changelog = Changelog (optional): -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} +workshop.update = Aktualizuj pozycję +workshop.error = Błąd podczas wczytywania szczegółów z Warsztatu: {0} +map.publish.confirm = Czy jesteś pewien, że chcesz opublikować tę mapę?\n\n[lightgray]Najpierw upewnij się, że zgadzasz się z umową EULA Warsztatu, w przeciwnym razie twoje mapy nie będą widoczne! +workshop.menu = Wybierz co chcesz zrobić z tą pozycją. +workshop.info = Informacja o pozycji +changelog = Historia aktualizacji (opcjonalna): +eula = Umowa 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łóż @@ -302,7 +310,7 @@ 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 rozszeżenia spodziewając sie ż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. 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.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. @@ -349,7 +357,7 @@ toolmode.square = Kwadrat toolmode.square.description = Kwadratowy pędzel. toolmode.eraseores = Wymaż Rudy toolmode.eraseores.description = Usuń tylko rudy. -toolmode.fillteams = Wypełń Drużyny +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. @@ -403,9 +411,9 @@ abandon = Opuść abandon.text = Ta strefa i wszystkie jej surowce będą przejęte przez przeciwników. locked = Zablokowane complete = [LIGHT_GRAY]Ukończone: -requirement.wave = Reach Wave {0} in {1} -requirement.core = Destroy Enemy Core in {0} -requirement.unlock = Unlock {0} +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} launch = < WYSTRZEL > @@ -416,13 +424,13 @@ launch.confirm = Spowoduje to wystrzelenie wszystkich surowców w rdzeniu.\nNie 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 = Banned Blocks -addall = Add All +bannedblocks = Zabronione bloki +addall = Dodaj wszystkie configure.locked = [LIGHT_GRAY]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.requirement.complete = Fala {0} osiągnięta:\n{1} Wymagania strefy zostały spełnione. -zone.config.unlocked = Loadout unlocked:[lightgray]\n{0} +zone.config.unlocked = Ładunek odblokowany:[lightgray]\n{0} zone.resources = Wykryte Zasoby: zone.objective = [lightgray]Cel: [accent]{0} zone.objective.survival = Przeżyj @@ -479,8 +487,8 @@ settings.cleardata = Wyczyść Dane Gry... settings.clear.confirm = Czy jesteś pewien że chcesz usunąć te dane?\nPo tym nie ma powrotu! settings.clearall.confirm = [scarlet]UWAGA![]\nTo wykasuje wszystkie dane, włącznie z zapisanymi grami i mapami, ustawienami, i znanymi technologiami.\nKiedy naciśniesz 'ok', gra usunie wszystkie swoje dane i automatycznie wyłączy się. paused = [accent]< Wstrzymano > -clear = Clear -banned = [scarlet]Banned +clear = Wyczyść +banned = [scarlet]Zbanowano yes = Tak no = Nie info.title = Informacje @@ -501,6 +509,7 @@ blocks.shootrange = Zasięg blocks.size = Rozmiar blocks.liquidcapacity = Pojemność cieczy blocks.powerrange = Zakres mocy +blocks.powerconnections = Max Connections blocks.poweruse = Zużycie prądu blocks.powerdamage = Moc/Zniszczenia blocks.itemcapacity = Pojemność przedmiotów @@ -522,6 +531,7 @@ 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.efficiency = Efektywność: {0}% bar.powerbalance = Moc: {0} bar.powerstored = Zmagazynowano: {0}/{1} @@ -566,6 +576,7 @@ category.shooting = Strzelanie category.optional = Dodatkowe ulepszenia setting.landscape.name = Zablokuj tryb panoramiczny setting.shadows.name = Cienie +setting.blockreplace.name = Automatic Block Suggestions setting.linear.name = Filtrowanie Liniowe setting.hints.name = Hints setting.animatedwater.name = Animowana woda @@ -586,8 +597,10 @@ setting.difficulty.normal = Normalny setting.difficulty.hard = Trudny setting.difficulty.insane = Szalony setting.difficulty.name = Poziom trudności -setting.screenshake.name = Trzęsienie się ekranu +setting.screenshake.name = Wstrząsy ekranu setting.effects.name = Wyświetlanie efektów +setting.destroyedblocks.name = Display Destroyed Blocks +setting.conveyorpathfinding.name = Conveyor Placement Pathfinding setting.sensitivity.name = Czułość kontrolera setting.saveinterval.name = Interwał automatycznego zapisywania setting.seconds = {0} Sekundy @@ -610,7 +623,7 @@ 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.beta = Note that beta versions of the game cannot make public lobbies. +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ź setting.bloom.name = Bloom @@ -618,20 +631,20 @@ keybind.title = Zmień keybinds.mobile = [scarlet]Większość skrótów klawiszowych nie funkcjonuje w wersji mobilnej. Tylko podstawowe poruszanie się jest wspierane. category.general.name = Ogólne category.view.name = Wyświetl -category.multiplayer.name = Multiplayer +category.multiplayer.name = Wielu graczy command.attack = Atakuj command.rally = Zbierz command.retreat = Wycofaj -keybind.clear_building.name = Clear Building +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.move_x.name = Poruszanie w poziomie keybind.move_y.name = Poruszanie w pionie -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 = 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.fullscreen.name = Przełącz Pełny Ekran keybind.select.name = Zaznacz keybind.diagonal_placement.name = Budowa po skosie @@ -643,7 +656,7 @@ keybind.zoom_hold.name = Inicjator przybliżania keybind.zoom.name = Przybliżanie keybind.menu.name = Menu keybind.pause.name = Pauza -keybind.pause_building.name = Pause/Resume Building +keybind.pause_building.name = Wstrzymaj/kontynuuj budowę keybind.minimap.name = Minimapa keybind.dash.name = Przyspieszenie keybind.chat.name = Czat @@ -830,6 +843,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.phase-wall.name = Fazowa Ściana block.phase-wall-large.name = Duża Fazowa Ściana block.thorium-wall.name = Torowa Ściana @@ -840,7 +855,7 @@ block.duo.name = Podwójne Działko block.scorch.name = Płomień block.scatter.name = Flak block.hail.name = Grad -block.lancer.name = Lancer +block.lancer.name = Lansjer block.conveyor.name = Przenośnik block.titanium-conveyor.name = Przenośnik Tytanowy block.armored-conveyor.name = Przenośnik Opancerzony @@ -849,7 +864,7 @@ block.junction.name = Węzeł block.router.name = Rozdzielacz block.distributor.name = Dystrybutor block.sorter.name = Sortownik -block.inverted-sorter.name = Inverted Sorter +block.inverted-sorter.name = Odwrotny Sortownik block.message.name = Wiadomość block.overflow-gate.name = Brama Przepełnieniowa block.silicon-smelter.name = Huta Krzemu @@ -968,6 +983,7 @@ 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.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.[] @@ -1051,6 +1067,8 @@ block.copper-wall.description = Tani blok obronny.\nPrzydatny do ochrony rdzenia block.copper-wall-large.description = Tani blok obronny.\nPrzydatny do ochrony rdzenia i wieżyczek w pierwszych kilku falach.\nObejmuje wiele kratek. block.titanium-wall.description = Umiarkowanie silny blok obronny.\nZapewnia umiarkowaną ochronę przed wrogami. block.titanium-wall-large.description = Umiarkowanie silny blok obronny.\nZapewnia umiarkowaną ochronę przed wrogami.\nObejmuje wiele kratek. +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.thorium-wall.description = Silny blok obronny.\nDobra ochrona przed wrogami. block.thorium-wall-large.description = Silny blok obronny.\nDobra ochrona przed wrogami.\nObejmuje wiele kratek. block.phase-wall.description = Ściana pokryta specjalną mieszanką opartą o Włókna Fazowe, która odbija większość pocisków. @@ -1070,7 +1088,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.descriptions = Processes items like a standard sorter, but outputs selected items to the sides instead. +block.inverted-sorter.description = Processes items like a standard sorter, but outputs selected items to the sides instead. 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 diff --git a/core/assets/bundles/bundle_pt.properties b/core/assets/bundles/bundle_pt.properties index 0c31d54495..6e6169b4b5 100644 --- a/core/assets/bundles/bundle_pt.properties +++ b/core/assets/bundles/bundle_pt.properties @@ -3,6 +3,7 @@ credits = Créditos contributors = Tradutores e contribuidores discord = Junte-se ao Discord do Mindustry! (Lá falamos inglês) link.discord.description = O discord oficial do Mindustry +link.reddit.description = The Mindustry subreddit link.github.description = Código-fonte do jogo. link.changelog.description = Lista de mudanças da atualização link.dev-builds.description = Desenvolvimentos Instáveis @@ -26,6 +27,7 @@ load.mod = Mods schematic = Esquema schematic.add = Gravar Esquema... schematics = Esquemas +schematic.replace = A schematic by that name already exists. Replace it? schematic.import = Importar Esquema... schematic.exportfile = Exportar Ficheiro schematic.importfile = Importar Ficheiro @@ -78,20 +80,25 @@ uploadingcontent = Enviando conteúdo uploadingpreviewfile = Enviando ficheiro de pré-visualização committingchanges = Enviando mudanças done = Feito -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. +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]Ativado mod.disabled = [scarlet]Desativado mod.disable = Desativar +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 = Ativar mod.requiresrestart = The game will now close to apply the mod changes. mod.reloadrequired = [scarlet]Reload Required mod.import = Importar Mod -mod.import.github = Importar Mod da Github +mod.import.github = Importar Mod da GitHub mod.remove.confirm = Este mod irá ser apagado. mod.author = [LIGHT_GRAY]Autor:[] {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} @@ -263,6 +270,7 @@ missing = This item has been deleted or moved.\n[lightgray]The workshop listing 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} editor.brush = Pincel editor.openin = Abrir no Editor editor.oregen = Geração de minério @@ -501,6 +509,7 @@ blocks.shootrange = Alcance blocks.size = Tamanho blocks.liquidcapacity = Capacidade de Líquido blocks.powerrange = Alcance da Energia +blocks.powerconnections = Max Connections blocks.poweruse = Uso de energia blocks.powerdamage = Dano/Poder blocks.itemcapacity = Capacidade de Itens @@ -522,6 +531,7 @@ blocks.reload = Tiros por segundo blocks.ammo = Munição bar.drilltierreq = Broca melhor necessária. bar.drillspeed = Velocidade da broca: {0}/s +bar.pumpspeed = Pump Speed: {0}/s bar.efficiency = Eficiência: {0}% bar.powerbalance = Energia: {0} bar.powerstored = Armazenada: {0}/{1} @@ -566,6 +576,7 @@ category.shooting = Atirando category.optional = Melhoras opcionais setting.landscape.name = Travar panorama setting.shadows.name = Sombras +setting.blockreplace.name = Automatic Block Suggestions setting.linear.name = Filtragem linear setting.hints.name = Hints setting.animatedwater.name = Água animada @@ -588,6 +599,8 @@ setting.difficulty.insane = Insano setting.difficulty.name = Dificuldade setting.screenshake.name = Balanço do Ecrã setting.effects.name = Efeitos +setting.destroyedblocks.name = Display Destroyed Blocks +setting.conveyorpathfinding.name = Conveyor Placement Pathfinding setting.sensitivity.name = Sensibilidade do Controle setting.saveinterval.name = Intervalo de autogravamento setting.seconds = {0} Segundos @@ -830,6 +843,8 @@ block.copper-wall.name = Parede de Cobre block.copper-wall-large.name = Parede de Cobre Grande block.titanium-wall.name = Parede de titânio block.titanium-wall-large.name = Parede de titânio grande +block.plastanium-wall.name = Plastanium Wall +block.plastanium-wall-large.name = Large Plastanium Wall block.phase-wall.name = Parede de fase block.phase-wall-large.name = Parde de fase grande block.thorium-wall.name = Parede de tório @@ -968,6 +983,7 @@ unit.lich.name = Lich unit.reaper.name = Ceifador tutorial.next = [lightgray] tutorial.intro = Você entrou no[scarlet] Tutorial do Mindustry.[]\nComeçe[accent] minerando cobre[]. Toque em um veio de minério de cobre para fazer isso.\n\n[accent]{0}/{1} copper +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 = Minerar manualmente é ineficiente.\n[accent]Brocas []podem minerar automaticamente.\nColoque uma num veio de cobre. tutorial.drill.mobile = Minerar manualmente é ineficiente.\n[accent]Brocas []podem minerar automaticamente.\nToque na aba de brocas no canto inferior direito.\nSelecione a[accent] broca mecânica[].\nToque em um veio de cobre para colocá-la, então pressione a[accent] marca de verificação[] abaixo para confirmar sua seleção.\nPressione o[accent] botão "X"[] para cancelar o posicionamento. tutorial.blockinfo = Cada bloco tem diferentes status. Cada broca pode extrair certos minérios.\nPara checar as informações e os status de um bloco,[accent] toque o botão "?" enquanto o seleciona no menu de construção.[]\n\n[accent]Acesse os status da broca mecânica agora.[] @@ -1051,6 +1067,8 @@ 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.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.phase-wall.description = Um muro revestido com um composto especial baseado em tecido de fase. Desvia a maioria das balas no impacto. @@ -1070,7 +1088,7 @@ block.junction.description = Funciona como uma ponte Para duas esteiras que este block.bridge-conveyor.description = Bloco de transporte de itens avancado. Possibilita o transporte de itens acima de 3 blocos de construção ou paredes. block.phase-conveyor.description = Bloco de transporte de item avançado. Usa energia para teleportar itens a uma esteira de fase sobre uma severa distancia. block.sorter.description = [interact]Aperte no bloco para configurar[] -block.inverted-sorter.descriptions = Processes items like a standard sorter, but outputs selected items to the sides instead. +block.inverted-sorter.description = Processes items like a standard sorter, but outputs selected items to the sides instead. block.router.description = Aceita itens de uma direção e os divide em 3 direções igualmente. Util para espalhar materiais da fonte para multiplos alvos. block.distributor.description = Um roteador avancada que espalhas os itens em 7 outras direções igualmente. block.overflow-gate.description = Uma combinação de roteador e divisor Que apenas manda para a esquerda e Direita se a frente estiver bloqueada. diff --git a/core/assets/bundles/bundle_pt_BR.properties b/core/assets/bundles/bundle_pt_BR.properties index 169b5c0673..ea74cce62e 100644 --- a/core/assets/bundles/bundle_pt_BR.properties +++ b/core/assets/bundles/bundle_pt_BR.properties @@ -1,41 +1,43 @@ -credits.text = Created by [ROYAL]Anuken[] - [SKY]anukendev@gmail.com[] +credits.text = Criado por [ROYAL]Anuken[] - [SKY]anukendev@gmail.com[] credits = Créditos contributors = Tradutores e contribuidores discord = Junte-se ao Discord do Mindustry! (Lá nós falamos em inglês) link.discord.description = O discord oficial do Mindustry +link.reddit.description = O subreddit do Mindustry link.github.description = Código fonte do jogo. link.changelog.description = Lista de mudanças da atualização -link.dev-builds.description = Desenvolvimentos Instáveis -link.trello.description = Trello Oficial para Updates Planejados -link.itch.io.description = Pagina da Itch.io com os Downloads -link.google-play.description = Listamento do google play store +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.wiki.description = Wiki oficial do Mindustry linkfail = Falha ao abrir o link\nO Url foi copiado screenshot = Screenshot salvo para {0} -screenshot.invalid = Mapa grande demais, Potencialmente sem memória suficiente para captura. +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 = Copied. +copied = Copiado load.sound = Sons load.map = Mapas load.image = Imagens load.content = Conteúdo load.system = Sistema load.mod = Mods -schematic = Schematic -schematic.add = Save Schematic... -schematics = Schematics -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 = Esquema +schematic.add = Salvar Esquema... +schematics = Esquemas +schematic.replace = Um Esquema com esse nome já existe. Substituí-lo? +schematic.import = Importar Esquema... +schematic.exportfile = Exportar arquivo +schematic.importfile = Importar arquivo +schematic.browseworkshop = Navegar pela Oficina +schematic.copy = Copiar para a área de transferência +schematic.copy.import = Importar da área de transferência +schematic.shareworkshop = Compartilhar na Oficina +schematic.flip = [accent][[{0}][]/[accent][[{1}][]: Virar o Esquema +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} @@ -44,9 +46,9 @@ stat.built = Construções construídas:[accent] {0} stat.destroyed = Construções destruídas:[accent] {0} stat.deconstructed = Construções desconstruídas:[accent] {0} stat.delivered = Recursos lançados: -stat.rank = Rank Final: [accent]{0} +stat.rank = Classificação Final: [accent]{0} launcheditems = [accent]Itens lançados -launchinfo = [unlaunched][[LAUNCH] your core to obtain the items indicated in blue. +launchinfo = [unlaunched][[LANCE] seu núcleo para obter os itens indicados em azul. map.delete = Certeza que quer deletar o mapa "[accent]{0}[]"? level.highscore = Melhor\npontuação: [accent] {0} level.select = Seleção de Fase @@ -54,15 +56,15 @@ level.mode = Modo de Jogo: showagain = Não mostrar na proxima sessão coreattack = < O núcleo está sobre ataque! > nearpoint = [[ [scarlet]SAIA DO PONTO DE SPAWN IMEDIATAMENTE[] ]\nANIQUILAÇÃO IMINENTE -database = banco do núcleo +database = Banco de dados savegame = Salvar Jogo loadgame = Carregar Jogo joingame = Entrar no Jogo -customgame = Jogo Customi-/nzado +customgame = Jogo Customi-\nzado newgame = Novo Jogo none = minimap = Mini-Mapa -position = Position +position = Posição close = Fechar website = Site quit = Sair @@ -75,58 +77,63 @@ invalid = Inválido preparingconfig = Preparando configuração preparingcontent = Preparando conteúdo uploadingcontent = Fazendo upload do conteúdo -uploadingpreviewfile = Fazendo upload do arquivo de pré visualização +uploadingpreviewfile = Fazendo upload do arquivo de pré-visualização committingchanges = Enviando mudanças done = Feito -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. +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 -mods.none = [LIGHT_GRAY]No mods found! -mods.guide = Modding Guide -mods.report = Report Bug -mod.enabled = [lightgray]Enabled -mod.disabled = [scarlet]Disabled -mod.disable = Disable -mod.enable = Enable -mod.requiresrestart = The game will now close to apply the mod changes. -mod.reloadrequired = [scarlet]Reload Required -mod.import = Import Mod -mod.import.github = Import Github Mod -mod.remove.confirm = This mod will be deleted. +mods.none = [LIGHT_GRAY]Nenhum Mod encontrado! +mods.guide = Guia de Mods +mods.report = Reportar um Bug +mods.openfolder = Abrir pasta de Mods +mod.enabled = [lightgray]Ativado +mod.disabled = [scarlet]Desativado +mod.disable = Desativar +mod.delete.error = Incapaz de deletar o Mod. O arquivo talvez esteja em uso. +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.enable = Ativar +mod.requiresrestart = O jogo irá fechar para aplicar as mudanças do Mod. +mod.reloadrequired = [scarlet]Recarregamento necessário +mod.import = Importar Mod +mod.import.github = Importar Mod do GitHub +mod.remove.confirm = Esse Mod será deletado. 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.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. filename = Nome do arquivo: -unlocked = Novo bloco Desbloqueado! +unlocked = Novo bloco desbloqueado! completed = [accent]Completado techtree = Árvore de tecnologia research.list = [LIGHT_GRAY]Pesquise: -research = Pesquisa -researched = [LIGHT_GRAY]{0} pesquisado. +research = Pesquisar +researched = [LIGHT_GRAY]{0} Pesquisado. players = {0} Jogadores Ativos players.single = {0} Jogador Ativo server.closing = [accent]Fechando servidor... -server.kicked.kick = Voce foi expulso do servidor! +server.kicked.kick = Você foi expulso do servidor! server.kicked.whitelist = Você não está na lista branca do servidor. server.kicked.serverClose = Servidor Fechado. server.kicked.vote = Você foi expulso desse servidor. Adeus. server.kicked.clientOutdated = Cliente desatualizado! Atualize seu jogo! -server.kicked.serverOutdated = Servidor desatualiado! Peça ao dono para atualizar! +server.kicked.serverOutdated = Servidor desatualizado! Peça ao dono para atualizar! server.kicked.banned = Você foi banido do servidor. server.kicked.typeMismatch = Este servidor não é compatível com a sua versão. server.kicked.playerLimit = Este servidor está cheio. Espere por uma vaga. -server.kicked.recentKick = Voce foi expulso recentemente.\nEspere para conectar de novo. +server.kicked.recentKick = Voce foi expulso recentemente.\nEspere para se conectar de novo. server.kicked.nameInUse = Este nome já está sendo usado\nneste servidor. server.kicked.nameEmpty = Você deve ter pelo menos uma letra ou número no nome. server.kicked.idInUse = Você ja está neste servidor! Conectar com duas contas não é permitido. server.kicked.customClient = Este servidor não suporta versões customizadas. Baixe a versão original. server.kicked.gameover = Fim de jogo! server.versions = Sua versão:[accent] {0}[]\nVersão do servidor:[accent] {1}[] -host.info = The [accent]Hospedar[]Botão Hospeda um servidor no Host[scarlet]6567[] e [scarlet]6568.[]\nQualquer um no [LIGHT_GRAY]Wi-fi Ou Internet local[] Pode ver este servidor na lista de servidores.\n\nSe voce quer poder entrar em qualquer servidor em seu ip, [accent]port forwarding[] é requerido.\n\n[LIGHT_GRAY]Note: Se alguem esta com problemas em conectar no seu servidor lan, Tenha certeza que deixou mindustry Acessar sua internet local nas configurações de firewall +host.info = The [accent]Hospedar[]Botão Hospeda um servidor no Host[scarlet]6567[] e [scarlet]6568.[]\nQualquer um no [LIGHT_GRAY]Wi-fi Ou Internet local[] Pode ver este servidor na lista de servidores.\n\nSe voce quer poder entrar em qualquer servidor em seu ip, [accent]port forwarding[] é requerido.\n\n[LIGHT_GRAY]Note: Se alguém esta com problemas em conectar no seu servidor lan, Tenha certeza que deixou mindustry Acessar sua internet local nas configurações de firewall join.info = Aqui, você pode entar em um [accent]IP de servidor[] para conectar, ou descobrir [accent]servidores[] da rede local.\nAmbos os servidores LAN e WAN são suportados.\n\n[LIGHT_GRAY]Note: Não há uma lista de servidores automáticos; Se você quer conectar ao IP de alguém, você precisa pedir o IP ao anfitrião. hostserver = Hospedar servidor invitefriends = Convidar amigos @@ -194,8 +201,8 @@ save.newslot = Nome do salvamento: save.rename = Renomear save.rename.text = Novo jogo: selectslot = Selecione um lugar para salvar. -slot = [accent]Slot {0} -editmessage = Edit Message +slot = [accent]Conexões {0} +editmessage = Editar Mensagem save.corrupted = [accent]Arquivo corrompido ou inválido! empty = on = Ligado @@ -209,8 +216,8 @@ save.playtime = Tempo De Jogo: {0} warning = Aviso. confirm = Confirmar delete = Excluir -view.workshop = Ver na oficina -workshop.listing = Edit Workshop Listing +view.workshop = Ver na Oficina +workshop.listing = Editar a lista da Oficina ok = OK open = Abrir customize = Customizar @@ -228,12 +235,12 @@ classic.export.text = [accent]Mindustry[] acabou de ter uma grande atualização quit.confirm = Você tem certeza que quer sair? quit.confirm.tutorial = Você tem certeza você sabe o que você esta fazendo?\nO tutorial pode ser refeito nas [accent] Configurações->Jogo->Refazer Tutorial.[] loading = [accent]Carregando... -reloading = [accent]Reloading Mods... +reloading = [accent]Recarregando Mods... saving = [accent]Salvando... -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}][] para cancelar a construção +selectschematic = [accent][[{0}][] para selecionar+copiar +pausebuilding = [accent][[{0}][] para parar a construção +resumebuilding = [scarlet][[{0}][] para continuar a construção wave = [accent]Horda {0} wave.waiting = Horda em {0} wave.waveInProgress = [LIGHT_GRAY]Horda Em Progresso @@ -252,17 +259,18 @@ map.nospawn = Este mapa não possui nenhum núcleo para o jogador nascer! Adicio map.nospawn.pvp = Esse mapa não tem núcleos inimigos para os jogadores nascerem! Adicione[SCARLET] Núcleos vermelhos[] no mapa no editor. map.nospawn.attack = Esse mapa não tem nenhum núcleo inimigo para o jogador atacar! coloque[SCARLET] Núcleos[] vermelhos no editor. map.invalid = Erro ao carregar o mapa: Arquivo de mapa invalido ou corrupto. -workshop.update = Update Item -workshop.error = Error fetching workshop details: {0} +workshop.update = Atualizar Item +workshop.error = Erro buscando os detalhes da Oficina: {0} map.publish.confirm = Você tem certeza de que quer publicar este mapa?\n\n[lightgray]Tenha certeza de que você concorda com o EULA da oficina primeiro, ou seus mapas não serão mostrados! -workshop.menu = Select what you would like to do with this item. -workshop.info = Item Info +workshop.menu = Selecione oquê você gostaria de fazer com esse Item. +workshop.info = Informação do Item changelog = Changelog (optional): -eula = EULA do Steam +eula = EULA da Steam 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} +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 @@ -275,7 +283,7 @@ editor.waves = Hordas: editor.rules = Regras: editor.generation = Geração: editor.ingame = Editar em jogo -editor.publish.workshop = Publicar na oficina +editor.publish.workshop = Publicar na Oficina editor.newmap = Novo mapa workshop = Oficina waves.title = Hordas @@ -286,7 +294,7 @@ waves.waves = Hordas(s) waves.perspawn = por spawn waves.to = para waves.boss = Chefe -waves.preview = Pré visualizar +waves.preview = Pré-visualizar waves.edit = Editar... waves.copy = Copiar para área de transferência waves.load = Carregar da área de transferência @@ -388,13 +396,13 @@ width = Largura: height = Altura: menu = Menu play = Jogar -campaign = Campa-/nnha +campaign = Campa-\nnha load = Carregar save = Salvar fps = FPS: {0} ping = Ping: {0}ms language.restart = Por favor, reinicie seu jogo para a tradução tomar efeito. -settings = Configu-/nrações +settings = Configu-\nrações tutorial = Tutorial tutorial.retake = Refazer Tutorial editor = Editor @@ -403,9 +411,9 @@ abandon = Abandonar abandon.text = Esta zona e todos os seus recursos serão perdidos para o inimigo. locked = Trancado complete = [LIGHT_GRAY]Completo: -requirement.wave = Reach Wave {0} in {1} -requirement.core = Destroy Enemy Core in {0} -requirement.unlock = Unlock {0} +requirement.wave = Alcançar a Horda {0} em {1} +requirement.core = Destruir o núcleo inimigo em {0} +requirement.unlock = Desbloquear {0} resume = Resumir Zona:\n[LIGHT_GRAY]{0} bestwave = [LIGHT_GRAY]Melhor: {0} launch = Lançar @@ -416,19 +424,19 @@ launch.confirm = Isto vai lançar todos os seus recursos no seu núcleo.\nVoce n launch.skip.confirm = Se você pular a horda agora, você não será capaz de lançar até hordas mais avançadas. uncover = Descobrir configure = Configurar carregamento -bannedblocks = Banned Blocks -addall = Add All +bannedblocks = Blocos Banidos +addall = Adicionar Todos configure.locked = [LIGHT_GRAY]Alcançe a horda {0}\npara configurar o carregamento. configure.invalid = A quantidade deve ser um número entre 0 e {0}. zone.unlocked = [LIGHT_GRAY]{0} Desbloqueado. zone.requirement.complete = Horda {0} alcançada:\n{1} Requerimentos da zona alcançada. -zone.config.unlocked = Loadout unlocked:[lightgray]\n{0} +zone.config.unlocked = Equipamento desbloqueado:[lightgray]\n{0} zone.resources = Recursos detectados: zone.objective = [lightgray]Objetivo: [accent]{0} zone.objective.survival = Sobreviver zone.objective.attack = Destruir o núcleo inimigo add = Adicionar... -boss.health = Saúde do chefe +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. @@ -467,7 +475,7 @@ 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 = Linguagem +settings.language = Idioma settings.data = Dados do jogo settings.reset = Restaurar Padrões settings.rebind = Religar @@ -477,30 +485,31 @@ 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 toda a data, Incluindo saves, mapas, Keybinds e desbloqueados.\nQuando apertar 'ok' Vai apagar toda a data e sair automaticamente. +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. paused = Pausado clear = Clear -banned = [scarlet]Banned +banned = [scarlet]Banido yes = Sim no = Não info.title = [accent]Informação error.title = [crimson]Ocorreu um Erro. error.crashtitle = Ocorreu um Erro blocks.input = Entrada -blocks.output = Saida +blocks.output = Saída blocks.booster = Booster block.unknown = [LIGHT_GRAY]??? blocks.powercapacity = Capacidade de Energia blocks.powershot = Energia/tiro blocks.damage = Dano -blocks.targetsair = Mirar no ar -blocks.targetsground = Mirar no chão +blocks.targetsair = Mira no ar +blocks.targetsground = Mira no chão blocks.itemsmoved = Velocidade de movimento -blocks.launchtime = Tempo entre tiros +blocks.launchtime = Tempo entre Disparos. blocks.shootrange = Alcance blocks.size = Tamanho blocks.liquidcapacity = Capacidade de Líquido blocks.powerrange = Alcance da Energia +blocks.powerconnections = Conexões Máximas blocks.poweruse = Uso de energia blocks.powerdamage = Dano/Poder blocks.itemcapacity = Capacidade de Itens @@ -510,8 +519,8 @@ blocks.repairtime = Tempo de reparo total do bloco blocks.speedincrease = Aumento de velocidade blocks.range = Distância blocks.drilltier = Furáveis -blocks.drillspeed = Velocidade da broca base -blocks.boosteffect = Efeito do Boost +blocks.drillspeed = Velocidade base da Broca +blocks.boosteffect = Efeito do Impulso blocks.maxunits = Máximo de unidades ativas blocks.health = Saúde blocks.buildtime = Tempo de construção @@ -521,7 +530,8 @@ 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.drillspeed = Velocidade da Broca: {0}/s +bar.pumpspeed = Velocidade da Bomna: {0}/s bar.efficiency = Eficiência: {0}% bar.powerbalance = Energia: {0} bar.powerstored = Armazenada: {0}/{1} @@ -534,7 +544,7 @@ bar.heat = Aquecimento bar.power = Poder bar.progress = Progresso da construção bar.spawned = Unidades: {0}/{1} -bullet.damage = [stat]{0}[lightgray] dano +bullet.damage = [stat]{0}[lightgray] Dano bullet.splashdamage = [stat]{0}[lightgray] Dano em área ~[stat] {1}[lightgray] Blocos bullet.incendiary = [stat]Incendiário bullet.homing = [stat]Guiado @@ -566,8 +576,9 @@ category.shooting = Atirando category.optional = Melhoras opcionais setting.landscape.name = Travar panorama setting.shadows.name = Sombras +setting.blockreplace.name = Automatic Block Suggestions setting.linear.name = Filtragem linear -setting.hints.name = Hints +setting.hints.name = Dicas setting.animatedwater.name = Água animada setting.animatedshields.name = Escudos animados setting.antialias.name = Filtro suavizante[LIGHT_GRAY] (reinicialização requerida)[] @@ -588,8 +599,10 @@ setting.difficulty.insane = Insano 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.sensitivity.name = Sensibilidade do Controle -setting.saveinterval.name = Intervalo de autosalvamento +setting.saveinterval.name = Intervalo de Auto Salvamento setting.seconds = {0} Segundos setting.fullscreen.name = Tela Cheia setting.borderlesswindow.name = Janela sem borda[LIGHT_GRAY] (Pode precisar reiniciar) @@ -597,19 +610,19 @@ setting.fps.name = Mostrar FPS setting.vsync.name = VSync setting.pixelate.name = Pixelizado [LIGHT_GRAY](Pode diminuir a performace) setting.minimap.name = Mostrar minimapa -setting.position.name = Show Player Position +setting.position.name = Mostrar a posição do Jogador setting.musicvol.name = Volume da Música -setting.ambientvol.name = Volume do ambiente +setting.ambientvol.name = Volume do Ambiente setting.mutemusic.name = Desligar Música setting.sfxvol.name = Volume de Efeitos setting.mutesound.name = Desligar Som -setting.crashreport.name = Enviar denuncias de crash anonimas +setting.crashreport.name = Enviar denúncias anônimas de erros setting.savecreate.name = Criar salvamentos automaticamente setting.publichost.name = Visibilidade do jogo público setting.chatopacity.name = Opacidade do chat -setting.lasersopacity.name = Power Laser Opacity +setting.lasersopacity.name = Opacidade do laser setting.playerchat.name = Mostrar chat em jogo -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.confirm = Você quer fazer sua partida pública?\n[accent]Qualquer um será capaz de entrar na sua partida.\n[lightgray]Isso pode ser mudado depois em Configurações->Jogo->Visibilidade da partida pública. public.beta = Note that beta versions of the game cannot make public lobbies. uiscale.reset = A escala da IU foi mudada.\nPressione "OK" para confirmar esta escala.\n[scarlet]Revertendo e saindo em[accent] {0}[] settings... uiscale.cancel = Cancelar e sair @@ -628,10 +641,10 @@ 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.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 = 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.fullscreen.name = Alterar tela cheia keybind.select.name = selecionar keybind.diagonal_placement.name = Colocação diagonal @@ -639,18 +652,18 @@ keybind.pick.name = Pegar bloco keybind.break_block.name = Quebrar bloco keybind.deselect.name = Deselecionar keybind.shoot.name = Atirar -keybind.zoom_hold.name = segurar_zoom +keybind.zoom_hold.name = segurar Zoom keybind.zoom.name = Zoom keybind.menu.name = Menu keybind.pause.name = Pausar -keybind.pause_building.name = Pause/Resume Building +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 +keybind.console.name = Console keybind.rotate.name = Girar -keybind.rotateplaced.name = Rotate Existing (Hold) +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 @@ -695,7 +708,7 @@ rules.title.player = Jogadores rules.title.enemy = Inimigos rules.title.unit = Unidades content.item.name = Itens -content.liquid.name = Liquidos +content.liquid.name = Líquidos content.unit.name = Unidades content.block.name = Blocos content.mech.name = Armaduras @@ -704,7 +717,7 @@ item.lead.name = Chumbo item.coal.name = Carvão item.graphite.name = Grafite item.titanium.name = Titânio -item.thorium.name = Urânio +item.thorium.name = Tório item.silicon.name = Sílicio item.plastanium.name = Plastânio item.phase-fabric.name = Tecido de fase @@ -718,7 +731,7 @@ item.scrap.name = Sucata liquid.water.name = Água liquid.slag.name = Escória liquid.oil.name = Petróleo -liquid.cryofluid.name = Crio Fluido +liquid.cryofluid.name = Fluído Criogênico mech.alpha-mech.name = Alfa mech.alpha-mech.weapon = Repetidor pesado mech.alpha-mech.ability = Regeneração @@ -768,11 +781,11 @@ block.rock.name = Rocha block.snowrock.name = Rocha com neve block.snow-pine.name = Pinheiro com neve block.shale.name = Xisto -block.shale-boulder.name = Pedra de xisto +block.shale-boulder.name = Pedra de Xisto block.moss.name = Musgo block.shrubs.name = Arbusto -block.spore-moss.name = Musgo de esporos -block.shalerocks.name = Rohas de xisto +block.spore-moss.name = Musgo de Esporos +block.shalerocks.name = Rochas de Xisto block.scrap-wall.name = Muro de sucata block.scrap-wall-large.name = Muro grande de sucata block.scrap-wall-huge.name = Muro enorme de sucata @@ -826,14 +839,16 @@ block.ignarock.name = Rocha ígnea block.hotrock.name = Rocha quente block.magmarock.name = Rocha de magma block.cliffs.name = Colinas -block.copper-wall.name = Parede de Cobre -block.copper-wall-large.name = Parede de Cobre Grande -block.titanium-wall.name = Parede de titânio -block.titanium-wall-large.name = Parede de titânio grande -block.phase-wall.name = Parede de fase -block.phase-wall-large.name = Parde de fase grande -block.thorium-wall.name = Parede de tório -block.thorium-wall-large.name = Parede de tório grande +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-large.name = Muro de Plastânio Grande +block.phase-wall.name = Muro de Fase +block.phase-wall-large.name = Muro de Fase Grande +block.thorium-wall.name = Muro de Tório +block.thorium-wall-large.name = Muro de Tório Grande block.door.name = Porta block.door-large.name = Porta Grande block.duo.name = Dupla @@ -849,7 +864,7 @@ block.junction.name = Junção block.router.name = Roteador block.distributor.name = Distribuidor block.sorter.name = Ordenador -block.inverted-sorter.name = Inverted Sorter +block.inverted-sorter.name = Ordenador Invertido block.message.name = Mensagem block.overflow-gate.name = Portão Sobrecarregado block.silicon-smelter.name = Fundidora de silicio @@ -902,7 +917,7 @@ block.pyratite-mixer.name = Misturador de Piratita block.blast-mixer.name = Misturador de Explosão block.solar-panel.name = Painel Solar block.solar-panel-large.name = Painel Solar Grande -block.oil-extractor.name = Extrator de petróleo +block.oil-extractor.name = Extrator de Petróleo block.command-center.name = Centro de comando block.draug-factory.name = Fábrica de drone de mineração Draug block.spirit-factory.name = Fábrica de drone de reparo Spirit @@ -923,7 +938,7 @@ block.liquid-junction.name = Junção de Líquido block.bridge-conduit.name = Cano Ponte block.rotary-pump.name = Bomba Rotatória block.thorium-reactor.name = Reator a Tório -block.mass-driver.name = Drive de Massa +block.mass-driver.name = Catapulta Eletromagnética block.blast-drill.name = Broca de Explosão block.thermal-pump.name = Bomba térmica block.thermal-generator.name = Gerador Térmico @@ -945,12 +960,12 @@ 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 = Vermelho -team.sharded.name = orange +team.crux.name = Vermelha +team.sharded.name = Estilhaçada team.orange.name = Laranja -team.derelict.name = derelict +team.derelict.name = Abandonada team.green.name = Verde -team.purple.name = Roxo +team.purple.name = Roxa unit.spirit.name = Drone Spirit unit.draug.name = Drone minerador Draug unit.phantom.name = Drone Phantom @@ -960,7 +975,7 @@ unit.titan.name = Titan unit.ghoul.name = Bombardeiro Ghoul unit.wraith.name = Lutador Wraith unit.fortress.name = Fortaleza -unit.revenant.name = Revenant +unit.revenant.name = Revenã unit.eruptor.name = Eruptor unit.chaos-array.name = Arraia do caos unit.eradicator.name = Erradicador @@ -968,6 +983,7 @@ unit.lich.name = Lich unit.reaper.name = Ceifador tutorial.next = [lightgray] tutorial.intro = Você entrou no[scarlet] Tutorial do Mindustry.[]\nComeçe[accent] minerando cobre[]. Toque em um veio de minério de cobre para fazer isso.\n\n[accent]{0}/{1} copper +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 = Minerar manualmente é ineficiente.\n[accent]Brocas []podem minerar automaticamente.\nColoque uma num veio de cobre. tutorial.drill.mobile = Minerar manualmente é ineficiente.\n[accent]Brocas []podem minerar automaticamente.\nToque na aba de brocas no canto inferior direito.\nSelecione a[accent] broca mecânica[].\nToque em um veio de cobre para colocá-la, então pressione a[accent] marca de verificação[] abaixo para confirmar sua seleção.\nPressione o[accent] botão "X"[] para cancelar o posicionamento. tutorial.blockinfo = Cada bloco tem diferentes status. Cada broca pode extrair certos minérios.\nPara checar as informações e os status de um bloco,[accent] toque o botão "?" enquanto o seleciona no menu de construção.[]\n\n[accent]Acesse os status da broca mecânica agora.[] @@ -1051,6 +1067,8 @@ 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.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.phase-wall.description = Um muro revestido com um composto especial baseado em tecido de fase. Desvia a maioria das balas no impacto. @@ -1070,7 +1088,7 @@ block.junction.description = Funciona como uma ponte Para duas esteiras que este block.bridge-conveyor.description = Bloco de transporte de itens avancado. Possibilita o transporte de itens acima de 3 blocos de construção ou paredes. block.phase-conveyor.description = Bloco de transporte de item avançado. Usa energia para teleportar itens a uma esteira de fase sobre uma severa distancia. block.sorter.description = [interact]Aperte no bloco para configurar[] -block.inverted-sorter.descriptions = Processes items like a standard sorter, but outputs selected items to the sides instead. +block.inverted-sorter.description = Processes items like a standard sorter, but outputs selected items to the sides instead. block.router.description = Aceita itens de uma direção e os divide em 3 direções igualmente. Util para espalhar materiais da fonte para multiplos alvos. block.distributor.description = Um roteador avancada que espalhas os itens em 7 outras direções igualmente. block.overflow-gate.description = Uma combinação de roteador e divisor Que apenas manda para a esquerda e Direita se a frente estiver bloqueada. @@ -1093,10 +1111,10 @@ block.battery-large.description = Guarda muito mais energia que uma beteria comu block.combustion-generator.description = Gera energia usando combustível ou petróleo. block.thermal-generator.description = Gera uma quantidade grande de energia usando lava. block.turbine-generator.description = Mais eficiente que o gerador de Combustão, Mas requer agua adicional. -block.differential-generator.description = Generates large amounts of energy. Utilizes the temperature difference between cryofluid and burning pyratite. -block.rtg-generator.description = Um Gerador termoelétrico de radioisótopos Que não precisa de refriamento Mas da muito menos energia que o reator de torio. +block.differential-generator.description = Gera grandes quantidades de Energia. Utiliza a diferença de temperatura entre o Fluído 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 = Da muito mais energia que o painel solar comum, Mas sua produção é mais cara. +block.solar-panel-large.description = Dá muito mais energia que o painel solar comum, Mas sua produção é mais cara. 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. @@ -1115,17 +1133,17 @@ block.unloader.description = Descarrega itens de um container, Descarrega em uma block.launch-pad.description = Lança montes de itens sem qualquer necessidade de um lançamento de núcleo. block.launch-pad-large.description = Uma versão melhorada da plataforma de lançamento. Guarda mais itens. Lança mais frequentemente. block.duo.description = Uma torre pequena e barata. -block.scatter.description = Uma torre anti aerea media. Joga montes de cobre ou sucata aos inimigos. -block.scorch.description = Queima qualquer inimigo terrestre próximo. Altamente efetivo a curta distncia. +block.scatter.description = Uma torre anti aérea média. Joga montes de cobre ou sucata aos inimigos. +block.scorch.description = Queima qualquer inimigo terrestre próximo. Altamente efetivo a curta distância. block.hail.description = Uma pequena torre de artilharia. -block.wave.description = Uma torre que Tamanho medio que atira bolhas. -block.lancer.description = Uma torre de Tamanho-Medio que atira raios de eletricidade. -block.arc.description = Uma pequena torre que atira eletricidade em um pequeno arc aleatoriamente no inimigo. -block.swarmer.description = Uma torre media que atira ondas de misseis. -block.salvo.description = Uma torre media que da tiros em salvos. -block.fuse.description = Uma torre grande que atira raios de curta distancia poderosos. +block.wave.description = Uma torre de tamanho médio que atira bolhas. +block.lancer.description = Uma torre de tamanho médio que atira raios de eletricidade. +block.arc.description = Uma pequena torre que atira eletricidade em um pequeno arco. +block.swarmer.description = Uma torre média que atira ondas de mísseis. +block.salvo.description = Uma torre média que da tiros em salvos. +block.fuse.description = Uma torre grande que atira raios de curta distância poderosos. block.ripple.description = Uma grande torre que atira simultaneamente. -block.cyclone.description = Uma grande torre de tiro rapido. +block.cyclone.description = Uma grande torre de tiro rápido. block.spectre.description = Uma grande torre que da dois tiros poderosos ao mesmo tempo. block.meltdown.description = Uma grande torre que atira dois raios poderosos ao mesmo tempo. block.command-center.description = Emite comandos de movimento para unidades aliadas através do mapa.\nFaz unidades se reagruparem, atacarem um núcleo inimigo ou recuar para o núcleo/fábrica. Quando não há nucleo inimigo, unidades vão ficar perto da área de spawn dos inimigos sob o comando atacar. @@ -1136,14 +1154,14 @@ block.wraith-factory.description = Produz unidades rápidas hit-and-run (atacar block.ghoul-factory.description = Produz bombardeiros pesados. block.revenant-factory.description = Produz unidades laser, pesadas e terrestres. block.dagger-factory.description = Produz unidades terrestres. -block.crawler-factory.description = Produces fast self-destructing swarm units. +block.crawler-factory.description = Produz unidades terrestres de auto destruição. block.titan-factory.description = Produz unidades avancadas, armaduradas e terrestres. block.fortress-factory.description = Produz unidades terrestres pesadas de artilharia. block.repair-point.description = Continuamente repara a unidade danificada mais proxima. -block.dart-mech-pad.description = Provides transformation into a basic attack mech.\nUse by tapping while standing on it. -block.delta-mech-pad.description = Deixe sua atual embarcação e mude para o rapido, Levemente armadurado meca feito para ataques rapidos.\nUse o pad clicando duas vezes em cima enquando fica em cima dele. -block.tau-mech-pad.description = Deixe sua atual embarcação e mude para o meca de suporte que pode consertar construções aliadas e unidades.\nUse o pad clicando duas vezes em cima enquando fica em cima dele. -block.omega-mech-pad.description = Deixe sua atual embarcação e mude para o volumoso e bem armadurado meca feito para ataques da primeira linha.\nUse o pad clicando duas vezes em cima enquando fica em cima dele. -block.javelin-ship-pad.description = Deixe sua atual embarcação e mude para um interceptador forte e rapido com armas de raio.\nUse o pad clicando duas vezes em cima enquando fica em cima dele. -block.trident-ship-pad.description = Deixe sua atual embarcação e mude para um bombardeiro resionavelmente bem armadurado.\nUse o pad clicando duas vezes em cima enquando fica em cima dele. -block.glaive-ship-pad.description = Deixe sua atual embarcação e mude para grande, bem armadurada nave de combate.\nUse o pad clicando duas vezes em cima enquando fica em cima dele. +block.dart-mech-pad.description = Deixe a sua atual embarcação e mude para um mecha de ataque básico.\nUse o Pad clicandk duas vezes em cima enquanto fica em cima dele +block.delta-mech-pad.description = Deixe sua atual embarcação e mude para o rápido e levemente armadurado meca feito para ataques rapidos.\nUse o pad clicando duas vezes em cima enquanto fica em cima dele. +block.tau-mech-pad.description = Deixe sua atual embarcação e mude para o mecha de suporte que pode consertar construções aliadas e unidades.\nUse o pad clicando duas vezes em cima enquanto fica em cima dele. +block.omega-mech-pad.description = Deixe sua atual embarcação e mude para o volumoso e bem armadurado mecha feito para ataques da primeira linha.\nUse o pad clicando duas vezes em cima enquanto fica em cima dele. +block.javelin-ship-pad.description = Deixe sua atual embarcação e mude para um interceptador forte e rápido com armas de raio.\nUse o pad clicando duas vezes em cima enquanto fica em cima dele. +block.trident-ship-pad.description = Deixe sua atual embarcação e mude para um bombardeiro razoavelmente bem armadurado.\nUse o pad clicando duas vezes em cima enquanto fica em cima dele. +block.glaive-ship-pad.description = Deixe sua atual embarcação e mude para uma grande e bem armadurada nave de combate.\nUse o pad clicando duas vezes em cima enquanto fica em cima dele. diff --git a/core/assets/bundles/bundle_ru.properties b/core/assets/bundles/bundle_ru.properties index e7d4e519fc..9aea576303 100644 --- a/core/assets/bundles/bundle_ru.properties +++ b/core/assets/bundles/bundle_ru.properties @@ -105,7 +105,7 @@ mod.enable = Вкл. mod.requiresrestart = Теперь игра закроется, чтобы применить изменения в модификациях. mod.reloadrequired = [scarlet]Необходим перезапуск mod.import = Импортировать модификацию -mod.import.github = Импортировать модификацию с Github +mod.import.github = Импортировать модификацию с GitHub mod.remove.confirm = Этот мод будет удалён. mod.author = [LIGHT_GRAY]Автор:[] {0} mod.missing = Это сохранение содержит модификацию, которое Вы недавно обновили или оно больше не установлено. Может случиться повреждение сохранения. Вы уверены, что хотите загрузить его?\n[lightgray]Модификации:\n{0} diff --git a/core/assets/bundles/bundle_sv.properties b/core/assets/bundles/bundle_sv.properties index e395024fd0..f01aa8b241 100644 --- a/core/assets/bundles/bundle_sv.properties +++ b/core/assets/bundles/bundle_sv.properties @@ -3,6 +3,7 @@ credits = Credits contributors = Översättare och bidragsgivare discord = Gå med Mindustry:s Discord server! link.discord.description = Officiella chattrummet för Mindustry +link.reddit.description = The Mindustry subreddit link.github.description = Spelets källkod link.changelog.description = Lista av uppdateringar link.dev-builds.description = Unstable development builds @@ -26,6 +27,7 @@ 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 @@ -78,20 +80,25 @@ uploadingcontent = Laddar upp innehåll uploadingpreviewfile = Laddar upp förhandsgranskningsfil committingchanges = Comitting Changes done = Klar -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. +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.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} @@ -263,6 +270,7 @@ missing = This item has been deleted or moved.\n[lightgray]The workshop listing 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} editor.brush = Pensel editor.openin = Open In Editor editor.oregen = Ore Generation @@ -501,6 +509,7 @@ blocks.shootrange = Range blocks.size = Storlek blocks.liquidcapacity = Liquid Capacity blocks.powerrange = Power Range +blocks.powerconnections = Max Connections blocks.poweruse = Power Use blocks.powerdamage = Power/Damage blocks.itemcapacity = Item Capacity @@ -522,6 +531,7 @@ blocks.reload = Shots/Second blocks.ammo = Ammunition bar.drilltierreq = Bättre Borr Krävs bar.drillspeed = Drill Speed: {0}/s +bar.pumpspeed = Pump Speed: {0}/s bar.efficiency = Effektivitet: {0}% bar.powerbalance = Power: {0}/s bar.powerstored = Stored: {0}/{1} @@ -566,6 +576,7 @@ category.shooting = Skjutning category.optional = Optional Enhancements setting.landscape.name = Lock Landscape setting.shadows.name = Skuggor +setting.blockreplace.name = Automatic Block Suggestions setting.linear.name = Linear Filtering setting.hints.name = Hints setting.animatedwater.name = Animerat Vatten @@ -588,6 +599,8 @@ setting.difficulty.insane = Galet setting.difficulty.name = Svårighetsgrad: setting.screenshake.name = Skärmskak setting.effects.name = Visa Effekter +setting.destroyedblocks.name = Display Destroyed Blocks +setting.conveyorpathfinding.name = Conveyor Placement Pathfinding setting.sensitivity.name = Controller Sensitivity setting.saveinterval.name = Save Interval setting.seconds = {0} Sekunder @@ -830,6 +843,8 @@ block.copper-wall.name = Kopparvägg block.copper-wall-large.name = Stor Kopparvägg block.titanium-wall.name = Titanvägg block.titanium-wall-large.name = Stor Titanvägg +block.plastanium-wall.name = Plastanium Wall +block.plastanium-wall-large.name = Large Plastanium Wall block.phase-wall.name = Phasevägg block.phase-wall-large.name = Stor Phasevägg block.thorium-wall.name = Toriumvägg @@ -968,6 +983,7 @@ 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.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 = 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.[] @@ -1051,6 +1067,8 @@ block.copper-wall.description = A cheap defensive block.\nUseful for protecting 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.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.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. @@ -1070,7 +1088,7 @@ block.junction.description = Acts as a bridge for two crossing conveyor belts. U 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.inverted-sorter.descriptions = Processes items like a standard sorter, but outputs selected items to the sides instead. +block.inverted-sorter.description = Processes items like a standard sorter, but outputs selected items to the sides instead. 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. diff --git a/core/assets/bundles/bundle_tk.properties b/core/assets/bundles/bundle_tk.properties index 557617d16e..2fd55efb4d 100644 --- a/core/assets/bundles/bundle_tk.properties +++ b/core/assets/bundles/bundle_tk.properties @@ -3,6 +3,7 @@ credits = Emegi gecenler contributors = Translators and Contributors discord = Mindustry'in Discord'una katilin! link.discord.description = Orjinal Mindustry'in Discord Konusma Odasi +link.reddit.description = The Mindustry subreddit link.github.description = Oyunun Kodu link.changelog.description = List of update changes link.dev-builds.description = Bitirilmemis Yapim Surumu @@ -26,6 +27,7 @@ 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 @@ -78,20 +80,25 @@ uploadingcontent = Uploading Content uploadingpreviewfile = Uploading Preview File committingchanges = Comitting Changes done = Done -mods.alphainfo = Keep in mind that mods are in alpha, and[scarlet] may be very buggy[].\nReport any issues you find to the Mindustry Github or Discord. +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.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} @@ -263,6 +270,7 @@ missing = This item has been deleted or moved.\n[lightgray]The workshop listing 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} editor.brush = Firca editor.openin = Editorde ac editor.oregen = Maden Yaratilma hizi @@ -501,6 +509,7 @@ blocks.shootrange = Menzil blocks.size = Buyukluk blocks.liquidcapacity = Sivi kapasitesi blocks.powerrange = Menzil +blocks.powerconnections = Max Connections blocks.poweruse = Guc kullanimi blocks.powerdamage = Power/Damage blocks.itemcapacity = Esya kapasitesi @@ -522,6 +531,7 @@ blocks.reload = Yeniden doldurma blocks.ammo = Ammo bar.drilltierreq = Better Drill Required bar.drillspeed = Drill Speed: {0}/s +bar.pumpspeed = Pump Speed: {0}/s bar.efficiency = Efficiency: {0}% bar.powerbalance = Power: {0} bar.powerstored = Stored: {0}/{1} @@ -566,6 +576,7 @@ category.shooting = sikma category.optional = Optional Enhancements setting.landscape.name = Lock Landscape setting.shadows.name = Shadows +setting.blockreplace.name = Automatic Block Suggestions setting.linear.name = Linear Filtering setting.hints.name = Hints setting.animatedwater.name = Animated Water @@ -588,6 +599,8 @@ setting.difficulty.insane = cok zor setting.difficulty.name = Zorluk derecesi: setting.screenshake.name = Ekran sallanmasi setting.effects.name = Efekleri goster +setting.destroyedblocks.name = Display Destroyed Blocks +setting.conveyorpathfinding.name = Conveyor Placement Pathfinding setting.sensitivity.name = Kumanda hassasligi setting.saveinterval.name = Otomatik kaydetme suresi setting.seconds = {0} Saniye @@ -830,6 +843,8 @@ block.copper-wall.name = bakir duvar block.copper-wall-large.name = buyuk bakir duvar 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.phase-wall.name = faz duvar block.phase-wall-large.name = genis faz duvar block.thorium-wall.name = Toryum duvari @@ -968,6 +983,7 @@ 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.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 = Mining manually is inefficient.\n[accent]Drills []can mine automatically.\nPlace one on a copper vein. 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.[] @@ -1051,6 +1067,8 @@ block.copper-wall.description = A cheap defensive block.\nUseful for protecting 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.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.thorium-wall.description = A strong defensive block.\nGood protection from enemies. block.thorium-wall-large.description = A strong defensive block.\nGood protection from enemies.\nSpans multiple tiles. block.phase-wall.description = Not as strong as a thorium wall but will deflect bullets unless they are too powerful. @@ -1070,7 +1088,7 @@ block.junction.description = Acts as a bridge for two crossing conveyor belts. U 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 = esyalari secer. rengi ayni olan esya ileriden, digerleri sagdan ve soldan devam eder -block.inverted-sorter.descriptions = Processes items like a standard sorter, but outputs selected items to the sides instead. +block.inverted-sorter.description = Processes items like a standard sorter, but outputs selected items to the sides instead. block.router.description = Accepts items from one direction and outputs them to up to 3 other directions equally. Useful for splitting the materials from one source to multiple targets. block.distributor.description = An advanced router which splits items to up to 7 other directions equally. block.overflow-gate.description = sadece saga ve sola dagatir. onu kapalidir diff --git a/core/assets/bundles/bundle_tr.properties b/core/assets/bundles/bundle_tr.properties index e9e1a97614..9082a2ae3b 100644 --- a/core/assets/bundles/bundle_tr.properties +++ b/core/assets/bundles/bundle_tr.properties @@ -3,6 +3,7 @@ credits = Jenerik contributors = Çevirmenler ve Katkıda Bulunanlar discord = Mindustry'nin Discord sunucusuna Katıl! link.discord.description = Resmi Mindustry Discord sunucusu +link.reddit.description = The Mindustry subreddit link.github.description = Oyun kaynak kodu link.changelog.description = Güncelleme değişikliklerinin listesi link.dev-builds.description = Dengesiz oyun sürümleri @@ -17,17 +18,16 @@ gameover = Kaybettin gameover.pvp = [accent] {0}[] Takımı kazandı! highscore = [accent]Yeni rekor! copied = Panoya Kopyalandı. - load.sound = Sesler load.map = Haritalar load.image = Resimler load.content = İçerik load.system = Sistem load.mod = Modlar - schematic = Şema schematic.add = Şemayı Kaydet... schematics = Şemalar +schematic.replace = A schematic by that name already exists. Replace it? schematic.import = Şema İçeri Aktar... schematic.exportfile = Dışa Aktar schematic.importfile = İçe Aktar @@ -40,7 +40,6 @@ schematic.saved = Şema Kaydedildi. schematic.delete.confirm = Bu şema tamamen yokedilecek. schematic.rename = Şemayı yeniden Adlandır schematic.info = {0}x{1}, {2} blok - stat.wave = Yenilen Dalgalar:[accent] {0} stat.enemiesDestroyed = Yok Edilen Düşmanlar:[accent] {0} stat.built = İnşa Edilen Yapılar:[accent] {0} @@ -48,7 +47,6 @@ stat.destroyed = Yok Edilen Yapılar:[accent] {0} stat.deconstructed = Yıkılan Yapılar:[accent] {0} stat.delivered = Gönderilen Kaynaklar: stat.rank = Rütbe: [accent]{0} - launcheditems = [accent]Gönderilen Kaynaklar launchinfo = Mavi ile belirtilen materyallerden edinmek için [unlaunched][[KALKIŞ] yapın. map.delete = "[accent]{0}[]" haritasını silmek istediğine emin misin? @@ -82,27 +80,30 @@ uploadingcontent = İçerik Yükleniyor uploadingpreviewfile = Önizleme Dosyası Yükleniyor committingchanges = Değişiklikler Uygulanıyor done = Bitti - -mods.alphainfo = Modların alfa aşamasında olduğunu ve [scarlet]oldukça hatalı olabileceklerini[] unutmayın.\nBulduğunuz sorunları Mindustry Github'ı veya Discord'una bildirin. +feature.unsupported = Your device does not support this feature. +mods.alphainfo = Modların alfa aşamasında olduğunu ve [scarlet]oldukça hatalı olabileceklerini[] unutmayın.\nBulduğunuz sorunları Mindustry GitHub'ı veya Discord'una bildirin. mods.alpha = [accent](Alpha) mods = Modlar mods.none = [LIGHT_GRAY]Hiç mod bulunamadı! mods.guide = Mod Rehberi mods.report = Hata bildir +mods.openfolder = Open Mod Folder mod.enabled = [lightgray]Etkin mod.disabled = [scarlet]Devre Dışı mod.disable = Devre Dışı Bırak +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 = Etkinleştir mod.requiresrestart = Oyun mod değişikliklerini uygulamak için kapatılacak. mod.reloadrequired = [scarlet]Yeniden Yükleme Gerekli mod.import = Mod İçeri Aktar -mod.import.github = Github Modu İçeri Aktar +mod.import.github = GitHub Modu İçeri Aktar mod.remove.confirm = Bu mod silinecek. mod.author = [LIGHT_GRAY]Yayıncı:[] {0} mod.missing = Bu kayıt yakın zamanda güncellediğiniz ya da artık yüklü olmayan modlar içermekte. Kayıt bozulmaları yaşanabilir. Kaydı yüklemek istediğinizden emin misiniz?\n[lightgray]Modlar:\n{0} mod.preview.missing = Bu modu atölyede yayınlamadan önce bir resim önizlemesi eklemelisiniz.\nMod dosyasına [accent]preview.png[] adlı bir resim yerleştirin ve tekrar deneyin. -mod.folder.missing = Atölyede sadece klasör halindeki modlar yayınlanabilir.\Bir modu klasöre çevirmek için, sadece mod dosyalarını bir klasöre çıkarın ve eski sıkıştırılmış dosyayı silin, sonra da oyunu tekrar başlatın ya da modlarınızı tekrar yükleyin. - +mod.folder.missing = Atölyede sadece klasör halindeki modlar yayınlanabilir.Bir modu klasöre çevirmek için, sadece mod dosyalarını bir klasöre çıkarın ve eski sıkıştırılmış dosyayı silin, sonra da oyunu tekrar başlatın ya da modlarınızı tekrar yükleyin. about.button = Hakkında name = İsim: noname = Bir[accent] kullanıcı adı[] seçmelisin. @@ -228,7 +229,7 @@ data.export = Veriyi Dışa Aktar data.import = Veriyi İçe Aktar data.exported = Veri dışa aktarıldı. data.invalid = Bu oyun verisi geçerli değil. -data.import.confirm = Dışarıdan içeri veri aktarmak şu anki verilerinizin [scarlet]tamamını[] silecektir.\[accent]Bu işlem geri alınamaz![]\n\nVeri içeri aktarıldığında oyundan çıkacaksınız. +data.import.confirm = Dışarıdan içeri veri aktarmak şu anki verilerinizin [scarlet]tamamını[] silecektir.[accent]Bu işlem geri alınamaz![]\n\nVeri içeri aktarıldığında oyundan çıkacaksınız. classic.export = Klasik Verileri Dışa Aktar classic.export.text = [accent]Mindustry'e[] büyük bir güncelleme gelmiştir.\nKlasik (v3.5 build 40) kayıt ya da harita bulunmuştur. Bu kayıtları Mindustry Classic uygulamasında kullanmak için telefonunuzun dosyalarına çıkartmak ister misiniz? quit.confirm = Çıkmak istediğinize emin misiniz? @@ -260,16 +261,16 @@ map.nospawn.attack = Bu haritada oyuncunun saldıracağı hiç düşman çekirde map.invalid = Haritayı açarken hata oldu: bozulmuş ya da geçersiz harita dosyası.- workshop.update = Nesneyi Güncelle workshop.error = Atölye ayrıntılarını alırken hata oluştu: {0} -map.publish.confirm = Bu haritayı yayınlamak istediğinize emin misiniz?\n\[lightgray]önce Atölye EULA'sına uyduğunuza emin olun, yoksa haritalarınız gözükmeyecektir! +map.publish.confirm = Bu haritayı yayınlamak istediğinize emin misiniz?\n[lightgray]önce Atölye EULA'sına uyduğunuza emin olun, yoksa haritalarınız gözükmeyecektir! workshop.menu = Select what you would like to do with this item. workshop.info = Nesne Açıklaması changelog = Değişim Listesi (isteğe bağlı): eula = Steam EULA missing = This item has been deleted or moved.\n[lightgray]The workshop listing has now been automatically un-linked. publishing = [accent]Yayınlanıyor... -publish.confirm = Bunu yayınlamak istediğinize emin misiniz?\n\[lightgray]önce Atölye EULA'sına uyduğunuza emin olun, yoksa yapıtlarınız gözükmeyecektir! +publish.confirm = Bunu yayınlamak istediğinize emin misiniz?\n[lightgray]önce Atölye EULA'sına uyduğunuza emin olun, yoksa yapıtlarınız gözükmeyecektir! publish.error = Nesneyi yayınlarken hata oluştu: {0} - +steam.error = Failed to initialize Steam services.\nError: {0} editor.brush = Fırça editor.openin = Düzenleyici'de Aç editor.oregen = Maden Oluşumu @@ -309,7 +310,7 @@ editor.removeunit = Eleman Kaldır editor.teams = Takımlar editor.errorload = Dosya yüklerken hata oluştu:\n[accent]{0} editor.errorsave = Dosya kaydederken hata oluştu:\n[accent]{0} -editor.errorimage = Bu bir harita değil, bir resim.\n\nEğer 3.5/build 40 bir haritayı içeri aktarmak istiyorsanız, editördeki "Legacy Harita İçeri Aktar" butonunu kullanın. +editor.errorimage = Bu bir harita değil, bir resim.\n\nEğer 3.5/build 40 bir haritayı içeri aktarmak istiyorsanız, editördeki "Legacy Harita İçeri Aktar" butonunu kullanın. editor.errorlegacy = Bu harita çok eski ve artık desteklenmeyen bir legacy harita biçimi kullanıyor. editor.errornot = Bu bir harita dosyası değil. editor.errorheader = Bu harita dosyası geçerli değil ya da bozuk. @@ -346,7 +347,6 @@ editor.overwrite = [accent]Uyarı!\nBu işlem var olan bir haritanın üstüne y editor.overwrite.confirm = [scarlet]Uyarı![] Bu ada sahip bir harita zaten var. Onun üstüne yazmak ister misiniz? editor.exists = Bu ada sahip bir harita zaten var. editor.selectmap = Yüklemek için bir harita seçin: - toolmode.replace = Değiştir toolmode.replace.description = Sadece katı blokların üzerinde çizer. toolmode.replaceall = Hepsini Değiştir @@ -361,12 +361,11 @@ toolmode.fillteams = Takımları Doldur toolmode.fillteams.description = Bloklar yerine takımları doldurur. toolmode.drawteams = Takım Çiz toolmode.drawteams.description = Bloklar yerine takımşarı çizer.. - filters.empty = [lightgray]Hiç filtre yok! Aşağıdaki butonla bir adet ekleyin. filter.distort = Çarpıt filter.noise = Gürültü filter.median = Medyan -filter.oremedian Maden Medyanı +filter.oremedian = Maden Medyanı filter.blend = Geçiş filter.defaultores = Varsayılan Madenler filter.ore = Maden @@ -393,7 +392,6 @@ filter.option.floor2 = İkincil Duvar filter.option.threshold2 = İkincil Eşik filter.option.radius = Yarıçap filter.option.percentile = Yüzdelik - width = Eni: height = Boyu: menu = Menü @@ -409,7 +407,6 @@ tutorial = Öğretici tutorial.retake = Öğreticiyi Yeniden Al editor = Düzenleyici mapeditor = Harita Düzenleyicisi - abandon = Terk Et abandon.text = Burası ve bütün kaynaklar düşmana kaybedilecek. locked = Kilitli @@ -439,7 +436,6 @@ zone.objective = [lightgray]Hedef: [accent]{0} zone.objective.survival = Hayatta Kal zone.objective.attack = Düşman Merkezini Yok Et add = Ekle... - boss.health = Boss Canı connectfail = [crimson]Bağlantı hatası:\n\n[accent]{0} error.unreachable = Sunucuya ulaşılamıyor.\nAdrwsin doğru yazıldığına emin misiniz? @@ -451,29 +447,27 @@ error.mapnotfound = Harita dosyası bulunamadı! error.io = Ağ I/O hatası. error.any = Bilinöeyen ağ hatası. error.bloom = Kamaşma başlatılamadı.\nCihazınız bu özelliği desteklemiyor olabilir. - zone.groundZero.name = Sıfır Noktası zone.desertWastes.name = Çöl Harabeleri zone.craters.name = Kraterler -zone.frozenForest.name Donmuş Orman +zone.frozenForest.name = Donmuş Orman zone.ruinousShores.name = Harap Kıyılar zone.stainedMountains.name = Lekeli Dağlar zone.desolateRift.name = Çorak Yarık -zone.nuclearComplex.name Nükleer Üretüm Kompleksi +zone.nuclearComplex.name = Nükleer Üretüm Kompleksi zone.overgrowth.name = Aşırı Büyüme zone.tarFields.name = Katran Sahaları zone.saltFlats.name = Tuz Düzlükleri zone.impact0078.name = Çarpışma 0078 zone.crags.name = Kayalıklar zone.fungalPass.name = Mantar Geçidi - zone.groundZero.description = Yeniden başlamak için ideal bölge. Düşük düşman tehlikesi ve az miktarda kaynak mevcut.\nMümkün oldukça çok bakır ve kurşun topla.\nİlerle. zone.frozenForest.description = Burada, dağlara yakın bölgelerde bile, sporlar etrafa yayıldı. Dondurucu soğuk onları sonsuza dek durduramaz.\n\nEnerji kullanmaya başla. Termik jeneratörler inşa et. Tamircileri kullanmayı öğren. zone.desertWastes.description = Bu harabeler gemiş, öngörülemez, ve sektör yapılarının kalıntılarıyla kesişmekte.\nBölgede kömür mevcut, onu enerji için yak veya ondan grafit üret.\n\n[lightgray]Burada iniş bölgesi garanti edilemez. zone.saltFlats.description = Çölün dış tarafında Tuz Düzlükleri yer alıyor. Burada az miktarda kaynak mevcut.\n\nDüşman burada bir kaynak depolama kompleksi kurdu. Onların çekirdeklerini yık. Ortada çalışan hiçbir şey bırakma. zone.craters.description = Eski savaşların bir anıtı olan bu kratere su dolmuş. Alanı yeniden ele geçir. Kum topla ve metacam üret. Taret ve matkapları soğutmak için su pompala. zone.ruinousShores.description = Kıyı çizgisi harabelerin ötesinde bulunuyor. Bir zamanlar bu bölge bir sahil güvenlik noktasına ev sahipliği yapıyordu. Ondan geriye fazla bir şey kalmadı. Sadece en temel savunma yapıları ayakta, ama diğer her şey hurdaya dönmüş.\nDışarı geniilemeye devam et ve teknolojiyi yeniden keşfet. -zone.stainedMountains.description = Daha uzaklarda dağlar uzanıyor, daha sporlar tarafından istilaya uğramamışlar.\Alandaki serbest titanyumu çıkart ve kullanmasını öğren.\n\nDüşman varlığı burada daha fazla. Onların daha güçlü birimlerini göndermelerine izin verme. +zone.stainedMountains.description = Daha uzaklarda dağlar uzanıyor, daha sporlar tarafından istilaya uğramamışlar.Alandaki serbest titanyumu çıkart ve kullanmasını öğren.\n\nDüşman varlığı burada daha fazla. Onların daha güçlü birimlerini göndermelerine izin verme. zone.overgrowth.description = Bu bölge sporların kaynağına daha yakın ve bölgede aşırı büyüme görülmekte.\nDüşmanlar burada bir sınır üssü kurmuş. Titan birimleri inşa et ve bu üssü yok et. Kaybettiklerimizi geri al. zone.tarFields.description = Dağlar ve çöl arasında kalan bir petrol işleme merkezinin dış kısmı. Kullanılabilen katran rezervlerine sahip az sayıdaki bölgeden biri.\nTerk edilmiş olduğu halde, bu alanda tehlikeli düşman güçleri mevcut. Onları hafife alma.\n\n[lightgray]Mümkünse petrol işleme teknolojisini araştır. zone.desolateRift.description = Aşırı derecede tehlikeli bir bölge. Bolca kaynak mevcut ama alan dar. Yok edilme riski çok yüksek. Bu bölgeyi mümkün oldukça kısa sürede terk et. Düşman saldırıları arasındaki uzun aralıklar tarafından aldanma. @@ -481,7 +475,6 @@ zone.nuclearComplex.description = Önceleri toryum üretme ve işleme ile görev zone.fungalPass.description = Dağlar ve sporlarla dolu aşağı bölgeler arasında bir geçiş bölgesi. Burada küçük düşman keşif üssü bulundu.\nBu üssü yok et.\nDagger ve Crawler birimleei kullan ve bölgedeki iki çekirdeği yık. zone.impact0078.description = zone.crags.description = - settings.language = Dil settings.data = Oyun Verisi settings.reset = Varsayılana Sıfırla @@ -503,7 +496,7 @@ error.title = [crimson]Bir hata oldu error.crashtitle = Bir hata oldu blocks.input = Giriş blocks.output = Çıkış -blocks.booster = +blocks.booster = Booster block.unknown = [lightgray]??? blocks.powercapacity = Enerji Kapasitesi blocks.powershot = Enerji/Atış @@ -516,6 +509,7 @@ blocks.shootrange = Menzil blocks.size = Boyut blocks.liquidcapacity = Sıvı Kapasitesi blocks.powerrange = Enerji Menzili +blocks.powerconnections = Max Connections blocks.poweruse = Enerji Kullanımı blocks.powerdamage = Enerji/Hasar blocks.itemcapacity = Eşya Kapasitesi @@ -535,12 +529,12 @@ blocks.inaccuracy = İskalama Oranı blocks.shots = Atışlar blocks.reload = Atışlar/Sn blocks.ammo = Mermi - bar.drilltierreq = Daha İyi Matkap Gerekli bar.drillspeed = Matkap Hızı: {0}/s +bar.pumpspeed = Pump Speed: {0}/s bar.efficiency = Verim: {0}% bar.powerbalance = Enerji: {0}/sn -bar.powerstored Depolanan: {0}/{1} +bar.powerstored = Depolanan: {0}/{1} bar.poweramount = Enerji: {0} bar.poweroutput = Enerji Üretimi: {0} bar.items = Eşyalar: {0} @@ -550,7 +544,6 @@ bar.heat = Isı bar.power = Enerji bar.progress = Build Progress bar.spawned = Birimler: {0}/{1} - bullet.damage = [stat]{0}[lightgray] hasar bullet.splashdamage = [stat]{0}[lightgray] alan hasarı ~[stat] {1}[lightgray] kare bullet.incendiary = [stat]yakıcı @@ -562,7 +555,6 @@ bullet.freezing = [stat]dondurucu bullet.tarred = [stat]katranlı bullet.multiplier = [stat]{0}[lightgray]x mermi çarpanı bullet.reload = [stat]{0}[lightgray]x atış hızı - unit.blocks = bloklar unit.powersecond = enerji birimi/saniye unit.liquidsecond = sıvı birimi/saniye @@ -584,6 +576,7 @@ category.shooting = Silahlar category.optional = İsteğe Bağlı Geliştirmeler setting.landscape.name = Yatayda sabitle setting.shadows.name = Gölgeler +setting.blockreplace.name = Automatic Block Suggestions setting.linear.name = Lineer Filtreleme setting.hints.name = İpuçları setting.animatedwater.name = Animasyonlu Su @@ -592,7 +585,7 @@ setting.antialias.name = Antialias[lightgray] (requires restart)[] setting.indicators.name = Düşman/Müttefik Belirteçleri setting.autotarget.name = Otomatik Hedef Alma setting.keyboard.name = Fare+Klavye Kontrolleri -setting.touchscreen.name Dokunmatik Ekran Kontrolleri +setting.touchscreen.name = Dokunmatik Ekran Kontrolleri setting.fpscap.name = Maksimum FPS setting.fpscap.none = Limitsiz setting.fpscap.text = {0} FPS @@ -606,6 +599,8 @@ setting.difficulty.insane = Çılgın setting.difficulty.name = Zorluk: setting.screenshake.name = Ekranı Salla setting.effects.name = Efektleri Görüntüle +setting.destroyedblocks.name = Display Destroyed Blocks +setting.conveyorpathfinding.name = Conveyor Placement Pathfinding setting.sensitivity.name = Kontrolcü Hassasiyeti setting.saveinterval.name = Kayıt Aralığı setting.seconds = {0} Saniye @@ -640,16 +635,16 @@ category.multiplayer.name = Çok Oyunculu command.attack = Saldır command.rally = Toplan command.retreat = Geri Çekil -keybind.clear_building.name = Binayı Temizle +keybind.clear_building.name = Binayı Temizle keybind.press = Bir tuşa basın... keybind.press.axis = Bir tuşa ya da yöne basın... keybind.screenshot.name = Harita Ekran Görüntüsü keybind.move_x.name = x Ekseninde Hareket keybind.move_y.name = y Ekseninde Hareket keybind.schematic_select.name = Bölge Seç -keybind.schematic_menu.name Şema Menüsü +keybind.schematic_menu.name = Şema Menüsü keybind.schematic_flip_x.name = Şemayı X ekseninde Döndür -keybind.schematic_flip_y.name Şemayı Y Ekseninde Döndür +keybind.schematic_flip_y.name = Şemayı Y Ekseninde Döndür keybind.fullscreen.name = Tam Ekran keybind.select.name = Seç/Ateş Et keybind.diagonal_placement.name = Çapraz Yerleştirme @@ -686,7 +681,6 @@ mode.pvp.description = Yerel olarak başkaları ile savaş.\n[gray]Oynamak için mode.attack.name = Saldırı mode.attack.description = Düşman üssünü yok et. Dalga yok.\n[gray]Oynamak için haritada kırmızı çekirdek olması gerekir. mode.custom = Özel Kurallar - rules.infiniteresources = Sınırsız Kaynaklar rules.wavetimer = Dalga Zamanlayıcısı rules.waves = Dalgalar @@ -700,7 +694,7 @@ rules.playerdamagemultiplier = Oyuncu Hasarı Çarpanı rules.unitdamagemultiplier = Birim Hasarı Çapanı rules.enemycorebuildradius = Düşman Çekirdeği İnşa Yasağı Yarıçapı:[lightgray] (kare) rules.respawntime = Yeniden Doğma Süresi:[lightgray] (sec) -rules.wavespacing Dalga Aralığı:[lightgray] (sec) +rules.wavespacing = Dalga Aralığı:[lightgray] (sec) rules.buildcostmultiplier = İnşa ücreti Çarpanı rules.buildspeedmultiplier = İnşa Hızı Çarpanı rules.waitForWaveToEnd = Dalgalar Düşmanı Bekler @@ -713,7 +707,6 @@ rules.title.resourcesbuilding = Kaynaklar & İnşa rules.title.player = Oyuncular rules.title.enemy = Düşmanlar rules.title.unit = Unitler - content.item.name = Eşyalar content.liquid.name = Sıvılar content.unit.name = Birimler @@ -750,7 +743,7 @@ mech.tau-mech.weapon = Yenileme Işını mech.tau-mech.ability = Çoklu Tamir mech.omega-mech.name = Omega mech.omega-mech.weapon = Sürü Füzeleri -mech.omega-mech.ability Zırhlı Konfigürasyon +mech.omega-mech.ability = Zırhlı Konfigürasyon mech.dart-ship.name = Dart mech.dart-ship.weapon = Makineli Tüfek mech.javelin-ship.name = Javelin @@ -775,7 +768,6 @@ mech.buildspeed = [lightgray]İnşaat Hızı: {0}% liquid.heatcapacity = [lightgray]Isı Kapasitesi: {0} liquid.viscosity = [lightgray]Vizkosite: {0} liquid.temperature = [lightgray]Sıcaklık: {0} - block.sand-boulder.name = Kum Kaya Parçaları block.grass.name = Çimen block.salt.name = Tuz @@ -851,6 +843,8 @@ block.copper-wall.name = Bakır Duvar block.copper-wall-large.name = Büyük Bakır Duvar block.titanium-wall.name = Titanyum Duvar block.titanium-wall-large.name = Büyük Titanyum Duvar +block.plastanium-wall.name = Plastanium Wall +block.plastanium-wall-large.name = Large Plastanium Wall block.phase-wall.name = Faz Duvar block.phase-wall-large.name = Büyük Faz Duvar block.thorium-wall.name = Toryum Duvar @@ -916,7 +910,7 @@ block.wave.name = Wave block.swarmer.name = Swarmer block.salvo.name = Salvo block.ripple.name = Ripple -block.phase-conveyor.name Faz Konveyörü +block.phase-conveyor.name = Faz Konveyörü block.bridge-conveyor.name = Konveyör Köprüsü block.plastanium-compressor.name = Plastanyum Kompresörü block.pyratite-mixer.name = Pirratit Mikseri @@ -936,7 +930,7 @@ block.titan-factory.name = Titan Robot Fabrikası block.fortress-factory.name = Fortress Robot Fabrikası block.revenant-factory.name = Revenant Savaşçı Fabrikası block.repair-point.name = Tamir Noktası -block.pulse-conduit.name Dalga Borusu +block.pulse-conduit.name = Dalga Borusu block.phase-conduit.name = Faz Borusu block.liquid-router.name = Sıvı Yönlendiricisi block.liquid-tank.name = Sıvı Tankı @@ -989,6 +983,7 @@ unit.lich.name = Lich unit.reaper.name = Reaper tutorial.next = [lightgray] tutorial.intro = [scarlet]Mindustry öğreticisine hoş geldiniz.[]\n[accent]Bakır kazarak[] başlayın. Bunu yapmak için merkezinize yakın bir bakır madenine dokunun.\n\n[accent]{0}/{1} bakır +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 = Manuel olarak kazmak verimsizdir.\n[accent]Matkaplar []otomatikman kazabilir.\nSağ alttaki matkap sekmesine tıklayınız.\n[accent]Mekanik matkabı[] seçiniz. Tıklayarak bir bakır madenine yerleştirin.\n Yapımı durdurmak için [accent]sağ tıklayın[] ve yakınlaştırmak ve uzaklaştırmak için [accent]CTRL basılı tutarak tekerleği kaydırın[]. tutorial.drill.mobile = Manuel olarak kazmak verimsizdir.\n[accent]Matkaplar []otomatik olarak kazabilir.\nSağ alttaki matkap sekmesine dokunun.\n[accent]Mekanik matkabı[] seçin. \nDokunarak bir bakır madenine yerleştirin, sonra seçiminizi onaylamak için alttaki [accent] tik düğmesine[] basın.\nYerleştirmenizi iptal etmek için [accent] X butonuna[] basın. tutorial.blockinfo = Her bloğun farklı istatistikleri vardır. Her matkap sadece belirli madenleri kazabilir.\nBir bloğun bilgi ve istatistiklerine bakmak için,[accent] yapım menüsünde seçerken "?" tuşuna dokunun.[]\n\n[accent]Şimdi mekanik matkabın istatistiklerine erişin.[] @@ -1006,8 +1001,7 @@ tutorial.withdraw = Bazı durumlarda bloklardan materyalleri direkt olarak almak tutorial.deposit = Malzemeleri geminizden hedef bloğa sürükleyerek malzemeleri bırakabilirsiniz.\n\n[accent]Bakırı çekirdeğe geri bırakın.[] tutorial.waves = [lightgray]Düşman[] yaklaşıyor.\n\nÇekirdeği 2 dalga boyunca koruyun. Ateş etmek için [accent]tıklayın[].\nDaha fazla taret ve matkap inşa edin ve daha fazla bakır toplayın. tutorial.waves.mobile = [lightgray]Düşman[] yaklaşıyor.\n\nÇekirdeği 2 dalga boyunca koruyun. Geminiz düşmanlara otomatik olarak ateş edecektir.\nDaha fazla taret ve matkap inşa edin ve daha fazla bakır toplayın. -tutorial.launch = Belirli bir dalgaya ulaşınca, çekirdeği bulunduğu bölgeden [accent]kaldırabilir[], bütün binalarınızı arkada bırakıp [accent]çekirdeğinizdeki bütün materyallere sahip olabilirsiniz.[]\Bu materyaller daha sonra yeni teknolojiler geliştirmek için kullanılabilir.\n\n[accent]Kalkış butonuna basın. - +tutorial.launch = Belirli bir dalgaya ulaşınca, çekirdeği bulunduğu bölgeden [accent]kaldırabilir[], bütün binalarınızı arkada bırakıp [accent]çekirdeğinizdeki bütün materyallere sahip olabilirsiniz.[]Bu materyaller daha sonra yeni teknolojiler geliştirmek için kullanılabilir.\n\n[accent]Kalkış butonuna basın. item.copper.description = En basit materyal. Her türlü blokda kullanılır. item.lead.description = Basit bir materyal. Elektronikte ve sıvı taşımada kullanılır. item.metaglass.description = Süper sert camdan bir bileşim. Sıvı dağıtımı ve depolamak için yaygın olarak kullanılır. @@ -1073,6 +1067,8 @@ block.copper-wall.description = Ucuz bir savunma bloğu.\nİlk birkaç dalgada m block.copper-wall-large.description = Ucuz bir savunma bloğu.\nİlk birkaç dalgada merkezi ve taretleri korumak için kullanışlıdır.\nBirçok blok alan kaplar. block.titanium-wall.description = Orta derecede güçlü savunma bloğu.\nDüşmanlardan orta derecede koruma sağlar. block.titanium-wall-large.description = Orta derecede güçlü savunma bloğu.\nDüşmanlardan orta derecede koruma sağlar.\nBirçok blok alan kaplar. +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.thorium-wall.description = Güçlü bir savunma bloğu.\nDüşmanlardan iyi korunma sağlar. block.thorium-wall-large.description = Güçlü bir savunma bloğu.\nDüşmanlardan iyi korunma sağlar.\nBirçok blok alan kaplar. block.phase-wall.description = Özel faz örgüsü bazlı yansıtıcı materyal ile kaplanmış bir duvar. Çoğu mermi çarpma anında saptırır. @@ -1092,7 +1088,7 @@ block.junction.description = Çakışan iki konveyör hattı arasında bir köpr block.bridge-conveyor.description = Gelişmiş materyal taşıma bloğu. Materyalleri her türlü arazi veya binanın üzerinden üç bloğa kadar uzağa taşıyabilir. block.phase-conveyor.description = Gelişmiş materyal taşıma bloğu. Materyalleri kendisine bağlı bir başka faz konveyörüne ışınlamak için enerji kullanır. block.sorter.description = Materyalleri ayıklar. Eğer materyal seçilen ile eşleşiyorsa geçmesine izin verilir. Yoksa materyal sağa ya da sola atılır. -block.inverted-sorter.descriptions = Materyalleri standart bir ayıklayıcı gibi işler, ancak bu kez eşleşen materyalleri yana atar. +block.inverted-sorter.description = Processes items like a standard sorter, but outputs selected items to the sides instead. block.router.description = Materyalleri bir yönden alıp diğer üç yöne eşit olarak dağıtır. Materyalleri bir kaynaktan birden fazla hedefe iletmek için kullanılır.\n\n[scarlet]Asla üretim yapan binaların dibine yerleştirmeyin, yoksa istenmeyen materyaller tarafından tıkanabilir.[] block.distributor.description = Gelişmiş bir yönlendirici. Materyalleri yedi farklı yöne dağıtabilir. block.overflow-gate.description = Ayırıcı ve yönlendiricinin bir karışımı. Materyalleri sadece ön kısım kapalı olduğunda sağa ve sola atar. @@ -1151,7 +1147,6 @@ block.cyclone.description = Büyük bir anti hava ve anti kara tareti. Yakının block.spectre.description = Dev bir çift namlulu top. Hava ve kara birimlerine iri, zırh delici mermiler atar. block.meltdown.description = Dev bir lazer topu. Yüklenip yakındaki düşmanlara uzun süreli lazer ışınları yollar. Çalışması için soğutucu gerekir. block.command-center.description = Haritadaki müttefik birimlere komutlar -yollar.\nBirimlerindevirye gezmesini, düşman çekirdeğine saldırmasını, ya da çekirdek veya fabrikaya geri çekilmesini emredebilir. Düşman çekirdeği yoksa birimler varsayılan olarak çekirdeğe saldırma emrinde de devriye gezerler. block.draug-factory.description = Draug maden dronları üretir. block.spirit-factory.description = Spirit yapısal onarım dronları üretir. block.phantom-factory.description = Gelişimiş inşaat dronları üretir. diff --git a/core/assets/bundles/bundle_uk_UA.properties b/core/assets/bundles/bundle_uk_UA.properties index 4a005511b5..4cbf5b39a6 100644 --- a/core/assets/bundles/bundle_uk_UA.properties +++ b/core/assets/bundles/bundle_uk_UA.properties @@ -3,13 +3,14 @@ credits = Творці contributors = Перекладачі та помічники discord = Приєднуйтесь до Mindustry Discord! link.discord.description = Офіційний Discord сервер Mindustry -link.reddit.description = Гілка Mindustry на Reddit +link.reddit.description = Спільнота Mindustry на Reddit link.github.description = Вихідний код гри link.changelog.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 = Перелік каталогу F-Droid link.wiki.description = Офіційна Mindustry wiki linkfail = Не вдалося відкрити посилання!\nURL-адреса скопійована в буфер обміну. screenshot = Зняток мапи збережено в {0} @@ -25,17 +26,17 @@ load.content = Зміст load.system = Система load.mod = Модифікації schematic = Схема -schematic.add = Зберегти схему... +schematic.add = Зберегти схему… schematics = Схеми schematic.replace = Схема з такою ж назвою вже існує. Замінити її? -schematic.import = Імпортувати схему... +schematic.import = Імпортувати схему… schematic.exportfile = Експортувати файл schematic.importfile = Імпортувати файл schematic.browseworkshop = Переглянути в Майстерні schematic.copy = Копіювати в буфер обміну schematic.copy.import = Імпортувати з клавіатури schematic.shareworkshop = Поширити в Майстерні -schematic.flip = [accent][[{0}][]/[accent][[{1}][]: Flip Schematic +schematic.flip = [accent][[{0}][]/[accent][[{1}][]: Відобразити схему schematic.saved = Схема збережена. schematic.delete.confirm = Ця схема буде повністю випалена. schematic.rename = Перейменувати схему. @@ -48,7 +49,7 @@ stat.deconstructed = Будівель декоструйовано[accent] {0} stat.delivered = Ресурсів запущено: stat.rank = Фінальний рахунок: [accent]{0} launcheditems = [accent]Запущені предмети -launchinfo = [unlaunched][[LAUNCH] ваше ядро для отримання предметів позначено синім кольором. +launchinfo = [unlaunched]Натисніть на кнопку «[[ЗАПУСК]», щоб ваше ядро отримало предмети, які виділені синім кольором. map.delete = Ви впевнені, що хочете видалити мапу «[accent]{0}[]»? level.highscore = Рекорд: [accent]{0} level.select = Вибір мапи @@ -74,6 +75,7 @@ maps.browse = Перегляд мап continue = Продовжити maps.none = [lightgray]Мап не знайдено! invalid = Недійсне +pickcolor = Вибрати колір preparingconfig = Підготовка конфігурації preparingcontent = Підготовка вмісту uploadingcontent = Вивантаження вмісту @@ -90,20 +92,23 @@ mod.requiresrestart = А тепер гра закриється, щоб заст mod.import = Імпортувати модифікацію mod.remove.confirm = Цю модифікацію буде видалено. mod.author = [LIGHT_GRAY]Автор:[] {0} -mods.alphainfo = Майте на увазі, що модифікації знаходяться в альфі, і [scarlet]можуть бути дуже глючними[].\nПовідомте про будь-які проблеми, які ви знайдете до Mindustry Github або Discord. mods.alpha = [scarlet](Альфа) mods = Модифікації mods.none = [LIGHT_GRAY]Модифікацій не знайдено! mods.guide = Посібник зі створення модифицій mods.report = Повідомити про ваду +mods.openfolder = Відкрити теку модифікацій mod.enabled = [lightgray]Увімкнено mod.disabled = [scarlet]Вимкнено mod.disable = Вимкнути +mod.delete.error = Неможливо видалити модифікацію. Файл, можливо, використовується. +mod.missingdependencies = [scarlet]Відсутні залежності: {0} +mod.nowdisabled = [scarlet]Модифікації '{0}' не вистачає залежностей:[accent] {1}\n[lightgray]Ці модифікації потрібно завантажити спочатку.\nЦя модифікація буду автоматично вимкнена. mod.enable = Увімкнути mod.requiresrestart = А тепер гра закриється, щоб застосувати зміни модифікацій. mod.reloadrequired = [scarlet]Потрібно перезавантаження mod.import = Імпортувати модифікацію -mod.import.github = Import Github Mod +mod.import.github = Імпортувати модификацію з Ґітгаб mod.remove.confirm = Цю модифікацію буде видалено. mod.author = [LIGHT_GRAY]Автор:[] {0} mod.missing = Це збереження містить модифікації, які ви нещодавно оновили або більше не встановлювали. Збереження може зіпсуватися. Ви впевнені, що хочете завантажити його?\n[lightgray]Модифікації:\n{0} @@ -234,18 +239,18 @@ 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 = Класичне (версія 3.5 збірка 40) збереження або мапа були знайдені. Ви хочете експортувати ці дані в домашню теку телефону, для використання у застосунку Mindustry Classic? quit.confirm = Ви впевнені, що хочете вийти? quit.confirm.tutorial = Ви впевнені, що хочете вийти з навчання? loading = [accent]Завантаження… -reloading = [accent]Reloading Mods... +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]Хвиля триває @@ -264,17 +269,18 @@ map.nospawn = Ця мапа не має жодного ядра для появ map.nospawn.pvp = У цієї мапи немає ворожих ядер, в яких гравець може з’явитися! Додайте [SCARLET]не помаранчеве[] ядро до цієї мапи в редакторі. map.nospawn.attack = У цієї мапи немає ворожих ядер, в яких гравець може з’явитися! Додайте [SCARLET]червоне[] ядро до цієї мапи в редакторі. map.invalid = Помилка завантаження мапи: пошкоджений або невірний файл мапи. -workshop.update = Update Item -workshop.error = Error fetching workshop details: {0} +workshop.update = Оновити предмет +workshop.error = Помилка при отриманні інформації з Майстерні: {0} map.publish.confirm = Ви дійсно хочете опублікувати цю мапу?\n\n[lightgray]Переконайтеся, що спершу ви згодні з Ліцензійною угодою Steam, або ваші мапи не з’являться! -workshop.menu = Select what you would like to do with this item. -workshop.info = Item Info -changelog = Changelog (optional): +workshop.menu = Виберіть, що ви хочете зробити з цим предметом. +workshop.info = Інформація про предмет +changelog = Журнал змін (за бажанням): 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} +missing = Цей предмет було видалено або переміщено.\n[lightgray]Список Майстерні тепер автоматично від’єднано. +publishing = [accent]Публікація… +publish.confirm = Ви дійсно хочете опублікувати це?\n\n[lightgray]Переконайтеся, що ви спочатку погоджуєтеся з EULA Майстерні, або ваші предмети не з’являться! +publish.error = Сталася помилка при публікації предмета: {0} +steam.error = Не вдалося ініціалізувати сервіси Steam.\nПомилка: {0} editor.brush = Пензлик editor.openin = Відкрити в редакторі editor.oregen = Генерація руд @@ -306,7 +312,7 @@ waves.invalid = Недійсні хвилі у буфері обміну. waves.copied = Хвилі скопійовані. waves.none = Вороги не були встановлені.\nЗазначимо, що пусті хвилі будуть автоматично замінені звичайною хвилею. editor.default = [lightgray]<За замовчуванням> -details = Деталі... +details = Деталі… edit = Редагувати… editor.name = Назва: editor.spawn = Створити бойову одиницю @@ -415,9 +421,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 +434,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}» тепер розблокована. @@ -491,8 +497,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 = Інформація @@ -513,6 +519,7 @@ blocks.shootrange = Діапазон дії blocks.size = Розмір blocks.liquidcapacity = Місткість рідини blocks.powerrange = Діапазон передачі енергії +blocks.powerconnections = Максимальна кількість з’єднань blocks.poweruse = Енергії використовує blocks.powerdamage = Енергія/урон blocks.itemcapacity = Місткість предметів @@ -526,16 +533,17 @@ blocks.drillspeed = Базова швидкість буріння blocks.boosteffect = Прискорювальний ефект blocks.maxunits = Максимальна кількість активних одиниць blocks.health = Здоров’я -blocks.buildtime = Час будівництва +blocks.buildtime = Час будування blocks.buildcost = Вартість будування blocks.inaccuracy = Розкид blocks.shots = Постріли blocks.reload = Постріли/секунду blocks.ammo = Боєприпаси bar.drilltierreq = Потребується кращий бур -bar.drillspeed = Швидкість буріння: {0}/с +bar.drillspeed = Швидкість буріння: {0} за с. +bar.pumpspeed = Швидкість викачування: {0} за с. bar.efficiency = Ефективність: {0}% -bar.powerbalance = Енергія: {0}/с +bar.powerbalance = Енергія: {0} за с. bar.powerstored = Зберігає: {0}/{1} bar.poweramount = Енергія: {0} bar.poweroutput = Вихідна енергія: {0} @@ -544,8 +552,10 @@ bar.capacity = Місткість: {0} bar.liquid = Рідина bar.heat = Нагрівання bar.power = Енергія -bar.progress = Хід будівництва +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]запальний @@ -558,28 +568,30 @@ bullet.tarred = [stat]дьогтьовий bullet.multiplier = [stat]{0}[lightgray]x патронів bullet.reload = [stat]{0}[lightgray]x швидкість перезаряджання unit.blocks = блоки -unit.powersecond = одиниць енергії/секунду -unit.liquidsecond = рідких одиниць/секунду -unit.itemssecond = предметів/секунду -unit.liquidunits = рідинних одиниць -unit.powerunits = енергетичних одиниць +unit.powersecond = одиниць енергії за секунду +unit.liquidsecond = одиниць рідини за секунду +unit.itemssecond = предметів за секунду +unit.liquidunits = одиниць рідини +unit.powerunits = одиниць енергії unit.degrees = град. -unit.seconds = сек. -unit.persecond = /сек +unit.seconds = с +unit.persecond = за секунду unit.timesspeed = x швидкість unit.percent = % unit.items = предм. -category.general = Загальні -category.power = Енергетичні +category.general = Загальне +category.power = Енергія category.liquids = Рідини category.items = Предмети -category.crafting = Введення/виведення +category.crafting = Виробництво category.shooting = Стрільба category.optional = Додаткові поліпшення 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] (потребує перезапуску)[] @@ -600,16 +612,21 @@ setting.difficulty.insane = Неможлива setting.difficulty.name = Складність: setting.screenshake.name = Тряска екрану setting.effects.name = Ефекти +setting.destroyedblocks.name = Показувати зруйновані блоки +setting.conveyorpathfinding.name = Пошук шляху для встановлення конвейерів setting.sensitivity.name = Чутливість контролера setting.saveinterval.name = Інтервал збереження -setting.seconds = {0} сек. +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 = Показувати міні-мапу -setting.position.name = Show Player Position +setting.position.name = Показувати координати гравця setting.musicvol.name = Гучність музики setting.ambientvol.name = Звуки навколишнього середовища setting.mutemusic.name = Заглушити музику @@ -619,10 +636,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 = Світіння @@ -634,17 +651,36 @@ category.multiplayer.name = Мережева гра command.attack = Атакувати command.rally = Точка збору command.retreat = Відступити -keybind.clear_building.name = Clear Building +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.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.fullscreen.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.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 = Вибрати блок @@ -655,14 +691,13 @@ keybind.zoom_hold.name = Керування масштабом keybind.zoom.name = Приблизити keybind.menu.name = Меню keybind.pause.name = Пауза -keybind.pause_building.name = Pause/Resume Building +keybind.pause_building.name = Призупинити/Продовжити будування keybind.minimap.name = Мінімапа -keybind.dash.name = Прискоритися/Літати keybind.chat.name = Чат keybind.player_list.name = Список гравців keybind.console.name = Консоль keybind.rotate.name = Обертати -keybind.rotateplaced.name = Обертати існуюче (утримуйте) +keybind.rotateplaced.name = Обертати існуюче (прокручуйте) keybind.toggle_menus.name = Меню перемикання keybind.chat_history_prev.name = Попередня історія чату keybind.chat_history_next.name = Наступна історія чату @@ -681,6 +716,7 @@ mode.attack.name = Атака mode.attack.description = Зруйнуйте ворожу базу.\n[gray]Потрібно червоне ядро на мапі для гри. mode.custom = Користувацькі правила rules.infiniteresources = Нескінченні ресурси +rules.reactorexplosions = Вибухи реактора rules.wavetimer = Таймер хвиль rules.waves = Хвилі rules.attack = Режим атаки @@ -694,7 +730,7 @@ rules.unitdamagemultiplier = Множник шкоди бойових одини rules.enemycorebuildradius = Радіус захисту для ворожого ядра:[lightgray] (блоків) rules.respawntime = Час відродження:[lightgray] (sec) rules.wavespacing = Інтервал хвиль:[lightgray] (sec) -rules.buildcostmultiplier = Множник затрат на будівництво +rules.buildcostmultiplier = Множник затрат на будування rules.buildspeedmultiplier = Множник швидкості будування rules.waitForWaveToEnd = Хвилі чекають на ворогів rules.dropzoneradius = Радіус зони висадки:[lightgray] (блоків) @@ -702,10 +738,13 @@ rules.respawns = Максимальна кількість відроджень rules.limitedRespawns = Обмеження відроджень rules.title.waves = Хвилі rules.title.respawns = Відродження -rules.title.resourcesbuilding = Ресурси & будівництво +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 = Бойові одиниці @@ -835,13 +874,15 @@ block.dark-panel-5.name = Темна панель 5 block.dark-panel-6.name = Темна панель 6 block.dark-metal.name = Темний метал block.ignarock.name = Магматичні гірські породи -block.hotrock.name = Гарячий Камінь +block.hotrock.name = Гарячий камінь block.magmarock.name = Магмовий камінь block.cliffs.name = Скелі block.copper-wall.name = Мідна стіна block.copper-wall-large.name = Велика мідна стіна block.titanium-wall.name = Титанова стіна block.titanium-wall-large.name = Велика титанова стіна +block.plastanium-wall.name = Пластанієва стіна +block.plastanium-wall-large.name = Велика пластанієва стіна block.phase-wall.name = Фазова стіна block.phase-wall-large.name = Велика фазова стіна block.thorium-wall.name = Торієва стіна @@ -861,8 +902,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 = Фазовий ткач @@ -876,6 +919,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 = Генератор горіння @@ -896,11 +940,11 @@ block.omega-mech-pad.name = Реконструктор «Омега» block.tau-mech-pad.name = Реконструктор «Тау» 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.power-source.name = Нескінченне джерело енергії block.unloader.name = Розвантажувач block.vault.name = Сховище block.wave.name = Хвиля @@ -928,6 +972,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 = Рідкий резервуар @@ -979,16 +1024,17 @@ unit.eradicator.name = Випалювач unit.lich.name = Лич unit.reaper.name = Жнець tutorial.next = [lightgray]<Натисніть для продовження> -tutorial.intro = Ви розпочали[scarlet] навчання по Mindustry.[]\nРозпочність з[accent] видобування міді[]. Використовуйте [[WASD] для руху.\n[accent] Утримуйте [[Ctrl] під час прокрутки миші[] для приближення і віддалення. Наблизьтесь, а потім натисність на мідну жилу біля вашого ядра, щоб зробити це.\n\n[accent]{0}/{1} міді -tutorial.drill = Добування вручну неефективне.\n[accent]Бури []можуть добувати автоматично.\nНатисніть на вкладку свердла знизу зправа.\nВиберіть[accent] механічний бур[]. Розмістіть його на мідній жилі натисканням.\n[accent]Натисніть ПКМ[], щоб зупинити будування. +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][[2][], а потім натиснути [accent][[1][] швидко, незалежно від того, яка вкладка відкрита.\n[accent]Натисніть ПКМ[], щоб зупинити будування. tutorial.drill.mobile = Добування вручну неефективне.\n[accent]Бури []можуть добувати автоматично.\nНатисність на вкладку сведла знизу зправа.\nВиберіть[accent] механічний бур[]. Розмістіть його на мідній жилі натисканням, потім натисність на [accent] галочку[] нижче, щоб підтвердити розміщення to confirm your selection.\nPress the[accent] X button[] to cancel placement. tutorial.blockinfo = Кожен блок має різні характеристики. Кожний бур може видобувати тільки певні руди.\nЩоб переглянути інформацію та характеристики блока,[accent] натисність на кнопку «?», коли Ви вибрали блок у меню будування.[]\n\n[accent]Перегляньте характеристику Механічного бура прямо зараз.[] 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 предмет доставлено tutorial.turret = Оборонні споруди повинні бути побудовані для відбиття[lightgray] ворогів[].\nПобудуйте[accent] башточку «Подвійна»[] біля вашої бази. tutorial.drillturret = «Подвійна» потребує [accent] мідні боєприпаси []для стрільби.\nРозмістіть бур біля башточки\nПроведіть конвеєри до башточки, щоб заповнити її боєприпасами.\n\n[accent]Доставлено боєприпасів: 0/1 -tutorial.pause = Під час бою ви можете[accent] поставити на павзу гру.[]\nВи можете зробити чергу на будівництво під час паузи.\n\n[accent]Натисність пробіл для павзи.tutorial.launch -tutorial.pause.mobile = Під час бою ви можете[accent] поставити на павзу гру.[]\nВи можете зробити чергу на будівництво під час паузи.\n\n[accent]атисніть кнопку зліва вгорі для павзи. +tutorial.pause = Під час бою ви можете[accent] поставити на павзу гру.[]\nВи можете зробити чергу на будування під час паузи.\n\n[accent]Натисність пробіл для павзи.tutorial.launch +tutorial.pause.mobile = Під час бою ви можете[accent] поставити на павзу гру.[]\nВи можете зробити чергу на будування під час паузи.\n\n[accent]атисніть кнопку зліва вгорі для павзи. tutorial.unpause = Тепер натисність пробіл, щоб зняти павзу. tutorial.unpause.mobile = Тепер натисність туди ще раз, щоб зняти павзу. tutorial.breaking = Блоки часто повинні бути знищені.\n[accent]Утримуючи ПКМ[] Ви знищите всі виділені блоки.[]\n\n[accent]Необхідно знищити всі стіни з металобрухту ліворуч від вашого ядра використовуючи видалення у зоні. @@ -1018,17 +1064,17 @@ liquid.water.description = Найкорисніша рідина. Зазвича liquid.slag.description = Різні види розплавленого металу змішуються між собою. Може бути відокремлений від складових корисних копалин або розпорошений на ворожі частини як зброя. liquid.oil.description = Рідина, яка використовується у виробництві сучасних матеріалів. Може бути перетворена в вугілля в якості палива або використана як куля. liquid.cryofluid.description = Інертна, не роз’їдаюча рідина, створена з води та титану. Володіє надзвичайно високою пропускною спроможністю. Широко використовується в якості охолоджуючої рідини. -mech.alpha-mech.description = Стандартний керований мех. Заснований на бойовій одиниці «Кинджал», з оновленими бронею та можливостями будівництва. Наносить більше шкоди, ніж «Дротик». +mech.alpha-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.trident-ship.description = Важкий бомбардувальник, побудований для будування та знищення ворожих укріплень. Дуже добре броньований. mech.glaive-ship.description = Великий, добре броньований бойовий корабель. Оснащений запальним ретранслятором. Високо маневрений. unit.draug.description = Примітивний дрон, який добуває ресурси. Дешевий для виробництва. Автоматично видобуває мідь і свинець поблизу. Доставляє видобуті ресурси до найближчого ядра. unit.spirit.description = Модифікований «Драугр», призначений для ремонту замість видобутку. Автоматично відновлює будь-які пошкоджені блоки. -unit.phantom.description = Вдосконалений безпілотник. Йде за користувачами. Допомагає в будівництві блоків. +unit.phantom.description = Вдосконалений безпілотник. Йде за користувачами. Допомагає в будуванні блоків. unit.dagger.description = Базовий мех(бойова одиниця). Дешевий у виробництві. Нездоланні при використанні в натовпі. unit.crawler.description = Наземна одиниця, що складається зі стертої рами з високими вибуховими речовинами, прив’язаними зверху. Не особливо міцний. Вибухає при контакті з ворогами. unit.titan.description = Вдосконалений броньований наземний блок. Нападає як на наземні, так і повітряні цілі. Оснащений двома мініатюрними вогнеметами класу Випалювач. @@ -1063,6 +1109,8 @@ block.copper-wall.description = Дешевий захисний блок.\nКо block.copper-wall-large.description = Дешевий захисний блок.\nКорисна для захисту ядра та башточок у перші кілька хвиль.\nОхоплює кілька плиток. block.titanium-wall.description = Відносно сильний захисний блок.\nЗабезпечує помірний захист від ворогів. block.titanium-wall-large.description = Відносно сильний захисний блок.\nЗабезпечує помірний захист від ворогів.\nОхоплює кілька плиток. +block.plastanium-wall.description = Особливий тип стіни, який поглинає електричні дуги і блокує автоматичні з'єднання енергетичних вузлів. +block.plastanium-wall-large.description = Особливий тип стіни, який поглинає електричні дуги і блокує автоматичні з'єднання вузлів живлення.\nОхоплює кілька плиток. block.thorium-wall.description = Сильний захисний блок.\nГідний захист від ворогів. block.thorium-wall-large.description = Сильний захисний блок.\nГідний захист від ворогів.\nОхоплює кілька плиток. block.phase-wall.description = Стіна, покрита спеціальним світловідбиваючим складом, який базується на фазовій тканині. Відхиляє більшість куль при ударі. @@ -1085,21 +1133,23 @@ 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 = Діє як міст для двох каналів перетину. Корисно в ситуаціях, коли два різні трубопроводи перевозять різні рідини в різні місця. 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.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 0b14969b5c..25834625fa 100644 --- a/core/assets/bundles/bundle_zh_CN.properties +++ b/core/assets/bundles/bundle_zh_CN.properties @@ -1,35 +1,39 @@ -credits.text = 由[ROYAL]Anuken[]开发 - [SKY]anukendev@gmail.com[] +credits.text = 作者[ROYAL]Anuken[] - [SKY]anukendev@gmail.com[] credits = 致谢 -contributors = 译者和贡献者 -discord = 加入 Mindustry 的 Discord! -link.discord.description = 官方 Mindustry Discord 聊天室 -link.github.description = 游戏源码 -link.changelog.description = 更新列表 -link.dev-builds.description = 不稳定开发版 -link.trello.description = Trello board 上的官方计划表 -link.itch.io.description = PC版下载和网页版(itch.io) -link.google-play.description = 从谷歌商店获取安卓版 -link.wiki.description = 官方 Mindustry 维基 -linkfail = 打开链接失败!\n网址已经复制到剪贴板。 -screenshot = 屏幕截图已放在 {0} +contributors = 翻译者和贡献者 +discord = 加入 Mindustry 的 Discord! +link.discord.description = Mindustry 官方的 Discord 聊天室 +link.reddit.description = Mindustry 的 reddit 板块 +link.github.description = 游戏源代码 +link.changelog.description = 更新日志 +link.dev-builds.description = 不稳定的开发版本 +link.trello.description = 官方列于 Trello 的功能计划表 +link.itch.io.description = itch.io 上的 PC 版下载 +link.google-play.description = Google Play 页面 +link.wiki.description = Mindustry 官方 Wiki +linkfail = 打开链接失败!\n网址已复制到您的剪贴板。 +screenshot = 屏幕截图已保存到 {0} screenshot.invalid = 地图太大,可能没有足够的内存用于截图。 gameover = 你的核心被摧毁了! -gameover.pvp = [accent] {0}[]队获胜! +gameover.pvp = [accent] {0}[]队获胜! highscore = [accent]新纪录! copied = 已复制。 + load.sound = 音乐加载中 load.map = 地图加载中 load.image = 图片加载中 load.content = 内容加载中 load.system = 系统加载中 load.mod = 模组加载中 + schematic = 蓝图 -schematic.add = 保存蓝图中…… +schematic.add = 保存蓝图… schematics = 蓝图 -schematic.import = 导入蓝图中…… +schematic.replace = 此名称的蓝图已存在,是否覆盖? +schematic.import = 导入蓝图… schematic.exportfile = 导出文件 -schematic.importfile = 导入文件 -schematic.browseworkshop = 流览创意工坊 +schematic.importfile = 导入蓝图 +schematic.browseworkshop = 浏览创意工坊 schematic.copy = 复制蓝图到剪贴板 schematic.copy.import = 从剪贴板导入蓝图 schematic.shareworkshop = 在创意工坊上分享蓝图 @@ -37,23 +41,25 @@ schematic.flip = [accent][[{0}][]/[accent][[{1}][]:翻转蓝图 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} -stat.destroyed = 摧毁的建筑:[accent]{0} -stat.deconstructed = 拆除的建筑:[accent]{0} -stat.delivered = 发射的资源: -stat.rank = 最终等级:[accent]{0} -launcheditems = [accent]发射的资源 -launchinfo = [unlaunched][[LAUNCH] your core to obtain the items indicated in blue. -map.delete = 确定要删除 "[accent]{0}[]" 地图吗? +schematic.info = {0}x{1},{2} 个方块 + +stat.wave = 防守波数:[accent]{0} +stat.enemiesDestroyed = 消灭敌人:[accent]{0} +stat.built = 建造建筑:[accent]{0} +stat.destroyed = 摧毁建筑:[accent]{0} +stat.deconstructed = 拆除建筑:[accent]{0} +stat.delivered = 运走资源: +stat.rank = 最终评级:[accent]{0} + +launcheditems = [accent]装运的资源 +launchinfo = [unlaunched][[LAUNCH] 你的核心将获得用蓝色标识出的资源。 +map.delete = 确定要删除“[accent]{0}[]”地图吗? level.highscore = 最高分:[accent]{0} level.select = 选择关卡 level.mode = 游戏模式: showagain = 下次不再显示 coreattack = < 核心正在受到攻击!> -nearpoint = [[ [scarlet]立即离开敌人出生点[] ]\n将被全部清除 +nearpoint = [[ [scarlet]立即离开敌人出生点[] ]\n即将被摧毁 database = 核心数据库 savegame = 保存游戏 loadgame = 载入游戏 @@ -66,37 +72,45 @@ position = 位置 close = 关闭 website = 官网 quit = 退出 -save.quit = Save & Quit +save.quit = 保存并退出 maps = 地图 maps.browse = 浏览地图 continue = 继续 -maps.none = [LIGHT_GRAY]没有找到地图! +maps.none = [lightgray]没有找到任何地图! invalid = 无效 +pickcolor = 选择颜色 preparingconfig = 正在准备配置 preparingcontent = 正在准备内容 uploadingcontent = 正在上传内容 uploadingpreviewfile = 正在上传预览文件 -committingchanges = 提交更改 +committingchanges = 正在提交更改 done = 已完成 -mods.alphainfo = 请注意在测试版本中的模组[scarlet]可能有缺陷[]。\n在 Mindustry Github 或 Discord上报告你发现的问题。 -mods.alpha = [accent](测试版) +feature.unsupported = 您的设备不支持此功能。 + +mods.alphainfo = 请注意,测试版本(alpha)中的模组(mods)[scarlet]很容易存在缺陷[]。\n在 Mindustry 的 GitHub 或 Discord 上报告你发现的问题。 +mods.alpha = [accent](Alpha) mods = 模组 -mods.none = [LIGHT_GRAY]无模组! +mods.none = [LIGHT_GRAY]没有找到模组! mods.guide = 模组教程 mods.report = 报告 Bug +mods.openfolder = 打开模组文件夹 mod.enabled = [lightgray]已启用 mod.disabled = [scarlet]已禁用 mod.disable = 禁用 +mod.delete.error = 无法删除模组。可能文件被占用。 +mod.missingdependencies = [scarlet]缺少依赖条件:{0} +mod.nowdisabled = [scarlet]“{0}”模组缺少依赖条件:[accent] {1}\n[lightgray]需要先下载上述模组。\n此模组现在将自动禁用。 mod.enable = 启用 mod.requiresrestart = 需要重启使模组生效。 mod.reloadrequired = [scarlet]需要重启 mod.import = 导入模组 -mod.import.github = 导入 Github 模组 +mod.import.github = 导入 GitHub 模组 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.missing = 此存档包含您最近已更新或者现在未安装的模组。存档可能会损坏。确定要加载它吗?\n[lightgray]模组:\n{0} +mod.preview.missing = 在创意工坊中发布此模组前,您必须添加一则预览图像。\n请将名为[accent] preview.png[] 的图像放入模组文件夹,然后重试。 +mod.folder.missing = 只有文件夹形式的模组能在创意工坊上发布。\n若要将任何模组转换为文件夹,只需将其文件解压缩到文件夹中并删除旧压缩包,然后重新启动游戏或重新加载模组。 + about.button = 关于 name = 名字: noname = 先取一个[accent]玩家名[]。 @@ -104,16 +118,16 @@ filename = 文件名: unlocked = 新方块已解锁! completed = [accent]己研究 techtree = 科技树 -research.list = [LIGHT_GRAY]研究: +research.list = [lightgray]研究: research = 研究 -researched = [LIGHT_GRAY]{0}己研究。 -players = {0} 玩家在线 -players.single = {0}玩家在线 -server.closing = [accent]正在关闭服务器…… +researched = [lightgray]{0}己研究。 +players = {0} 位玩家在线 +players.single = {0} 位玩家在线 +server.closing = [accent]服务器关闭… server.kicked.kick = 你被踢出了服务器。 server.kicked.whitelist = 你不在白名单中。 server.kicked.serverClose = 服务器已关闭。 -server.kicked.vote = 你被投票踢出了服务器。永别了。 +server.kicked.vote = 你被投票踢出了服务器。 server.kicked.clientOutdated = 客户端过旧,请更新你的游戏。 server.kicked.serverOutdated = 服务器过旧,请联系房主升级服务器。 server.kicked.banned = 你在这个服务器上被拉入黑名单了。 @@ -126,13 +140,13 @@ server.kicked.idInUse = 你已在这个服务器上!不允许用两个账号 server.kicked.customClient = 这个服务器不支持自定义版本。请下载官方版本。 server.kicked.gameover = 游戏结束! server.versions = 客户端版本:[accent] {0}[]\n服务器版本:[accent] {1}[] -host.info = [accent]创建局域网游戏[]按钮会在[scarlet] 6567 []端口运行一个服务器。[]\n任何在同一个[LIGHT_GRAY] Wi-Fi 或本地网络[]下的人应该都可以在服务器列表中看到你的服务器。\n\n如果你想让别人在任何地方都能通过 IP 地址连接,你需要设定[accent]端口转发[]。\n\n[LIGHT_GRAY]注意:如果某人无法连接到你的局域网游戏,请确保你在防火墙设置里允许了 Mindustry 访问本地网络。 -join.info = 此时,可以输入[accent]服务器的 IP 地址[]来连接,或寻找[accent]本地网络[]中的服务器来连接。\n局域网或广域网多人游戏都支持。\n\n[LIGHT_GRAY]注意:没有全球服务器列表;如果你想通过 IP 地址连接某个服务器,你需要向房主询问 IP 地址。 +host.info = [accent]创建局域网游戏[]按钮会在[scarlet] 6567 []端口运行一个服务器。[]\n任何在同一个[lightgray] Wi-Fi 或本地网络[]下的人应该都可以在服务器列表中看到你的服务器。\n\n如果你想让别人在任何地方都能通过 IP 地址连接,你需要设定[accent]端口转发[]。\n\n[lightgray]注意:如果某人无法连接到你的局域网游戏,请确保你在防火墙设置里允许了 Mindustry 访问本地网络。 +join.info = 您可以输入[accent]服务器的 IP 地址[]来连接,或寻找[accent]本地网络[]中的服务器来连接。\n支持局域网或广域网的多人游戏。\n\n[lightgray]注意:没有全球服务器列表;如果你想通过 IP 地址连接某个服务器,你需要向房主询问 IP 地址。 hostserver = 创建服务器 invitefriends = 邀请朋友 hostserver.mobile = 创建\n服务器 host = 创建 -hosting = [accent]正在打开服务器…… +hosting = [accent]正在开启服务器… hosts.refresh = 刷新 hosts.discovering = 正在搜索局域网服务器 hosts.discovering.any = 正在搜索服务器 @@ -171,22 +185,22 @@ disconnect.closed = 连接关闭。 disconnect.timeout = 连接超时。 disconnect.data = 读取服务器数据失败! cantconnect = 无法加入([accent]{0}[])。 -connecting = [accent]连接中…… -connecting.data = [accent]加载中…… +connecting = [accent]连接中… +connecting.data = [accent]加载中… server.port = 端口: -server.addressinuse = 地址已经在使用中! -server.invalidport = 无效的端口号! +server.addressinuse = 地址已在使用! +server.invalidport = 无效的端口! server.error = [crimson]创建服务器错误:[accent]{0} save.new = 新存档 -save.overwrite = 你确定你要覆盖这个存档位吗? +save.overwrite = 你确定你要覆盖这个存档吗? overwrite = 覆盖 -save.none = 没有存档被找到! -saveload = [accent]正在保存…… +save.none = 没有找到存档! +saveload = [accent]正在保存… savefail = 保存失败! save.delete.confirm = 你确定你要删除这个存档吗? save.delete = 删除 save.export = 导出存档 -save.import.invalid = [accent]这个存档是无效的! +save.import.invalid = [accent]此存档无效! save.import.fail = [crimson]导入存档失败:[accent]{0} save.export.fail = [crimson]导出存档失败:[accent]{0} save.import = 导入存档 @@ -195,7 +209,7 @@ save.rename = 重命名 save.rename.text = 新名称: selectslot = 选择一个存档。 slot = [accent]存档位 {0} -editmessage = Edit Message +editmessage = 编辑消息 save.corrupted = [accent]存档损坏或无效!\n如果你刚刚升级了游戏,那么这可能是因为存档格式改变了,而[scarlet]不是[] bug 。 empty = < 空 > on = 开 @@ -226,21 +240,21 @@ data.import.confirm = 导入外部游戏数据将覆盖本地[scarlet]全部[] classic.export = 导出老版本数据 classic.export.text = [accent]Mindustry []已经有了一个重要的更新。\n检测到此为老版本(v3.5 build 40)的存档或地图。是否要将这些保存导出到手机的主文件夹中,以便在 Mindustry 老版本应用程序中使用? quit.confirm = 确定退出? -quit.confirm.tutorial = 你确定要跳过教程?\n教程可以通过[accent]设置->游戏->重新游玩教程[]来再次游玩。 -loading = [accent]加载中…… -reloading = [accent]重载模组中…… -saving = [accent]保存中…… +quit.confirm.tutorial = 确定要跳过教程?\n您可以通过[accent]设置->游戏->重玩教程[]来重玩教程。 +loading = [accent]加载中… +reloading = [accent]重载模组中… +saving = [accent]保存中… cancelbuilding = [accent][[{0}][]来清除规划 selectschematic = [accent][[{0}][]来选择复制 pausebuilding = [accent][[{0}][]来暂停建造 resumebuilding = [scarlet][[{0}][]来恢复建造 -wave = [accent]波次{0} -wave.waiting = [LIGHT_GRAY]下一波将在{0}秒后到来 -wave.waveInProgress = [LIGHT_GRAY]波次进行中 -waiting = [LIGHT_GRAY]等待中…… -waiting.players = 等待玩家中…… -wave.enemies = [LIGHT_GRAY]剩余 {0} 个敌人 -wave.enemy = [LIGHT_GRAY]剩余 {0} 个敌人 +wave = [accent]第{0}波 +wave.waiting = [lightgray]下一波倒计时:{0}秒 +wave.waveInProgress = [lightgray]波次袭来 +waiting = [lightgray]等待中… +waiting.players = 等待玩家中… +wave.enemies = [lightgray]剩余 {0} 个敌人 +wave.enemy = [lightgray]剩余 {0} 个敌人 loadimage = 加载图片 saveimage = 保存图片 unknown = 未知 @@ -255,14 +269,15 @@ map.invalid = 地图载入错误:地图文件可能已经损坏。 workshop.update = 更新地图 workshop.error = 获取创意工坊详细信息时出错:{0} map.publish.confirm = 确定上传此地图?\n\n[lightgray]确定你同意 Steam 创意工坊的最终用户许可协议,否则你的地图将不会被展示! -workshop.menu = Select what you would like to do with this item. -workshop.info = Item Info -changelog = Changelog (optional): +workshop.menu = 选择此项目的目的。 +workshop.info = 项目信息 +changelog = 更新日志(可选): eula = Steam 最终用户许可协议 -missing = 地图已被删除或移动。\n[lightgray]链接已在创意工坊中被删除。 -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} +missing = 此项目已被删除或转移。\n[lightgray]链接已在创意工坊中被删除。 +publishing = [accent]正在发布... +publish.confirm = 确定发布?\n\n[lightgray]请确认您已经同意创意工坊的最终用户许可协议,否则您的项目不会展示! +publish.error = 发布项目出错:{0} +steam.error = 初始化 Steam 服务失败。\n错误:{0} editor.brush = 笔刷 editor.openin = 在编辑器中打开 editor.oregen = 矿石的生成 @@ -270,7 +285,7 @@ editor.oregen.info = 矿石的生成: editor.mapinfo = 地图信息 editor.author = 作者: editor.description = 描述: -editor.nodescription = 地图必须要有不少于4个字符的描述才能上传。 +editor.nodescription = 地图发布前,描述不得少于4个字符。 editor.waves = 波数: editor.rules = 规则: editor.generation = 筛选器: @@ -287,26 +302,26 @@ waves.perspawn = 每次生成 waves.to = 至 waves.boss = BOSS waves.preview = 预览 -waves.edit = 编辑…… +waves.edit = 编辑… waves.copy = 复制到剪贴板 waves.load = 从剪贴板读取 -waves.invalid = 剪贴板中无效的波次信息。 +waves.invalid = 剪贴板中的波次信息无效。 waves.copied = 波次信息已复制。 -waves.none = 无自定义敌人。\n请注意,空布局将自动替换为默认布局。 -editor.default = [LIGHT_GRAY]<默认> -details = 详情…… -edit = 编辑…… +waves.none = 没有定义敌人。\n请注意,空布局将自动替换为默认布局。 +editor.default = [lightgray]<默认> +details = 详情… +edit = 编辑… editor.name = 名称: editor.spawn = 生成单位 editor.removeunit = 移除单位 editor.teams = 队伍 -editor.errorload = 读取文件时出现错误:\n[accent]{0} -editor.errorsave = 保存文件时出现错误:\n[accent]{0} -editor.errorimage = 这是一幅画,不是地图。不要更改文件的扩展名来让他工作。\n\n如果你想导入地图,请在编辑器中使用“导入地图”这一按钮。 -editor.errorlegacy = 此地图太旧,而旧的地图格式不再受支持了。 +editor.errorload = 读取文件出错:\n[accent]{0} +editor.errorsave = 保存文件出错:\n[accent]{0} +editor.errorimage = 这是一幅图片,不是地图。请不要更改文件的扩展名来导入。\n\n如果你想导入地图,请在编辑器中使用“导入地图”按钮。 +editor.errorlegacy = 此地图太旧了,旧的地图格式已不再支持。 editor.errornot = 这不是地图文件。 -editor.errorheader = 此地图文件已失效或损坏。 -editor.errorname = 地图没有被定义的名称。你是否在尝试加载存档文件? +editor.errorheader = 此地图文件无效或已损坏。 +editor.errorname = 地图没有定义名称。是否要加载一个存档文件? editor.update = 更新 editor.randomize = 随机化 editor.apply = 应用 @@ -316,16 +331,16 @@ editor.loadmap = 载入地图 editor.savemap = 保存地图 editor.saved = 已保存! editor.save.noname = 你的地图没有名字!在“地图信息”菜单里设置一个。 -editor.save.overwrite = 你的地图覆盖了一个内建的地图!在“地图信息”菜单里重新设置一个不同的名称。 -editor.import.exists = [scarlet]无法导入:[]名为‘{0}’的内建地图已存在! -editor.import = 导入…… +editor.save.overwrite = 你的地图覆盖了一个内置的地图!在“地图信息”菜单里重新设置一个不同的名称。 +editor.import.exists = [scarlet]无法导入:[]存在名为“{0}”的内置地图! +editor.import = 导入… editor.importmap = 导入地图 editor.importmap.description = 导入一个已经存在的地图 editor.importfile = 导入文件 editor.importfile.description = 导入一个外置的地图文件 editor.importimage = 导入地形图像 editor.importimage.description = 导入一个外置的地图图像文件 -editor.export = 导出…… +editor.export = 导出… editor.exportfile = 导出文件 editor.exportfile.description = 导出一个地图文件 editor.exportimage = 导出一个地形文件 @@ -339,6 +354,7 @@ editor.overwrite = [accent]警告!\n这将会覆盖一个已经存在的地图 editor.overwrite.confirm = [scarlet]警告![]存在同名地图。你确定你想要覆盖? editor.exists = 已经存在同名地图。 editor.selectmap = 选择一个地图加载: + toolmode.replace = 替换 toolmode.replace.description = 仅在实心块上绘制。 toolmode.replaceall = 全部替换 @@ -353,7 +369,8 @@ toolmode.fillteams = 填充团队 toolmode.fillteams.description = 填充团队而不是方块。 toolmode.drawteams = 绘制团队 toolmode.drawteams.description = 绘制团队而不是方块。 -filters.empty = [LIGHT_GRAY]没有筛选器!用下方的按钮添加一个。 + +filters.empty = [lightgray]没有筛选器!用下方的按钮添加一个。 filter.distort = 扭曲程度 filter.noise = 波动程度 filter.median = 平均数 @@ -384,6 +401,7 @@ filter.option.floor2 = 二重地面 filter.option.threshold2 = 二重阈值 filter.option.radius = 半径大小 filter.option.percentile = 百分比 + width = 宽度: height = 高度: menu = 菜单 @@ -396,49 +414,50 @@ ping = 延迟:{0}毫秒 language.restart = 为了使语言设置生效请重启游戏。 settings = 设置 tutorial = 教程 -tutorial.retake = 重新游玩教程 +tutorial.retake = 重玩教程 editor = 编辑器 mapeditor = 地图编辑器 + abandon = 放弃 abandon.text = 这个区域及其资源会被敌人重置。 locked = 已锁定 -complete = [LIGHT_GRAY]完成: -requirement.wave = Reach Wave {0} in {1} +complete = [lightgray]完成: +requirement.wave = {1}中的第{0}波次 requirement.core = 在{0}中摧毁敌方核心 requirement.unlock = 解锁{0} -resume = 暂停:\n[LIGHT_GRAY]{0} -bestwave = [LIGHT_GRAY]最高波次:{0} +resume = 暂停:\n[lightgray]{0} +bestwave = [lightgray]最高波次:{0} launch = < 发射 > launch.title = 发射成功 -launch.next = [LIGHT_GRAY]下一个发射机会在第 {0} 波 +launch.next = [lightgray]下个发射窗口在第{0}波 launch.unable2 = [scarlet]无法发射[] -launch.confirm = 您将发射核心中所有资源。\n此地图将重置。 -launch.skip.confirm = 如果你现在跳过,在后来的波次前你将无法发射。 +launch.confirm = 您将装载并发射核心中的所有资源。\n此地图将重置,无法回到此基地。 +launch.skip.confirm = 如果现在跳过,在下一个发射窗口到来前,您都无法发射。 uncover = 解锁 -configure = 设定发射资源数量 +configure = 设定装运的数量 bannedblocks = 禁用方块 addall = 添加所有 -configure.locked = [LIGHT_GRAY]到达第{0}波\n才能设定发射资源。 +configure.locked = [lightgray]完成{0}\n解锁装运配置。 configure.invalid = 数量必须是0到{0}之间的数字。 -zone.unlocked = [LIGHT_GRAY]{0} 已解锁。 -zone.requirement.complete = 已达到第{0}波。\n达到解锁{1}的需求。 -zone.config.unlocked = Loadout unlocked:[lightgray]\n{0} +zone.unlocked = [lightgray]{0} 已解锁。 +zone.requirement.complete = 完成{0}。\n达成解锁{1}的需求。 +zone.config.unlocked = 资源装运已解锁:[lightgray]\n{0} zone.resources = 地图中的资源: zone.objective = [lightgray]目标:[accent]{0} zone.objective.survival = 生存 zone.objective.attack = 摧毁敌方核心 -add = 添加…… +add = 添加… boss.health = BOSS 生命值 connectfail = [crimson]服务器连接失败:[accent]{0} -error.unreachable = 服务器无法访问。\n确定输对地址了吗? +error.unreachable = 无法访问服务器。\n确定输对地址了吗? error.invalidaddress = 地址无效。 -error.timedout = 连接超时!\n确保服务器设置了端口转发,并且地址正确! -error.mismatch = 不匹配。\n可能是客户端/服务器版本不匹配。\n请确保客户端和服务器都是最新的版本! +error.timedout = 连接超时!\n请确认服务器设置了端口转发且地址无误! +error.mismatch = 数据包错误。\n可能是客户端/服务器的版本不匹配。\n请确保客户端和服务器都是最新的版本! error.alreadyconnected = 已连接。 -error.mapnotfound = 找不到地图文件! +error.mapnotfound = 找不到地图文件! error.io = 网络 I/O 错误。 error.any = 未知网络错误。 -error.bloom = 未能初始化特效。\n您的设备可能不支持它。 +error.bloom = 未能初始化特效。\n您的设备可能不支持。 zone.groundZero.name = 零号地区 zone.desertWastes.name = 荒芜沙漠 zone.craters.name = 陨石带 @@ -453,31 +472,33 @@ 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.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.ruinousShores.description = 穿过荒地,就是海岸线。这个地方曾经建造了一个海岸防御线。但现在所剩无几,只有最基本的防御结构仍然毫发无损,其他一切都被摧毁了。\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 = <在此处插入说明> +zone.impact0078.description = <描述空缺> +zone.crags.description = <描述空缺> + settings.language = 语言 settings.data = 游戏数据 -settings.reset = 恢复默认 +settings.reset = 恢复默认设置 settings.rebind = 重新绑定 settings.controls = 控制 settings.game = 游戏 settings.sound = 声音 settings.graphics = 图像 -settings.cleardata = 清除游戏数据…… -settings.clear.confirm = 您确定要清除数据吗?\n这个操作无法撤销! -settings.clearall.confirm = [scarlet]警告![]\n这将清除所有数据,包括存档、地图、解锁和绑定键。\n按「是」后,游戏将删除所有数据并自动退出。 +settings.cleardata = 清除游戏数据… +settings.clear.confirm = 您确定要清除此数据?\n此操作无法撤销! +settings.clearall.confirm = [scarlet]警告![]\n这将清除所有数据,包括存档、地图、解锁和按键绑定。\n按「是」后,游戏将删除所有数据并自动退出。 paused = [accent]< 暂停 > clear = 清除 banned = [scarlet]已禁止 @@ -488,8 +509,8 @@ error.title = [crimson]发生了一个错误 error.crashtitle = 发生了一个错误 blocks.input = 输入 blocks.output = 输出 -blocks.booster = 加成物品/液体 -block.unknown = [LIGHT_GRAY]??? +blocks.booster = 增强物品/液体 +block.unknown = [lightgray]??? blocks.powercapacity = 能量容量 blocks.powershot = 能量/发射 blocks.damage = 伤害 @@ -501,6 +522,7 @@ blocks.shootrange = 范围 blocks.size = 尺寸 blocks.liquidcapacity = 液体容量 blocks.powerrange = 能量范围 +blocks.powerconnections = 最多连接 blocks.poweruse = 能量使用 blocks.powerdamage = 功率/损伤 blocks.itemcapacity = 物品容量 @@ -511,7 +533,7 @@ blocks.speedincrease = 提速 blocks.range = 范围 blocks.drilltier = 可钻探矿物 blocks.drillspeed = 基础钻探速度 -blocks.boosteffect = 加成影响 +blocks.boosteffect = 增强效果 blocks.maxunits = 最大单位数量 blocks.health = 生命值 blocks.buildtime = 建造时间 @@ -519,9 +541,10 @@ blocks.buildcost = 建造花费 blocks.inaccuracy = 误差 blocks.shots = 发射数 blocks.reload = 每秒发射数 -blocks.ammo = 子弹 +blocks.ammo = 弹药 bar.drilltierreq = 需要更好的钻头 -bar.drillspeed = 挖掘速度:{0}/s +bar.drillspeed = 挖掘速度:{0}/秒 +bar.pumpspeed = 泵压速度:{0}/秒 bar.efficiency = 效率:{0}% bar.powerbalance = 能量:{0}/秒 bar.powerstored = 储能:{0}/{1} @@ -534,6 +557,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] 燃烧 @@ -543,7 +568,7 @@ bullet.frag = [stat] 分裂 bullet.knockback = [stat]{0}[lightgray] 击退 bullet.freezing = [stat] 冰冻 bullet.tarred = [stat] 减速 -bullet.multiplier = [stat]{0}[lightgray]x 子弹数量 +bullet.multiplier = [stat]{0}[lightgray]x 弹药数量 bullet.reload = [stat]{0}[lightgray]x 装弹 unit.blocks = 方块 unit.powersecond = 能量单位/秒 @@ -563,14 +588,16 @@ category.liquids = 液体 category.items = 物品 category.crafting = 制造 category.shooting = 发射 -category.optional = 可选的增强物品 +category.optional = 可选的增强 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](需要重新启动)[] +setting.antialias.name = 抗锯齿[lightgray](需要重新启动)[] setting.indicators.name = 队友指示器 setting.autotarget.name = 自动射击 setting.keyboard.name = 鼠标+键盘操控 @@ -578,7 +605,7 @@ setting.touchscreen.name = 触屏操控 setting.fpscap.name = 最大FPS setting.fpscap.none = 无 setting.fpscap.text = {0} FPS -setting.uiscale.name = UI缩放比例[lightgray](需要重新启动)[] +setting.uiscale.name = UI缩放比例[lightgray](需要重新启动)[] setting.swapdiagonal.name = 自动铺设 setting.difficulty.training = 训练 setting.difficulty.easy = 简单 @@ -588,46 +615,49 @@ setting.difficulty.insane = 疯狂 setting.difficulty.name = 难度: setting.screenshake.name = 屏幕抖动 setting.effects.name = 显示效果 +setting.destroyedblocks.name = 显示摧毁的块 +setting.conveyorpathfinding.name = 传送带放置寻路 setting.sensitivity.name = 控制器灵敏度 setting.saveinterval.name = 自动保存间隔 setting.seconds = {0} 秒 setting.fullscreen.name = 全屏 -setting.borderlesswindow.name = 无边框窗口[LIGHT_GRAY] (可能需要重启) +setting.borderlesswindow.name = 无边框窗口[lightgray](可能需要重启) setting.fps.name = 显示 FPS setting.vsync.name = 垂直同步 -setting.pixelate.name = 像素画面 [LIGHT_GRAY](禁用动画) +setting.pixelate.name = 像素画面 [lightgray](禁用动画) setting.minimap.name = 显示小地图 setting.position.name = 显示玩家坐标 setting.musicvol.name = 音乐音量 -setting.ambientvol.name = 环境体积 -setting.mutemusic.name = 静音 +setting.ambientvol.name = 环境音量 +setting.mutemusic.name = 无音乐 setting.sfxvol.name = 音效音量 -setting.mutesound.name = 静音 -setting.crashreport.name = 发送匿名崩溃报告 +setting.mutesound.name = 无音效 +setting.crashreport.name = 发送匿名的崩溃报告 setting.savecreate.name = 自动创建存档 -setting.publichost.name = 公共游戏旁观 -setting.chatopacity.name = 聊天界面透明度 +setting.publichost.name = 游戏公开可见 +setting.chatopacity.name = 聊天界面不透明度 setting.lasersopacity.name = 能量激光不透明度 -setting.playerchat.name = 显示游戏内聊天界面 -public.confirm = 确定开启旁观?\n[lightgray]可在设置->游戏->公共游戏旁观中修改。 -public.beta = 请注意,测试版的游戏不能公共旁观。 -uiscale.reset = UI缩放比例已经改变。\n按下“确定”来确定缩放比例\n[accent]{0}[]秒后[scarlet]退出并恢复设定。 +setting.playerchat.name = 显示玩家聊天气泡 +public.confirm = 确定使您的游戏公开可见?\n[accent]其他人将可以加入到您的游戏。\n[lightgray]您之后可以在 设置->游戏->游戏公开可见 更改。 +public.beta = 请注意,测试版的游戏不能公开可见。 +uiscale.reset = UI缩放比例已更改。\n按下“确定”来执行缩放比例的更改。\n[accent]{0}[]秒后[scarlet]将自动退出并还原设置。 uiscale.cancel = 取消并退出 setting.bloom.name = 特效 keybind.title = 重新绑定按键 -keybinds.mobile = [scarlet]这里的大多数键绑定在移动设备上都不起作用。仅支持基本运动。 -category.general.name = 普通 -category.view.name = 查看 +keybinds.mobile = [scarlet]这里的大多数按键绑定在移动设备上都不能用。仅支持基本的移动。 +category.general.name = 常规 +category.view.name = 视图 category.multiplayer.name = 多人 command.attack = 攻击 -command.rally = 集合 +command.rally = 团体 command.retreat = 撤退 keybind.clear_building.name = 清除建筑 -keybind.press = 按一下键…… -keybind.press.axis = 按一下轴或键…… +keybind.press = 请按一个键… +keybind.press.axis = 请按一个轴或键… keybind.screenshot.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 = 水平翻转 @@ -637,9 +667,9 @@ keybind.select.name = 选择/射击 keybind.diagonal_placement.name = 自动铺设 keybind.pick.name = 选择方块 keybind.break_block.name = 破坏方块 -keybind.deselect.name = 取消 +keybind.deselect.name = 取消选择 keybind.shoot.name = 射击 -keybind.zoom_hold.name = 保持缩放 +keybind.zoom_hold.name = 按住调整缩放 keybind.zoom.name = 缩放 keybind.menu.name = 菜单 keybind.pause.name = 暂停 @@ -651,41 +681,43 @@ keybind.player_list.name = 玩家列表 keybind.console.name = 控制台 keybind.rotate.name = 旋转 keybind.rotateplaced.name = 旋转全部(长按) -keybind.toggle_menus.name = 切换菜单 -keybind.chat_history_prev.name = 前面的聊天记录 -keybind.chat_history_next.name = 后面的聊天记录 +keybind.toggle_menus.name = 显隐选项 +keybind.chat_history_prev.name = 聊天记录向前 +keybind.chat_history_next.name = 聊天记录向后 keybind.chat_scroll.name = 聊天记录滚动 -keybind.drop_unit.name = 释放单位 +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.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.attack.description = 没有波次,但需要摧毁敌人的基地。\n[gray]需要地图中有红色的核心。 mode.custom = 自定义模式 + rules.infiniteresources = 无限资源 +rules.reactorexplosions = 反应堆爆炸 rules.wavetimer = 波次计时器 rules.waves = 波次 rules.attack = 攻击模式 -rules.enemyCheat = 敌人无限资源 +rules.enemyCheat = 敌人(红队)无限资源 rules.unitdrops = 敌人出生点 rules.unitbuildspeedmultiplier = 单位生产速度倍数 rules.unithealthmultiplier = 单位生命倍数 rules.playerhealthmultiplier = 玩家生命倍数 rules.playerdamagemultiplier = 玩家伤害倍数 rules.unitdamagemultiplier = 单位伤害倍数 -rules.enemycorebuildradius = 敌对核心非建设区半径:[LIGHT_GRAY](格) -rules.respawntime = 重生时间:[LIGHT_GRAY](秒) -rules.wavespacing = 波次间隔时间:[LIGHT_GRAY](秒) +rules.enemycorebuildradius = 敌对核心非建设区半径:[lightgray](格) +rules.respawntime = 重生时间:[lightgray](秒) +rules.wavespacing = 波次间隔时间:[lightgray](秒) rules.buildcostmultiplier = 建设花费倍数 rules.buildspeedmultiplier = 建设时间倍数 rules.waitForWaveToEnd = 等待敌人时间 -rules.dropzoneradius = 敌人出生点毁灭大小:[LIGHT_GRAY](格) +rules.dropzoneradius = 敌人出生点毁灭大小:[lightgray](格) rules.respawns = 每波最大重生次数 rules.limitedRespawns = 重生限制次数 rules.title.waves = 波次 @@ -740,21 +772,22 @@ mech.trident-ship.name = Trident mech.trident-ship.weapon = 炸弹 mech.glaive-ship.name = Glaive mech.glaive-ship.weapon = 火焰机枪 -item.explosiveness = [LIGHT_GRAY]爆炸性:{0} -item.flammability = [LIGHT_GRAY]易燃性:{0} -item.radioactivity = [LIGHT_GRAY]放射性:{0} -unit.health = [LIGHT_GRAY]生命值:{0} -unit.speed = [LIGHT_GRAY]速度:{0} -mech.weapon = [LIGHT_GRAY]武器:{0} -mech.health = [LIGHT_GRAY]生命值:{0} -mech.itemcapacity = [LIGHT_GRAY]物品容量:{0} -mech.minespeed = [LIGHT_GRAY]采矿速度:{0} -mech.minepower = [LIGHT_GRAY]采矿力量:{0} -mech.ability = [LIGHT_GRAY]能力:{0} -mech.buildspeed = [LIGHT_GRAY]建造速度:{0}% -liquid.heatcapacity = [LIGHT_GRAY]热容量:{0} -liquid.viscosity = [LIGHT_GRAY]粘度:{0} -liquid.temperature = [LIGHT_GRAY]温度:{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.ability = [lightgray]能力:{0} +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 = 盐碱地 @@ -781,7 +814,7 @@ block.thruster.name = 助力器 block.kiln.name = 熔炉 block.graphite-press.name = 石墨压缩机 block.multi-press.name = 多重压缩机 -block.constructing = {0}\n[LIGHT_GRAY](建造中) +block.constructing = {0}\n[lightgray](建造中) block.spawn.name = 敌人出生点 block.core-shard.name = 小型核心 block.core-foundation.name = 中型核心 @@ -830,6 +863,8 @@ block.copper-wall.name = 铜墙 block.copper-wall-large.name = 大型铜墙 block.titanium-wall.name = 钛墙 block.titanium-wall-large.name = 大型钛墙 +block.plastanium-wall.name = 塑钢墙 +block.plastanium-wall-large.name = 大型塑钢墙 block.phase-wall.name = 相织布墙 block.phase-wall-large.name = 大型相织布墙 block.thorium-wall.name = 钍墙 @@ -844,13 +879,14 @@ block.lancer.name = 蓝瑟炮 block.conveyor.name = 传送带 block.titanium-conveyor.name = 钛传送带 block.armored-conveyor.name = 装甲传送带 -block.armored-conveyor.description = 向钛传送带一样运物品,但有更好的装甲。除其他传送带,不接受任何边的输入。 -block.junction.name = 连接点 +block.armored-conveyor.description = 运送物品,与钛传送带一样的速度,但有更强的装甲。除其他传送带,不接受任何边的输入。 +block.junction.name = 连接桥 block.router.name = 路由器 block.distributor.name = 分配器 block.sorter.name = 分类器 block.inverted-sorter.name = 反向分类器 -block.message.name = 信使 +block.message.name = 信息板 +block.illuminator.name = Illuminator block.overflow-gate.name = 溢流门 block.silicon-smelter.name = 硅冶炼厂 block.phase-weaver.name = 相织布编织器 @@ -864,6 +900,7 @@ block.coal-centrifuge.name = 煤炭离心机 block.power-node.name = 能量节点 block.power-node-large.name = 大型能量节点 block.surge-tower.name = 巨浪塔 +block.diode.name = Battery Diode block.battery.name = 电池 block.battery-large.name = 大型电池 block.combustion-generator.name = 燃烧发电机 @@ -916,10 +953,11 @@ block.fortress-factory.name = 堡垒机甲工厂 block.revenant-factory.name = 亡魂战机工厂 block.repair-point.name = 维修点 block.pulse-conduit.name = 脉冲导管 +block.plated-conduit.name = Plated Conduit 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.thorium-reactor.name = 钍反应堆 @@ -944,13 +982,13 @@ block.meltdown.name = 熔毁 block.container.name = 容器 block.launch-pad.name = 发射台 block.launch-pad-large.name = 大型发射台 -team.blue.name = 胖次蓝 -team.crux.name = 姨妈红 -team.sharded.name = 哲学黄 -team.orange.name = 太阳橙 -team.derelict.name = 高冷灰 -team.green.name = 原谅绿 -team.purple.name = 基佬紫 +team.blue.name = 蓝 +team.crux.name = 红 +team.sharded.name = 黄 +team.orange.name = 橙 +team.derelict.name = 灰 +team.green.name = 绿 +team.purple.name = 紫 unit.spirit.name = 幽灵修理机 unit.draug.name = 德鲁格采矿机 unit.phantom.name = 鬼怪建造机 @@ -968,24 +1006,26 @@ unit.lich.name = 尸鬼 unit.reaper.name = 死神 tutorial.next = [lightgray]<点击以继续> tutorial.intro = 你进入了[scarlet] Mindustry 教程[]。\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 物品 -tutorial.turret = 必须建造防御建筑来击退[LIGHT_GRAY]敌人[]。\n请在核心附近造一个双管炮。 +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 物品 +tutorial.turret = 必须建造防御建筑来击退[lightgray]敌人[]。\n请在核心附近造一个双管炮。 tutorial.drillturret = 双管炮需要[accent]铜[]作弹药来射击。\n可以放一个钻头在炮塔附近供应铜。 tutorial.pause = 在战斗中,您可以[accent]暂停游戏[]。\n暂停时您可以规划建筑物。\n\n按[accent]空格[]暂停。 tutorial.pause.mobile = 在战斗中,您可以[accent]暂停游戏[]。\n暂停时您可以规划建筑物。\n\n[accent]点击左上角的按钮以暂停。 tutorial.unpause = 现在再次按空格以继续。 -tutorial.unpause.mobile = 现在再次点击以继续。 +tutorial.unpause.mobile = 现在再次点按以继续。 tutorial.breaking = 方块经常需要拆除。\n[accent]按住鼠标右键[]来拆除选中的方块。[]\n\n[accent]使用范围拆除来拆除核心左侧的废墙。 tutorial.breaking.mobile = 方块经常需要拆除。\n[accent]选择拆除模式[],点击方块以拆除。\n[accent]长按几秒[]并拖动来范围拆除。\n点击对号来确定。\n\n[accent]使用范围拆除来拆除核心左侧的废墙。 tutorial.withdraw = 有时,从方块中取出物品是必要的。\n[accent]点击有物品的方块[],然后[accent]点击在方框中的物品[]。\n可以通过[accent]点击或长按[]来取出物品。\n\n[accent]从核心中取出一些铜[]。 tutorial.deposit = 将物品从机甲拖向方块来放下物品。\n\n[accent]将铜放回核心[]。 -tutorial.waves = [lightgray]敌人[]来了。\n\n保护核心,防御2波攻击。造更多的炮塔。[accent]点击[]以射击。\n建造更多的炮塔和钻头,并采更多的矿。 -tutorial.waves.mobile = [lightgray]敌人[]来了。\n\n保护核心,防御2波攻击。造更多的炮塔。你的机甲将对敌人自动开火。\n建造更多的炮塔和钻头,并采更多的矿。 +tutorial.waves = [lightgray]敌人[]来了。\n\n保护核心,防御两波攻击。造更多的炮塔。[accent]点击[]以射击。\n建造更多的炮塔和钻头,并采更多的矿。 +tutorial.waves.mobile = [lightgray]敌人[]来了。\n\n保护核心,防御两波攻击。造更多的炮塔。你的机甲将对敌人自动开火。\n建造更多的炮塔和钻头,并采更多的矿。 tutorial.launch = 特定波次中,你可以[accent]发射核心[],[accent]携带核心中所有资源[]离开所有的建筑。\n资源可用来研究科技。\n\n[accent]点击发射按钮。 + item.copper.description = 一种有用的结构材料。在各种类型的方块中广泛使用。 item.lead.description = 一种基本的起始材料。广泛用于电子设备和液体运输。 item.metaglass.description = 一种超级强硬的复合玻璃。通常用来传送和收藏液体。 @@ -1036,86 +1076,90 @@ 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 = 将废料压碎成沙子。当缺少天然沙子时很有用。 block.coal-centrifuge.description = 使石油凝固成煤块。 block.incinerator.description = 用于除掉任何多余的物品或液体。 -block.power-void.description = 消耗输入的所有功率。仅限沙盒。 -block.power-source.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.titanium-wall.description = 中等强度的防御挡块。\n提供中等强度的防御以抵御敌人。 -block.titanium-wall-large.description = 一个中等强度的防御块。\n提供中等强度的防御以防敌人攻击。\n跨越多个区块。 -block.thorium-wall.description = 强大的防守区块。\n很好的防御敌人。 -block.thorium-wall-large.description = 强大的防守区块。\n很好地防御敌人。\n跨越多个区块。 -block.phase-wall.description = 没有钍墙那样坚固,但是它可以使不太强的子弹发生偏转。 -block.phase-wall-large.description = 没有钍墙那样坚固,但是它可以使不太强的子弹发生偏转。\n跨越多个区块。 -block.surge-wall.description = 强大的防守区块。\n有很小的机会向攻击者发射闪电。 -block.surge-wall-large.description = 强大的防御区块。\n有很小的机会向攻击者发射闪电。\n跨越多个区块。 +block.copper-wall.description = 廉价的防御方块。\n适合在前几个波次中保护核心和炮塔。 +block.copper-wall-large.description = 廉价的防御方块。\n适合在前几个波次中保护核心和炮塔。\n跨越多个区块。 +block.titanium-wall.description = 中等强度的防御方块。\n提供中等强度的防御以抵御敌人。 +block.titanium-wall-large.description = 中等强度的防御方块。\n提供中等强度的防御以防敌人攻击。\n跨越多个区块。 +block.plastanium-wall.description = 一种特殊的防御方块,能吸收电弧、自动与能量节点连接。 +block.plastanium-wall-large.description = 一种特殊的防御方块,能吸收电弧、自动与能量节点连接。\n跨越多个区块。 +block.thorium-wall.description = 强大的防御方块。\n可以很好的防御敌人。 +block.thorium-wall-large.description = 强大的防御方块。\n很好地防御敌人。\n跨越多个区块。 +block.phase-wall.description = 没有钍墙那样坚固,但是它可以使不太强的弹药发生偏转。 +block.phase-wall-large.description = 没有钍墙那样坚固,但是它可以使不太强的弹药发生偏转。\n跨越多个区块。 +block.surge-wall.description = 强大的防御方块。\n有很小的机会向攻击者发射闪电。 +block.surge-wall-large.description = 强大的防御方块。\n有很小的机会向攻击者发射闪电。\n跨越多个区块。 block.door.description = 一扇小门,可以通过点击打开和关闭。\n如果打开,敌人可以射击并穿过。 block.door-large.description = 一扇大门,可以通过点击打开和关闭。\n如果打开,敌人可以射击并穿过。\n跨越多个区块。 -block.mender.description = 定期修理附近的方块,使防御系统在波与波之间得到修复。\n通常使用硅来提高范围和效率。 -block.mend-projector.description = 修理者的升级。定期修复附近的建筑物。 +block.mender.description = 会定期修理附近的方块,使防御系统在波与波之间得到修复。\n可以使用硅来提高修复范围和修复效率。 +block.mend-projector.description = 修理者的升级版,会定期修复附近的建筑物。 block.overdrive-projector.description = 提高附近建筑物的速度,如钻头和传送带。 -block.force-projector.description = 自身周围创建一个六边形力场,使建筑物和内部单位免受子弹的伤害。 +block.force-projector.description = 自身周围创建一个六边形力场,使建筑物和内部单位免受弹药的伤害。 block.shock-mine.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.descriptions = 像标准分类器工作,但将选择的物品向两侧输出。 -block.router.description = 从一个方向接受物品,并将它们平均输出到最多3个其他方向。用于将材料分成多份。 +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.router.description = 从一个方向接受物品,并将它们平均输出到其他3个方向。可以将材料分成多份。 block.distributor.description = 一个高级路由器,可以将物品向最多7个方向输出。 block.overflow-gate.description = 分离器和路由器的组合,如果前面被挡住,则向从左和右输出。 -block.mass-driver.description = 终极传送带。收集物品后将它们射向远处的另一个质量驱动器。 +block.mass-driver.description = 终极传送带,收集物品后将它们射向远处的另一个质量驱动器。 block.mechanical-pump.description = 一种输出速度慢但没有功耗的廉价泵。 -block.rotary-pump.description = 先进的水泵。泵送更多液体,但需要动力。 +block.rotary-pump.description = 先进的水泵。泵送更多液体,但需要能量。 block.thermal-pump.description = 终级水泵。 -block.conduit.description = 基本液体传输块。像传送带一样工作,但用于液体。最适用于从泵或其他导管中提取液体。 -block.pulse-conduit.description = 高级液体传输块。比标准导管更快地输送液体并储存更多液体。 -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.battery.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.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.battery-large.description = 比普通电池容量更大。 -block.combustion-generator.description = 燃烧煤等易燃材料发电。 +block.combustion-generator.description = 燃烧煤等材料发电。 block.thermal-generator.description = 当放置在热的地方时发电。 -block.turbine-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.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.laser-drill.description = 通过激光技术更快开采,但需要电力。这种钻头可以开采放射性钍。 block.blast-drill.description = 终极钻头,需要大量电力。 -block.water-extractor.description = 从地下提取水。当附近没有直接的水来源时使用它。 -block.cultivator.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.vault.description = 存储大量物品。当存在非恒定的材料需求时,使用它来创建缓冲区。[LIGHT_GRAY]卸载器[]可用于从仓库中获取物品。 -block.container.description = 存储少量物品。当存在非恒定的材料需求时,使用它来创建缓冲区。[LIGHT_GRAY]卸载器[]可用于从容器中获取物品。 -block.unloader.description = 物品从容器,仓库或核心卸载到传送带上或直接卸载到相邻的块中。可以通过点击卸载器来更改要卸载的项目类型。 -block.launch-pad.description = 不通过核心发射物体。 -block.launch-pad-large.description = 发射台的改进版。存储更多物体。启动频率更高。 -block.duo.description = 小而便宜的炮塔。对地高效。 -block.scatter.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.hail.description = 小型远程炮台。 block.wave.description = 中型快速炮塔,射出液体泡泡。有液体输入时自动灭火。 @@ -1126,7 +1170,7 @@ block.salvo.description = 双管炮的升级版。中型,齐射射击。 block.fuse.description = 大型炮塔,发射三道刺穿敌人的短程光束。 block.ripple.description = 大型远程炮台,非常强力,向远处的敌人投射一簇弹药。 block.cyclone.description = 大型快速炮塔,对空对地,向周围敌人发射爆炸弹。 -block.spectre.description = 超大型炮塔,对空对地,一次射出两颗强大的穿甲子弹。 +block.spectre.description = 超大型炮塔,对空对地,一次射出两颗强大的穿甲弹药。 block.meltdown.description = 超大型激光炮塔,充能之后持续发射光束,需要冷却剂。 block.command-center.description = 在地图上向盟军发出移动命令。\n使用部队巡逻、攻击敌军核心或撤退到核心/工厂。当没有敌人核心时,部队默认在攻击命令下巡逻。 block.draug-factory.description = 生产德鲁格釆矿机。 @@ -1140,10 +1184,10 @@ 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.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 cfa30554c6..d4d3282375 100644 --- a/core/assets/bundles/bundle_zh_TW.properties +++ b/core/assets/bundles/bundle_zh_TW.properties @@ -8,22 +8,25 @@ link.github.description = 遊戲原始碼 link.changelog.description = 遊戲更新清單 link.dev-builds.description = 開發中版本 link.trello.description = 官方 Trello 功能規劃看板 -link.itch.io.description = itch.io 電腦版下載與網頁版 +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} screenshot.invalid = 地圖太大了,可能沒有足夠的內存用於截圖。 gameover = 遊戲結束 gameover.pvp = [accent]{0}[]隊獲勝! -highscore = [accent]新的高分紀錄! +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,15 +51,16 @@ stat.destroyed = 摧毀的建築:[accent]{0} stat.deconstructed = 拆除的建築:[accent]{0} stat.delivered = 發射的核心資源: stat.rank = 最終排名:[accent]{0} + launcheditems = [accent]已發射的物品 -launchinfo = [unlaunched][發射]的核心以獲得藍字部分的物品。 +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 = 載入遊戲 @@ -68,50 +73,57 @@ position = 位置 close = 關閉 website = 網頁 quit = 退出 -save.quit = 儲存與離開 +save.quit = 儲存並退出 maps = 地圖 maps.browse = 瀏覽地圖 continue = 繼續 -maps.none = [LIGHT_GRAY]找不到地圖! +maps.none = [lightgray]找不到地圖! invalid = 無效 +pickcolor = 選擇顏色 preparingconfig = 配置準備中 preparingcontent = 內容準備中 uploadingcontent = 內容上傳中 uploadingpreviewfile = 上傳預覽文件 committingchanges = 提交變更 done = 完成 -mods.alphainfo = 請記住,mod仍處於Alpha狀態, [scarlet]可能會有很多BUG[].\n向Mindustry Github或Discord報告發現的任何問題。 +feature.unsupported = 您的設備不支持此功能。 +mods.alphainfo = 請記住,模組仍處於Alpha狀態,[scarlet]可能會有很多BUG[].\n向Mindustry GitHub或Discord報告發現的任何問題。 mods.alpha = [accent](Alpha) mods = 模組 -mods.none = [LIGHT_GRAY]沒有找到模組! +mods.none = [lightgray]找不到模組! mods.guide = 模組指南 mods.report = 回報錯誤 -mod.enabled = [lightgray]啟用 -mod.disabled = [scarlet]未啟用 +mods.openfolder = 開啟模組資料夾 +mod.enabled = [lightgray]已啟用 +mod.disabled = [scarlet]已禁用 +mod.enable = 啟用 mod.disable = 禁用 -mod.enable = 可使用 -mod.requiresrestart = 遊戲將立即關閉以應用mod變更。 -mod.reloadrequired = [scarlet]需要重新加載 +mod.delete.error = 無法刪除模組,檔案可能在使用中。 +mod.missingdependencies = [scarlet]缺少依賴項目: {0} +mod.nowdisabled = [scarlet]「{0}'」模組缺少依賴項目:[accent] {1}\n[lightgray]必須先下載這些模組。\n此模組將被自動禁用。 +mod.requiresrestart = 遊戲將立即關閉以套用模組變更。 +mod.reloadrequired = [scarlet]需要重新載入 mod.import = 匯入模組 -mod.import.github = 匯入Github模組 -mod.remove.confirm = 該mod將被刪除。 -mod.author = [LIGHT_GRAY]作者:[] {0} -mod.missing = 此存檔含有您最近更新或不再安裝的mod。可能會發生存檔損毀。您確定要載入嗎?\n[lightgray]模組:\n{0} -mod.preview.missing = 在工作坊發佈這個MOD前,您必須添加預覽圖。\n放置一個名為[accent] preview.png[]進Mod的資料夾並重試。 -mod.folder.missing = 只有文件夾形式的mod可以在工作坊上發布。\n要將任何mod轉換為文件夾,只需將其文件解壓縮到文件夾並刪除舊的zip,然後重新啟動遊戲或重新加載mod。. +mod.import.github = 匯入GitHub模組 +mod.remove.confirm = 該模組將被刪除。 +mod.author = [lightgray]作者:[] {0} +mod.missing = 此存檔含有您最近更新或不再安裝的模組。可能會發生存檔損毀。您確定要載入嗎?\n[lightgray]模組:\n{0} +mod.preview.missing = 在工作坊發佈這個模組前,您必須添加預覽圖。\n在該模組的資料夾中放置一個名為[accent] preview.png[]的圖片並重試。 +mod.folder.missing = 只有資料夾形式的模組可以在工作坊上發布。\n要將模組轉換為資料夾,只需將其文件解壓縮到資料夾並刪除舊的.zip檔,然後重新啟動遊戲或重新載入模組。 + about.button = 關於 name = 名稱: -noname = 先選擇一個[accent]玩家名稱[]。 +noname = 請先選擇一個[accent]玩家名稱[]。 filename = 檔案名稱︰ -unlocked = 新方塊已解鎖! +unlocked = 已解鎖新內容! completed = [accent]完成 techtree = 科技樹 -research.list = [LIGHT_GRAY]研究︰ +research.list = [lightgray]研究︰ research = 研究 -researched = [LIGHT_GRAY]{0}研究完成。 +researched = [lightgray]{0}研究完成。 players = {0}個線上玩家 players.single = {0}個線上玩家 -server.closing = [accent]正在關閉伺服器…… +server.closing = [accent]正在關閉伺服器... server.kicked.kick = 您已被踢出伺服器! server.kicked.whitelist = 您不在這裡的白名單內. server.kicked.serverClose = 伺服器已關閉。 @@ -119,33 +131,33 @@ server.kicked.vote = 您已被投票踢出伺服器,再見。 server.kicked.clientOutdated = 客戶端版本過舊!請更新遊戲! server.kicked.serverOutdated = 伺服器版本過舊!請聯絡伺服主更新伺服器! server.kicked.banned = 您已經從這個伺服器被封禁。 -server.kicked.typeMismatch = 該伺服器與您的構建類型不兼容。 -server.kicked.playerLimit = 該伺服器已滿。等待一個空位置。 -server.kicked.recentKick = 您已經從伺服器被踢除。\n請稍後再進行連線。 +server.kicked.typeMismatch = 該伺服器與您的版本不相容。 +server.kicked.playerLimit = 該伺服器已滿。請等待一個空位置。 +server.kicked.recentKick = 您最近曾被踢出伺服器。\n請稍後再進行連線。 server.kicked.nameInUse = 伺服器中已經\n有人有相同的名稱了。 server.kicked.nameEmpty = 你的名稱必須至少包含一個字母或數字。 -server.kicked.idInUse = 你已經在伺服器中!不允許用兩個賬號。 +server.kicked.idInUse = 你已經在伺服器中!不允許用兩個帳號。 server.kicked.customClient = 這個伺服器不支持自訂客戶端,請下載官方版本。 server.kicked.gameover = 遊戲結束! server.versions = 您的遊戲版本:[accent] {0}[]\n伺服器遊戲版本:[accent] {1}[] -host.info = 目前伺服器監聽於連接埠[scarlet]6567[]。\n所有跟您在同一個[LIGHT_GRAY]網路或區域網路[]環境的玩家應該能在他們的伺服器清單中找到您的伺服器。\n\n如果您希望網際網路上的玩家透過IP 位址連線到您的伺服器,您必須設定[accent]連接埠轉發[]。\n\n[LIGHT_GRAY]注意:如果區域網路內有玩家無法連線至您的伺服器,請務必確認您已於防火牆設定中開放Mindustry存取您的區域網路。 -join.info = 您可以在此輸入欲連線的[accent]伺服器的IP位址[],或尋找[accent]區域網路[]內的伺服器。目前支援區域網路與網際網路連線。\n\n[LIGHT_GRAY]注意:這裡沒有網際網路伺服器清單,如果您想透過IP位址連線到某人的伺服器,您必須向他們詢問IP位址。 +host.info = 目前伺服器監聽於連接埠[scarlet]6567[]。\n所有跟您在同一個[lightgray]網路或區域網路[]環境的玩家應該能在他們的伺服器清單中找到您的伺服器。\n\n如果您希望網際網路上的玩家透過IP 位址連線到您的伺服器,您必須設定[accent]連接埠轉發[]。\n\n[lightgray]注意:如果區域網路內有玩家無法連線至您的伺服器,請務必確認您已於防火牆設定中開放Mindustry存取您的區域網路。請注意公共網路有時不允許搜尋伺服器。 +join.info = 您可以在此輸入欲連線的[accent]伺服器IP位址[],或尋找[accent]區域網路[]內的伺服器。目前支援區域網路與網際網路連線。\n\n[lightgray]注意:並沒有自動的網際網路伺服器清單,如果您想透過IP位址連線到他人的伺服器,您必須向他們詢問IP位址。 hostserver = 建立伺服器 invitefriends = 邀請好友 hostserver.mobile = 建立\n伺服器 -host = 主機 -hosting = [accent]伺服器啟動中…… +host = 伺服器 +hosting = [accent]伺服器啟動中... hosts.refresh = 刷新 hosts.discovering = 搜尋區域網路遊戲 -hosts.discovering.any = 發現的遊戲 -server.refreshing = 刷新伺服器 +hosts.discovering.any = 搜尋遊戲 +server.refreshing = 伺服器刷新中 hosts.none = [lightgray]找不到區域網路伺服器! host.invalid = [scarlet]無法連線至伺服器。 -trace = 跟隨玩家 +trace = 追蹤玩家 trace.playername = 玩家名稱:[accent]{0} trace.ip = IP:[accent]{0} trace.id = ID:[accent]{0} -trace.mobile = 流動客戶端:[accent]{0} +trace.mobile = 行動客戶端:[accent]{0} trace.modclient = 自訂客戶端:[accent]{0} invalidid = 無效的客戶端 ID!請提交錯誤報告。 server.bans = 封禁 @@ -157,8 +169,8 @@ server.delete = 您確定要刪除這個伺服器嗎? server.edit = 編輯伺服器 server.outdated = [crimson]伺服器版本過舊![] server.outdated.client = [crimson]客戶端版本過舊![] -server.version = [lightgray]版本:{0} -server.custombuild = [yellow]自訂組建 +server.version = [gray]v{0} {1} +server.custombuild = [accent]自訂客戶端 confirmban = 您確定要封禁該玩家嗎? confirmkick = 您確定要踢出該玩家嗎? confirmvotekick = 您確定要投票剔除該名玩家嗎? @@ -173,18 +185,18 @@ disconnect.closed = 連線關閉。 disconnect.timeout = 連線超時。 disconnect.data = 無法載入地圖資料! cantconnect = 無法加入遊戲 ([accent]{0}[]). -connecting = [accent]連線中…… -connecting.data = [accent]正在載入地圖資料…… +connecting = [accent]連線中... +connecting.data = [accent]地圖資料載入中... server.port = 連接埠: -server.addressinuse = 該位址已使用中! +server.addressinuse = 該位址已被使用! server.invalidport = 無效的連接埠! -server.error = [crimson]建立伺服器時發生錯誤:[accent]{0} +server.error = [crimson]建立伺服器時發生錯誤。 save.new = 新存檔 save.overwrite = 您確定要覆蓋存檔嗎? overwrite = 覆蓋 save.none = 找不到存檔! -saveload = [accent]存檔中…… -savefail = 無法存檔! +saveload = [accent]存檔中... +savefail = 存檔失敗! save.delete.confirm = 您確定要刪除這個存檔嗎? save.delete = 刪除 save.export = 匯出存檔 @@ -224,25 +236,25 @@ 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 數據 classic.export.text = [accent]Mindustry[]剛剛進行了重大更新。\n檢測到 Classic (v3.5 build 40) 存檔或地圖資料。您是否要將這些存檔匯出到手機的主文件夾中,以便在Mindustry Classic應用中使用? quit.confirm = 您確定要退出嗎? quit.confirm.tutorial = 您確定您知道自己在做什麼嗎?\n該教學可以在[accent] 設定->遊戲[] 選項中重置教學。 -loading = [accent]載入中…… -reloading = [accent]重新載入模組... -saving = [accent]儲存中…… +loading = [accent]載入中... +reloading = [accent]模組重新載入中... +saving = [accent]儲存中... cancelbuilding = [accent][[{0}][]清除計畫 -selectschematic = [accent][[{0}][]選擇+複製 +selectschematic = [accent][[{0}][]選擇並複製 pausebuilding = [accent][[{0}][]暫停建造 resumebuilding = [scarlet][[{0}][]恢復建造 wave = [accent]第{0}波 wave.waiting = [lightgray]將於{0}秒後抵達 -wave.waveInProgress = 第[LIGHT_GRAY]波正在進行中 -waiting = [lightgray]等待中…… -waiting.players = 等待玩家中…… -wave.enemies = [LIGHT_GRAY]剩下{0}敵人 -wave.enemy = [LIGHT_GRAY]剩下{0}敵人 +wave.waveInProgress = 第[lightgray]波正在進行中 +waiting = [lightgray]等待中... +waiting.players = 等待玩家中... +wave.enemies = [lightgray]剩下{0}個敵人 +wave.enemy = [lightgray]剩下{0}個敵人 loadimage = 載入圖像 saveimage = 儲存圖像 unknown = 未知 @@ -265,6 +277,7 @@ missing = 此項目已被刪除或移動。\n[lightgray]工作坊列表現在已 publishing = [accent]發佈中... publish.confirm = 您確定要發布嗎?\n\n[lightgray]首先確定您同意Workshop EULA,否則您的項目將不會顯示! publish.error = 發佈項目時出錯: {0} +steam.error = Steam 服務初始化失敗.\n錯誤: {0} editor.brush = 粉刷 editor.openin = 在編輯器中開啟 editor.oregen = 礦石生成 @@ -289,15 +302,15 @@ waves.perspawn = 每次生成 waves.to = 至 waves.boss = 頭目 waves.preview = 預覽 -waves.edit = 編輯…… +waves.edit = 編輯... waves.copy = 複製到剪貼板 waves.load = 從剪貼板加載 waves.invalid = 剪貼板中的波次無效。 waves.copied = 波次已被複製。 waves.none = 無自定義敵人.\n請注意,空佈局將自動替換為預設佈局。 -editor.default = [LIGHT_GRAY]〈默認〉 -details = 詳情…… -edit = 編輯…… +editor.default = [lightgray]〈默認〉 +details = 詳情... +edit = 編輯... editor.name = 名稱: editor.spawn = 重生單位 editor.removeunit = 移除單位 @@ -320,14 +333,14 @@ editor.saved = 已儲存! editor.save.noname = 您的地圖沒有名稱!在「地圖資訊」畫面設置一個名稱。 editor.save.overwrite = 您的地圖覆寫一個內建的地圖!在「地圖信息」畫面設置一個不同的名稱。 editor.import.exists = [scarlet]匯入失敗:[]一個叫「{0}」的內建地圖已存在! -editor.import = 匯入…… +editor.import = 匯入... editor.importmap = 匯入地圖 editor.importmap.description = 匯入一個已存在的地圖 editor.importfile = 匯入檔案 editor.importfile.description = 匯入一個外部的地圖檔案 editor.importimage = 匯入地形圖像檔 editor.importimage.description = 匯入一個外部的地形圖像檔 -editor.export = 匯出…… +editor.export = 匯出... editor.exportfile = 匯出檔案 editor.exportfile.description = 匯出一個地圖檔案 editor.exportimage = 匯出地形圖像檔 @@ -341,12 +354,13 @@ editor.overwrite = [accent]警告!這將會覆蓋現有的地圖。 editor.overwrite.confirm = [scarlet]警告![]同名地圖存在,確定要覆蓋現有地圖? editor.exists = 具有該名稱的地圖已經存在。 editor.selectmap = 選取要載入的地圖: + toolmode.replace = 取代 toolmode.replace.description = 僅繪製在實體方塊上。 toolmode.replaceall = 全部取代 toolmode.replaceall.description = 取代地圖中的所有方塊。 -toolmode.orthogonal = 正交 -toolmode.orthogonal.description = 僅繪製在正交線上。 +toolmode.orthogonal = 垂直 +toolmode.orthogonal.description = 僅繪製在垂直線上。 toolmode.square = 正方形 toolmode.square.description = 正方形筆刷. toolmode.eraseores = 清除礦物 @@ -355,7 +369,8 @@ toolmode.fillteams = 填充團隊 toolmode.fillteams.description = 填充團隊而不是方塊。 toolmode.drawteams = Draw Teams toolmode.drawteams.description = 繪製團隊而不是方塊。 -filters.empty = [LIGHT_GRAY]沒有過濾器!使用下面的按鈕添加一個。 + +filters.empty = [lightgray]沒有過濾器!使用下面的按鈕添加一個。 filter.distort = 扭曲 filter.noise = 雜訊 filter.median = 平均數 @@ -386,6 +401,7 @@ filter.option.floor2 = 次要地板 filter.option.threshold2 = 次要閾值 filter.option.radius = 半徑 filter.option.percentile = 百分比 + width = 寬度: height = 長度: menu = 主選單 @@ -405,43 +421,45 @@ mapeditor = 地圖編輯器 abandon = 放棄 abandon.text = 此區域及其所有資源將會丟失給敵人。 locked = 鎖定 -complete = [LIGHT_GRAY]完成: +complete = [lightgray]完成: requirement.wave = 在{1}到達第{0}波 requirement.core = 在{0}摧毀敵人核心 requirement.unlock = 解鎖{0} -resume = 繼續區域:\n[LIGHT_GRAY]{0} -bestwave = [LIGHT_GRAY]高分:{0} -launch = 發射 +resume = 繼續區域:\n[lightgray]{0} +bestwave = [lightgray]最高波次:{0} +launch = < 發射 > launch.title = 發射成功 -launch.next = [LIGHT_GRAY]下次的機會於波次{0} +launch.next = [lightgray]下次的機會於波次{0} launch.unable2 = [scarlet]無法發射核心。[] launch.confirm = 這將發射核心中的所有資源。\n你將無法返回這個基地。 launch.skip.confirm = 如果您現在跳過,您將無法發射核心直到下一次的可發射波數。 -uncover = 揭露 +uncover = 探索 configure = 配置裝載 bannedblocks = 禁用方塊 -addall = 加入全部 -configure.locked = [LIGHT_GRAY]到達波次{0}\n以配置裝載。 +addall = 全部加入 +configure.locked = [lightgray]解鎖配置裝載: {0}。 configure.invalid = 數值必須介於 0 到 {0}。 -zone.unlocked = [LIGHT_GRAY]{0}已解鎖。 +zone.unlocked = [lightgray]{0}已解鎖。 zone.requirement.complete = 到達波次{0}:\n滿足{1}區域要求。 zone.config.unlocked = 加載解鎖:[lightgray]\n{0} zone.resources = [lightgray]檢測到的資源: zone.objective = [lightgray]目標: [accent]{0} zone.objective.survival = 生存 zone.objective.attack = 摧毀敵人核心 -add = 新增…… +add = 新增... boss.health = 頭目血量 -connectfail = [crimson]無法連線到伺服器:[accent]{0} -error.unreachable = 無法到達伺服器。 -error.invalidaddress = 無效地址。 -error.timedout = 超時連接!\n確保伺服器設置了連接埠轉發,並且地址正確! -error.mismatch = 封包錯誤:\n客戶端/伺服器版本可能不匹配。\n確保客戶端和伺服器有最新版本的Mindustry! + +connectfail = [crimson]伺服器連線錯誤:[accent]{0} +error.unreachable = 無法到達伺服器。請確認位址是否正確? +error.invalidaddress = 無效的位址。 +error.timedout = 連線超時!\n確保伺服器設置了連接埠轉發,並且位址正確! +error.mismatch = 封包錯誤:\n客戶端/伺服器版本可能不匹配。\n確保客戶端和伺服器都有最新版本的Mindustry! error.alreadyconnected = 已連接。 error.mapnotfound = 找不到地圖! -error.io = 網絡輸入輸出錯誤。 +error.io = 網絡輸出入錯誤。 error.any = 未知網絡錯誤。 error.bloom = 初始化特效失敗.\n您的設備可能不支援它 + zone.groundZero.name = 零號地區 zone.desertWastes.name = 沙漠荒原 zone.craters.name = 隕石坑 @@ -456,20 +474,22 @@ 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.ruinousShores.description = 穿過荒地,就是海岸線。曾經,這個地點駐紮了海防陣線。現在它們已經所剩無幾。只有最基本的防禦結構沒有被破壞,其他的一切都成了殘骸。\n繼續向外擴張。重新發現那些科技。 +zone.craters.description = 這個殞坑中心積蓄著水。這是一場舊戰爭的遺跡。奪回該地區。收集沙子。燒製玻璃。抽水來冷卻砲塔和鑽頭。 +zone.ruinousShores.description = 穿過荒地,就是海岸線。這個地點曾經駐紮了海防陣線。現在它們已經所剩無幾。只有最基本的防禦結構沒有被破壞,其他的一切都成了殘骸。\n繼續向外擴張。重新發現那些科技。 zone.stainedMountains.description = 內陸的更深處是群山,還未被孢子所污染。\n提取在該區域蘊藏豐富的鈦,並學習如何使用它們。\n\n這裡的存在著更為強大的敵人。不要給他們時間派出最強的部隊。 -zone.overgrowth.description = 這個地區更靠近孢子的來源,因此已經生長過度了。\n敵人在這裡建立了哨所。建立泰坦單位。破壞它,並取回失去的東西。 +zone.overgrowth.description = 這個地區更靠近孢子的來源,因此已經生長過度了。\n敵人在這裡建立了哨所。建立泰坦機甲。破壞它,並取回失去的東西。 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 = 重設為預設設定 @@ -478,11 +498,11 @@ settings.controls = 操作 settings.game = 遊戲 settings.sound = 音效 settings.graphics = 圖形 -settings.cleardata = 清除遊戲數據…… +settings.cleardata = 清除遊戲數據... settings.clear.confirm = 您確定要清除數據嗎?\n此操作無法撤回! settings.clearall.confirm = [scarlet]警告![]\n這將清除所有數據,包括存檔、地圖、解鎖和熱鍵綁定。\n按「是」後,遊戲將刪除所有數據並自動退出。 paused = [accent]〈已暫停〉 -clear = Clear +clear = 清除 banned = [scarlet]Banned yes = 是 no = 否 @@ -492,18 +512,19 @@ error.crashtitle = 發生錯誤 blocks.input = 輸入 blocks.output = 輸出 blocks.booster = 加速器 -block.unknown = [LIGHT_GRAY]??? +block.unknown = [lightgray]??? blocks.powercapacity = 蓄電量 blocks.powershot = 能量/射擊 blocks.damage = 傷害 blocks.targetsair = 攻擊空中目標 -blocks.targetsground = 攻擊地面 +blocks.targetsground = 攻擊地面目標 blocks.itemsmoved = 移動速度 -blocks.launchtime = 發射之間的時間 +blocks.launchtime = 發射間隔 blocks.shootrange = 範圍 blocks.size = 尺寸 blocks.liquidcapacity = 液體容量 blocks.powerrange = 輸出範圍 +blocks.powerconnections = 最大連接數 blocks.poweruse = 能量使用 blocks.powerdamage = 能量/傷害 blocks.itemcapacity = 物品容量 @@ -521,10 +542,12 @@ blocks.buildtime = 建設時間 blocks.buildcost = 建造成本 blocks.inaccuracy = 誤差 blocks.shots = 射擊數 -blocks.reload = 重裝彈藥 +blocks.reload = 射擊次數/秒 blocks.ammo = 彈藥 + bar.drilltierreq = 需要更好的鑽頭 bar.drillspeed = 鑽頭速度:{0}/秒 +bar.pumpspeed = 液體泵送速度:{0}/s bar.efficiency = 效率:{0}% bar.powerbalance = 能量變化:{0} bar.powerstored = 能量存量: {0}/{1} @@ -537,6 +560,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]燃燒 @@ -547,7 +573,8 @@ bullet.knockback = [stat]{0}[lightgray]擊退 bullet.freezing = [stat]冷凍 bullet.tarred = [stat]焦油 bullet.multiplier = [stat]{0}[lightgray]×彈藥倍數 -bullet.reload = [stat]{0}[lightgray]×重新裝填 +bullet.reload = [stat]{0}[lightgray]×射擊速率 + unit.blocks = 方塊 unit.powersecond = 能量單位/秒 unit.liquidsecond = 液體單位/秒 @@ -567,22 +594,24 @@ 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.animatedwater.name = 水動畫 setting.animatedshields.name = 護盾動畫 -setting.antialias.name = 消除鋸齒[LIGHT_GRAY](需要重啟遊戲)[] +setting.antialias.name = 消除鋸齒[lightgray](需要重啟遊戲)[] setting.indicators.name = 盟友指示 setting.autotarget.name = 自動射擊 -setting.keyboard.name = 滑鼠+鍵盤控制 +setting.keyboard.name = 滑鼠及鍵盤控制 setting.touchscreen.name = 觸控螢幕控制 setting.fpscap.name = 最大FPS setting.fpscap.none = 没有 setting.fpscap.text = {0}FPS setting.uiscale.name = UI縮放[lightgray] (需要重啟遊戲)[] -setting.swapdiagonal.name = 始終對角線放置 +setting.swapdiagonal.name = 預設對角線放置 setting.difficulty.training = 訓練 setting.difficulty.easy = 簡單 setting.difficulty.normal = 普通 @@ -591,14 +620,16 @@ setting.difficulty.insane = 瘋狂 setting.difficulty.name = 難度: setting.screenshake.name = 畫面抖動 setting.effects.name = 顯示特效 +setting.destroyedblocks.name = 顯示被破壞的方塊 +setting.conveyorpathfinding.name = 自動輸送帶放置規劃 setting.sensitivity.name = 控制器靈敏度 setting.saveinterval.name = 自動存檔間隔 setting.seconds = {0}秒 setting.fullscreen.name = 全螢幕 -setting.borderlesswindow.name = 無邊框窗口[LIGHT_GRAY](可能需要重啟遊戲) +setting.borderlesswindow.name = 無邊框窗口[lightgray](可能需要重啟遊戲) setting.fps.name = 顯示FPS setting.vsync.name = 垂直同步 -setting.pixelate.name = 像素化[LIGHT_GRAY](可能降低性能) +setting.pixelate.name = 像素化[lightgray](可能降低性能) setting.minimap.name = 顯示小地圖 setting.position.name = 顯示玩家位置 setting.musicvol.name = 音樂音量 @@ -616,18 +647,18 @@ public.confirm = 您想公開遊戲嗎?\n[accent]任何人都可以加入您 public.beta = 請注意,該遊戲的Beta版本無法公開遊戲大廳。 uiscale.reset = UI縮放已變更\n按下"確定"確認這個比例\n[scarlet][accent] {0}[] 秒後...退出並還原設定 uiscale.cancel = 取消並退出 -setting.bloom.name = 特效 +setting.bloom.name = 粒子特效 keybind.title = 重新綁定按鍵 keybinds.mobile = [scarlet]此處的大多數快捷鍵在移動設備上均不起作用。僅支援基本移動。 category.general.name = 一般 category.view.name = 查看 category.multiplayer.name = 多人 command.attack = 攻擊 -command.rally = Rally +command.rally = 集結 command.retreat = 撤退 keybind.clear_building.name = 清除建築物 -keybind.press = 按一下按鍵…… -keybind.press.axis = 按一下軸向或按鍵…… +keybind.press = 按一下按鍵... +keybind.press.axis = 按一下軸向或按鍵... keybind.screenshot.name = 地圖截圖 keybind.move_x.name = 水平移動 keybind.move_y.name = 垂直移動 @@ -671,24 +702,26 @@ mode.pvp.description = 和其他玩家競爭、戰鬥。 mode.attack.name = 進攻 mode.attack.description = 沒有波次,目標是摧毀敵人的基地。 mode.custom = 自訂規則 + rules.infiniteresources = 無限資源 +rules.reactorexplosions = 反應爐爆炸 rules.wavetimer = 波次時間 rules.waves = 波次 rules.attack = 攻擊模式 rules.enemyCheat = 電腦無限資源 -rules.unitdrops = 單位掉落 +rules.unitdrops = 單位掉落物 rules.unitbuildspeedmultiplier = 單位建設速度倍數 rules.unithealthmultiplier = 單位耐久度倍數 rules.playerhealthmultiplier = 玩家耐久度倍數 rules.playerdamagemultiplier = 玩家傷害倍數 rules.unitdamagemultiplier = 單位傷害倍數 -rules.enemycorebuildradius = 敵人核心無建設半徑︰[LIGHT_GRAY](格) -rules.respawntime = 重生時間︰[LIGHT_GRAY](秒) -rules.wavespacing = 波次間距︰[LIGHT_GRAY](秒) +rules.enemycorebuildradius = 敵人核心無建設半徑︰[lightgray](格) +rules.respawntime = 重生時間︰[lightgray](秒) +rules.wavespacing = 波次間距︰[lightgray](秒) rules.buildcostmultiplier = 建設成本倍數 rules.buildspeedmultiplier = 建設速度倍數 rules.waitForWaveToEnd = 等待所有敵人毀滅才開始下一波次 -rules.dropzoneradius = 掉落區半徑:[LIGHT_GRAY](格) +rules.dropzoneradius = 空降區半徑:[lightgray](格) rules.respawns = 每波次最多重生次數 rules.limitedRespawns = 限制重生 rules.title.waves = 波次 @@ -697,6 +730,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 = 單位 @@ -722,6 +759,7 @@ liquid.water.name = 水 liquid.slag.name = 熔渣 liquid.oil.name = 原油 liquid.cryofluid.name = 冷凍液 + mech.alpha-mech.name = 阿爾法 mech.alpha-mech.weapon = 重型機關槍 mech.alpha-mech.ability = 自修復 @@ -743,21 +781,21 @@ mech.trident-ship.name = 三叉戟 mech.trident-ship.weapon = 轟炸艙 mech.glaive-ship.name = 偃月刀 mech.glaive-ship.weapon = 火焰機關槍 -item.explosiveness = [LIGHT_GRAY]爆炸性:{0} -item.flammability = [LIGHT_GRAY]易燃性:{0} -item.radioactivity = [LIGHT_GRAY]放射性:{0} -unit.health = [LIGHT_GRAY]耐久度:{0} -unit.speed = [LIGHT_GRAY]速度:{0} -mech.weapon = [LIGHT_GRAY]武器:{0} -mech.health = [LIGHT_GRAY]血量:{0} -mech.itemcapacity = [LIGHT_GRAY]物品容量:{0} -mech.minespeed = [LIGHT_GRAY]採礦速度:{0} -mech.minepower = [LIGHT_GRAY]採礦力度:{0} -mech.ability = [LIGHT_GRAY]能力:{0} -mech.buildspeed = [LIGHT_GRAY]建造速度: {0}% -liquid.heatcapacity = [LIGHT_GRAY]熱容量:{0} -liquid.viscosity = [LIGHT_GRAY]粘性:{0} -liquid.temperature = [LIGHT_GRAY]溫度:{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.ability = [lightgray]能力:{0} +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 = 鹽 @@ -784,7 +822,7 @@ block.thruster.name = 推進器 block.kiln.name = 窯 block.graphite-press.name = 石墨壓縮機 block.multi-press.name = 多重壓縮機 -block.constructing = {0}\n[LIGHT_GRAY](建設中) +block.constructing = {0}\n[lightgray](建設中) block.spawn.name = 敵人生成 block.core-shard.name = 核心:碎片 block.core-foundation.name = 核心:基地 @@ -833,6 +871,8 @@ block.copper-wall.name = 銅牆 block.copper-wall-large.name = 大型銅牆 block.titanium-wall.name = 鈦牆 block.titanium-wall-large.name = 大型鈦牆 +block.plastanium-wall.name = 塑鋼牆 +block.plastanium-wall-large.name = 大型塑鋼牆 block.phase-wall.name = 相織布牆 block.phase-wall-large.name = 大型相織布牆 block.thorium-wall.name = 釷牆 @@ -853,7 +893,9 @@ block.router.name = 分配器 block.distributor.name = 大型分配器 block.sorter.name = 分類器 block.inverted-sorter.name = 反向分類器 -block.message.name = 訊息 +block.message.name = 訊息板 +block.illuminator.name = 照明燈 +block.illuminator.description = 小、緊湊而且可調整的光源。需要能源來運作。 block.overflow-gate.name = 溢流器 block.silicon-smelter.name = 煉矽廠 block.phase-weaver.name = 相織布編織器 @@ -867,6 +909,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 = 燃燒發電機 @@ -919,6 +962,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 = 液體儲存槽 @@ -970,29 +1014,28 @@ unit.eradicator.name = 消除者 unit.lich.name = 巫妖 unit.reaper.name = 收掠者 tutorial.next = [lightgray]<按下以繼續> -tutorial.intro = 您已進入[scarlet] Mindustry 教學。[]\n從[accent] 挖掘銅礦[]開始吧。點擊靠近您核心的銅礦脈。\n\n[accent]{0}/{1} 個銅礦 +tutorial.intro = 您已進入[scarlet] Mindustry 教學。[]\n使用[[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在銅脈上放置一個鑽頭。 -tutorial.drill.mobile = 手動挖掘礦石是低效率的。\n[accent]鑽頭[]能夠自動挖掘礦石。\n點選右下角的鑽頭選項\n選擇[accent]機械鑽頭[].\n通過點擊將其放置在銅礦上,然後按下下方的[accent]確認標誌[]確認您的選擇\n按下[accent] X 按鈕[] 取消放置. +tutorial.drill = 手動挖掘礦石的效率很低。\n[accent]鑽頭[]能夠自動挖掘礦石。\n在銅礦脈上放置一個鑽頭。 +tutorial.drill.mobile = 手動挖掘礦石的效率很低。\n[accent]鑽頭[]能夠自動挖掘礦石。\n點選右下角的鑽頭選項\n選擇[accent]機械鑽頭[].\n通過點擊將其放置在銅礦上,然後按下下方的[accent]確認標誌[]確認您的選擇\n按下[accent] X 按鈕[] 取消放置. tutorial.blockinfo = 每個方塊都有不同的屬性。每個鑽頭只能開採特定的礦石。\n查看方塊的資訊和屬性,[accent]在建造目錄時按下"?"鈕。[]\n\n[accent]立即訪問機械鑽頭的屬性資料。[] tutorial.conveyor = [accent]輸送帶[]能夠將物品運輸到核心。\n製作一條從鑽頭開始到核心的輸送帶。 tutorial.conveyor.mobile = [accent]輸送帶[]能夠將物品運輸到核心。製作一條從鑽頭開始到核心的輸送帶。\n[accent]長按數秒[]並向一個方向拖動來放置直線。\n\n[accent]{0}/{1} 條輸送帶\n[accent]0/1 交付的物品 -tutorial.turret = 防禦建築是必須的以擊退[LIGHT_GRAY]敵人[]。\n於核心附近建造一個雙炮。 +tutorial.turret = 防禦建築是必須的以擊退[lightgray]敵人[]。\n於核心附近建造一個雙炮。 tutorial.drillturret = 雙炮需要[accent]銅彈[]以射擊。\n在雙炮旁邊放置一個鑽頭以供應銅。 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.withdraw = 在某些情況下,直接從方塊中取出物品是必要的。\n去做這個, [accent]點擊有物品的方塊[],然後[accent]點擊在方框中的物品[]。\n可以通過[accent]點擊或常按[]來取出物品。\n\n[accent]從核心中取出一些銅。[] -tutorial.deposit = 通過將物品從船上拖到目標方塊,將物品放入放塊中。\n\n[accent]將您的銅放到核心中。[] -tutorial.waves = [LIGHT_GRAY]敵人[]來臨。\n\n防衛核心2波。建造更多的砲塔以防衛。 -tutorial.waves.mobile = [lightgray]敵人[]接近。\n\n保護核心抵抗兩波攻擊。您的飛船將自動向敵人開火。\n建造更多的砲塔和鑽頭。開採更多的銅。 +tutorial.breaking = 方塊經常需要被拆除。\n[accent]按住右鍵[]破壞選擇區域中的所有方塊。[]\n\n[accent]使用區域選擇拆除核心左側的所有廢料方塊。 +tutorial.breaking.mobile = 方塊經常需要被拆除。\n[accent]選擇拆除模式[],然後點擊一個方塊以破壞它。\n按住螢幕幾秒鐘並向一個方向拖動以破壞一個範圍內的方塊[]。\n按下確認標記按鈕以確認拆除。\n\n[accent]使用區域選擇拆除核心左側的所有廢料方塊。 +tutorial.withdraw = 在某些情況下,直接從方塊中取出物品是必要的。\n[accent]點擊有物品的方塊[],然後[accent]點擊在方框中的物品[]以將其取出。\n可以通過[accent]點擊或長按[]來取出物品。\n\n[accent]從核心中取出一些銅。[] +tutorial.deposit = 通過將物品從船上拖到目標方塊,將物品放入方塊中。\n\n[accent]將您的銅放到核心中。[] +tutorial.waves = [lightgray]敵人[]來臨。\n\n保護核心抵抗兩波攻擊。\n建造更多的砲塔和鑽頭。開採更多的銅。 tutorial.launch = 一旦您達到特定的波數, 您就可以[accent] 發射核心[],放棄防禦並[accent]獲取核心中的所有資源。[]\n這些資源可以用於研究新科技。\n\n[accent]按下發射按鈕。 -item.copper.description = 一種有用的結構材料。在各種類型的方塊中廣泛使用。 -item.lead.description = 一種基本的起始材料。被廣泛用於電子設備和運輸液體方塊。 -item.metaglass.description = 一種高強度的玻璃。廣泛用於液體分配和存儲。 +item.copper.description = 最基本的結構材料。在各種類型的方塊中廣泛使用。 +item.lead.description = 一種基本的起始材料。被廣泛用於電子設備和液體運輸方塊。 +item.metaglass.description = 一種超高強度的玻璃。廣泛用於液體分配和存儲。 item.graphite.description = 礦化的碳,用於彈藥和電氣絕緣。 item.sand.description = 一種常見的材料,廣泛用於冶煉,包括製作合金和助熔劑。 item.coal.description = 遠在「播種」事件前就形成的植物化石。一種常見並容易獲得的燃料。 @@ -1054,7 +1097,9 @@ block.liquid-source.description = 無限輸出液體。僅限沙盒。 block.copper-wall.description = 一種便宜的防禦方塊。\n用於前幾波防衛核心和砲塔。 block.copper-wall-large.description = 一種便宜的防禦方塊。\n用於前幾波防禦核心和砲塔\n佔據多個方塊。 block.titanium-wall.description = 一個中等強度的防禦方塊。\n提供對敵人的適度保護。 -block.titanium-wall-large.description = 一個中等強度的防禦方塊。\n提供對敵人的適度保護。\n跨越多個區塊。 +block.titanium-wall-large.description = 一個中等強度的防禦方塊。\n提供對敵人的適度保護。\n佔據多個方塊。 +block.plastanium-wall.description = 一種特殊類型的牆,它能吸收電弧並阻止自動電源節點連接。 +block.plastanium-wall-large.description = 一種特殊類型的牆,它能吸收電弧並阻止自動電源節點連接。\n佔據多個方塊。 block.thorium-wall.description = 一種堅強的防禦方塊。\n良好地防衛敵人。 block.thorium-wall-large.description = 一種堅強的防衛方塊。\n良好地防衛敵人。\n佔據多個方塊。 block.phase-wall.description = 沒有釷牆那麼堅固但特殊的相位化合物塗層會使大多的子彈偏離。 @@ -1077,13 +1122,14 @@ block.sorter.description = 對物品進行分類。如果物品與所選種類 block.inverted-sorter.description = 處理物品的方式類似於分類器,但將所選擇的物品輸出到側面。 block.router.description = 接受來自一個方向的物品並將它們平均輸出到最多3個其他方向。用於將物品從一個來源分割為多個目標。 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 = 接受來自一個方向的液體並將它們平均輸出到最多3個其他方向。可以儲存一定量的液體。用於將液體從一個來源分成多個目標。 block.liquid-tank.description = 存儲大量液體。當液體需求非恆定時,使用它來創建緩衝或作為冷卻重要方塊的保障。 block.liquid-junction.description = 作為兩個交叉管線的橋樑。適用於兩條不同管線將不同液體運送到不同位置的情況。 @@ -1092,6 +1138,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 = 透過燃燒原油或可燃物品以產生能量。 @@ -1113,8 +1160,8 @@ block.oil-extractor.description = 使用大量的能量、水以及沙子鑽取 block.core-shard.description = 初代的核心膠囊。一旦被摧毀,與該地區的所有聯繫都將失去。不要讓這種情況發生。 block.core-foundation.description = 第二代核心。有更好的裝甲。可以存儲更多資源。 block.core-nucleus.description = 第三代核心,也是最後一代。裝甲非常好。可以存儲大量資源。 -block.vault.description = 存儲大量的每一種物品。當物品需求非恆定時,使用它來創建緩衝。使用[LIGHT_GRAY]裝卸器[]以從存儲庫提取物品。 -block.container.description = 存儲少量的每一種物品。當物品需求非恆定時,使用它來創建緩衝。使用[LIGHT_GRAY]裝卸器[]以從容器提取物品。 +block.vault.description = 存儲大量的每一種物品。當物品需求非恆定時,使用它來創建緩衝。使用[lightgray]裝卸器[]以從存儲庫提取物品。 +block.container.description = 存儲少量的每一種物品。當物品需求非恆定時,使用它來創建緩衝。使用[lightgray]裝卸器[]以從容器提取物品。 block.unloader.description = 將物品從容器、存儲庫或核心卸載到傳輸帶上或直接卸載到相鄰的方塊中。透過點擊卸載器來更改要卸載的物品類型。 block.launch-pad.description = 無需發射核心即可直接發射物品。 block.launch-pad-large.description = 發射台的進階版。可存儲更多物品。更快的發射速度。 @@ -1145,9 +1192,10 @@ 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.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/shaders/light.fragment.glsl b/core/assets/shaders/light.fragment.glsl new file mode 100644 index 0000000000..c1a831668a --- /dev/null +++ b/core/assets/shaders/light.fragment.glsl @@ -0,0 +1,18 @@ +#ifdef GL_ES +precision mediump float; +precision mediump int; +#endif + +#define steprad 0.13 + +uniform sampler2D u_texture; +uniform vec4 u_ambient; + +varying vec4 v_color; +varying vec2 v_texCoord; + +void main(){ + vec4 color = texture2D(u_texture, v_texCoord.xy); + //color.a = clamp(color.a, 0.0, 0.8); + gl_FragColor = clamp(vec4(mix(u_ambient.rgb, color.rgb, color.a), u_ambient.a - color.a), 0.0, 1.0); +} diff --git a/core/assets/sprites/block_colors.png b/core/assets/sprites/block_colors.png index 721d33ae19..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 41f4b5b25f..52c06255fe 100644 --- a/core/assets/sprites/sprites.atlas +++ b/core/assets/sprites/sprites.atlas @@ -6,504 +6,504 @@ filter: Nearest,Nearest repeat: none force-projector-top rotate: false - xy: 553, 735 + xy: 619, 340 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 mend-projector-top rotate: false - xy: 1267, 1299 + xy: 1077, 662 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 mender-top rotate: false - xy: 1301, 187 + xy: 1788, 959 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 overdrive-projector-top rotate: false - xy: 1399, 1299 + xy: 1077, 596 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 shock-mine rotate: false - xy: 1471, 765 + xy: 1641, 857 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 bridge-arrow rotate: false - xy: 1301, 731 + xy: 1886, 1061 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 bridge-conveyor-bridge rotate: false - xy: 1233, 629 + xy: 1920, 1061 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 bridge-conveyor-end rotate: false - xy: 1267, 663 + xy: 1954, 1095 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 center rotate: false - xy: 1301, 697 + xy: 1988, 1129 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 armored-conveyor-0-0 rotate: false - xy: 2009, 1069 + xy: 1278, 971 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-armored-conveyor-full rotate: false - xy: 2009, 1069 + xy: 1278, 971 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 armored-conveyor-0-1 rotate: false - xy: 1029, 835 + xy: 890, 851 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 armored-conveyor-0-2 rotate: false - xy: 1029, 801 + xy: 1278, 937 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 armored-conveyor-0-3 rotate: false - xy: 1029, 767 + xy: 389, 15 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 armored-conveyor-1-0 rotate: false - xy: 1029, 733 + xy: 423, 10 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 armored-conveyor-1-1 rotate: false - xy: 1029, 699 + xy: 457, 10 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 armored-conveyor-1-2 rotate: false - xy: 1029, 665 + xy: 491, 10 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 armored-conveyor-1-3 rotate: false - xy: 1029, 631 + xy: 525, 10 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 armored-conveyor-2-0 rotate: false - xy: 1029, 597 + xy: 559, 10 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 armored-conveyor-2-1 rotate: false - xy: 1029, 563 + xy: 593, 10 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 armored-conveyor-2-2 rotate: false - xy: 1029, 529 + xy: 627, 12 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 armored-conveyor-2-3 rotate: false - xy: 1029, 495 + xy: 661, 12 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 armored-conveyor-3-0 rotate: false - xy: 1029, 461 + xy: 1236, 887 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 armored-conveyor-3-1 rotate: false - xy: 1029, 427 + xy: 1312, 971 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 armored-conveyor-3-2 rotate: false - xy: 1029, 393 + xy: 1312, 937 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 armored-conveyor-3-3 rotate: false - xy: 1029, 359 + xy: 911, 11 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 armored-conveyor-4-0 rotate: false - xy: 1029, 325 + xy: 945, 11 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 armored-conveyor-4-1 rotate: false - xy: 1029, 291 + xy: 1278, 903 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 armored-conveyor-4-2 rotate: false - xy: 1029, 257 + xy: 1312, 903 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 armored-conveyor-4-3 rotate: false - xy: 1029, 223 + xy: 1209, 827 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conveyor-0-1 rotate: false - xy: 1199, 493 + xy: 1920, 1027 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conveyor-0-2 rotate: false - xy: 1233, 527 + xy: 1954, 1027 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conveyor-0-3 rotate: false - xy: 1267, 561 + xy: 1988, 1027 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conveyor-1-0 rotate: false - xy: 1301, 595 + xy: 1368, 1035 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conveyor-1-1 rotate: false - xy: 1335, 629 + xy: 1402, 1027 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conveyor-1-2 rotate: false - xy: 1165, 425 + xy: 1436, 1019 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conveyor-1-3 rotate: false - xy: 1199, 459 + xy: 1470, 1019 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conveyor-2-0 rotate: false - xy: 1233, 493 + xy: 1504, 1019 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conveyor-2-1 rotate: false - xy: 1267, 527 + xy: 1301, 835 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conveyor-2-2 rotate: false - xy: 1301, 561 + xy: 1335, 835 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conveyor-2-3 rotate: false - xy: 1335, 595 + xy: 1369, 843 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conveyor-3-0 rotate: false - xy: 1165, 391 + xy: 1369, 809 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conveyor-3-1 rotate: false - xy: 1199, 425 + xy: 1538, 993 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conveyor-3-2 rotate: false - xy: 1233, 459 + xy: 1572, 993 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conveyor-3-3 rotate: false - xy: 1267, 493 + xy: 1606, 993 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conveyor-4-0 rotate: false - xy: 1301, 527 + xy: 1640, 993 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conveyor-4-1 rotate: false - xy: 1335, 561 + xy: 1674, 993 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conveyor-4-2 rotate: false - xy: 1165, 357 + xy: 1708, 993 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conveyor-4-3 rotate: false - xy: 1199, 391 + xy: 1742, 993 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-conveyor-0-1 rotate: false - xy: 1369, 629 + xy: 1641, 823 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-conveyor-0-2 rotate: false - xy: 1403, 663 + xy: 1675, 857 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-conveyor-0-3 rotate: false - xy: 1437, 697 + xy: 1641, 789 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-conveyor-1-0 rotate: false - xy: 1471, 731 + xy: 1675, 823 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-conveyor-1-1 rotate: false - xy: 1505, 765 + xy: 1709, 857 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-conveyor-1-2 rotate: false - xy: 1369, 595 + xy: 1675, 789 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-conveyor-1-3 rotate: false - xy: 1403, 629 + xy: 1709, 823 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-conveyor-2-0 rotate: false - xy: 1437, 663 + xy: 1743, 857 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-conveyor-2-1 rotate: false - xy: 1471, 697 + xy: 1709, 789 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-conveyor-2-2 rotate: false - xy: 1505, 731 + xy: 1743, 823 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-conveyor-2-3 rotate: false - xy: 1369, 561 + xy: 1777, 857 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-conveyor-3-0 rotate: false - xy: 1403, 595 + xy: 1743, 789 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-conveyor-3-1 rotate: false - xy: 1437, 629 + xy: 1777, 823 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-conveyor-3-2 rotate: false - xy: 1471, 663 + xy: 1811, 857 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-conveyor-3-3 rotate: false - xy: 1505, 697 + xy: 1777, 789 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-conveyor-4-0 rotate: false - xy: 1369, 527 + xy: 1811, 823 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-conveyor-4-1 rotate: false - xy: 1403, 561 + xy: 1845, 857 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-conveyor-4-2 rotate: false - xy: 1437, 595 + xy: 1811, 789 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-conveyor-4-3 rotate: false - xy: 1471, 629 + xy: 1845, 823 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 mass-driver-base rotate: false - xy: 717, 261 + xy: 1939, 1431 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 phase-conveyor-arrow rotate: false - xy: 1301, 153 + xy: 1788, 891 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 phase-conveyor-bridge rotate: false - xy: 1335, 187 + xy: 1822, 925 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 phase-conveyor-end rotate: false - xy: 1267, 85 + xy: 1856, 959 size: 32, 32 orig: 32, 32 offset: 0, 0 @@ -538,217 +538,217 @@ blast-drill-top index: -1 drill-top rotate: false - xy: 913, 391 + xy: 1026, 1124 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 turbine-generator-liquid rotate: false - xy: 913, 391 + xy: 1026, 1124 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 laser-drill rotate: false - xy: 619, 343 + xy: 717, 632 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 laser-drill-rim rotate: false - xy: 619, 245 + xy: 717, 534 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 laser-drill-rotator rotate: false - xy: 619, 147 + xy: 717, 436 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 laser-drill-top rotate: false - xy: 619, 49 + xy: 717, 338 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 mechanical-drill rotate: false - xy: 1069, 1299 + xy: 1011, 662 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 mechanical-drill-rotator rotate: false - xy: 1135, 1299 + xy: 1077, 728 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 mechanical-drill-top rotate: false - xy: 1201, 1299 + xy: 1011, 596 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 oil-extractor rotate: false - xy: 717, 163 + xy: 758, 849 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 oil-extractor-liquid rotate: false - xy: 717, 65 + xy: 749, 751 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 oil-extractor-rotator rotate: false - xy: 749, 751 + xy: 815, 653 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 oil-extractor-top rotate: false - xy: 815, 653 + xy: 815, 555 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 pneumatic-drill rotate: false - xy: 1795, 1299 + xy: 1053, 266 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 pneumatic-drill-rotator rotate: false - xy: 1861, 1299 + xy: 1119, 398 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 pneumatic-drill-top rotate: false - xy: 1927, 1299 + xy: 1119, 332 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 water-extractor rotate: false - xy: 1845, 1167 + xy: 1135, 1365 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 water-extractor-liquid rotate: false - xy: 1911, 1167 + xy: 1201, 1431 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 water-extractor-rotator rotate: false - xy: 956, 1101 + xy: 1201, 1365 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 water-extractor-top rotate: false - xy: 956, 1035 + xy: 1135, 1299 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 block-border rotate: false - xy: 1029, 87 + xy: 1209, 691 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-middle rotate: false - xy: 1131, 762 + xy: 1546, 1095 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-select rotate: false - xy: 1233, 799 + xy: 1784, 1129 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conduit-liquid rotate: false - xy: 1335, 697 + xy: 1648, 1027 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 place-arrow rotate: false - xy: 815, 555 + xy: 815, 457 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 rubble-1-0 rotate: false - xy: 1003, 1233 + xy: 1111, 200 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 rubble-1-1 rotate: false - xy: 1069, 1233 + xy: 1111, 134 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 rubble-2-0 rotate: false - xy: 1135, 1233 + xy: 1111, 68 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 rubble-2-1 rotate: false - xy: 1201, 1233 + xy: 1003, 1388 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 rubble-3-0 rotate: false - xy: 815, 261 + xy: 815, 163 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 rubble-3-1 rotate: false - xy: 815, 261 + xy: 815, 163 size: 96, 96 orig: 96, 96 offset: 0, 0 @@ -825,259 +825,329 @@ rubble-8-1 index: -1 bridge-conduit-arrow rotate: false - xy: 1335, 765 + xy: 1920, 1095 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 bridge-conveyor-arrow rotate: false - xy: 1335, 765 + xy: 1920, 1095 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 bridge-conduit-bridge rotate: false - xy: 1165, 561 + xy: 1954, 1129 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 bridge-conduit-end rotate: false - xy: 1199, 595 + xy: 1988, 1163 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conduit-bottom rotate: false - xy: 1165, 527 + xy: 1988, 1095 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conduit-bottom-0 rotate: false - xy: 1199, 561 + xy: 1988, 1061 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conduit-bottom-1 rotate: false - xy: 1233, 595 + xy: 1546, 1027 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conduit-bottom-2 rotate: false - xy: 1267, 629 + xy: 1580, 1027 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conduit-bottom-3 rotate: false - xy: 1267, 629 + xy: 1580, 1027 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conduit-bottom-4 rotate: false - xy: 1267, 629 + xy: 1580, 1027 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conduit-bottom-6 rotate: false - xy: 1267, 629 + xy: 1580, 1027 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conduit-bottom-5 rotate: false - xy: 1301, 663 + xy: 1614, 1027 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conduit-top-0 rotate: false - xy: 1165, 493 + xy: 1682, 1027 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conduit-top-1 rotate: false - xy: 1199, 527 + xy: 1716, 1027 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conduit-top-2 rotate: false - xy: 1233, 561 + xy: 1750, 1027 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conduit-top-3 rotate: false - xy: 1267, 595 + xy: 1784, 1027 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 pulse-conduit-top-3 rotate: false - xy: 1267, 595 + xy: 1784, 1027 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conduit-top-4 rotate: false - xy: 1301, 629 + xy: 1818, 1027 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conduit-top-5 rotate: false - xy: 1335, 663 + xy: 1852, 1027 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conduit-top-6 rotate: false - xy: 1165, 459 + xy: 1886, 1027 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +liquid-overflow-gate + rotate: false + xy: 1686, 959 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +liquid-overflow-gate-top + rotate: false + xy: 1652, 891 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 liquid-router-bottom rotate: false - xy: 1233, 153 + xy: 1686, 925 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 liquid-router-liquid rotate: false - xy: 1267, 187 + xy: 1720, 959 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 liquid-router-top rotate: false - xy: 1301, 221 + xy: 1686, 891 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 liquid-tank-bottom rotate: false - xy: 717, 653 + xy: 717, 240 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 liquid-tank-liquid rotate: false - xy: 717, 555 + xy: 717, 142 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 liquid-tank-top rotate: false - xy: 717, 457 + xy: 717, 44 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 phase-conduit-arrow rotate: false - xy: 1335, 221 + xy: 1754, 891 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 phase-conduit-bridge rotate: false - xy: 1233, 85 + xy: 1788, 925 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 phase-conduit-end rotate: false - xy: 1267, 119 + xy: 1822, 959 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +plated-conduit-cap + rotate: false + xy: 1822, 891 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +plated-conduit-top-0 + rotate: false + xy: 1856, 925 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +plated-conduit-top-1 + rotate: false + xy: 1890, 959 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +plated-conduit-top-2 + rotate: false + xy: 1856, 891 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +plated-conduit-top-3 + rotate: false + xy: 1890, 925 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +plated-conduit-top-4 + rotate: false + xy: 1924, 959 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +plated-conduit-top-5 + rotate: false + xy: 1890, 891 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +plated-conduit-top-6 + rotate: false + xy: 1924, 925 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 pulse-conduit-top-0 rotate: false - xy: 1335, 153 + xy: 1924, 891 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 pulse-conduit-top-1 rotate: false - xy: 1301, 85 + xy: 1958, 925 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 pulse-conduit-top-2 rotate: false - xy: 1335, 119 + xy: 1992, 959 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 pulse-conduit-top-4 rotate: false - xy: 1335, 85 + xy: 1958, 891 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 pulse-conduit-top-5 rotate: false - xy: 1369, 799 + xy: 1992, 925 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 pulse-conduit-top-6 rotate: false - xy: 1369, 765 + xy: 1992, 891 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 battery rotate: false - xy: 1029, 189 + xy: 1209, 793 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-battery-full rotate: false - xy: 1029, 189 + xy: 1209, 793 size: 32, 32 orig: 32, 32 offset: 0, 0 @@ -1098,25 +1168,39 @@ block-battery-large-full index: -1 combustion-generator-top rotate: false - xy: 1335, 731 + xy: 1954, 1061 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 differential-generator-liquid rotate: false - xy: 521, 343 + xy: 660, 849 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 differential-generator-top rotate: false - xy: 521, 245 + xy: 619, 632 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 +diode-arrow + rotate: false + xy: 1301, 801 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +illuminator-top + rotate: false + xy: 1380, 925 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 impact-reactor rotate: false xy: 1586, 1757 @@ -1168,35 +1252,35 @@ impact-reactor-plasma-3 index: -1 power-source rotate: false - xy: 1301, 119 + xy: 1958, 959 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 rtg-generator-top rotate: false - xy: 1403, 731 + xy: 1573, 857 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 thorium-reactor-center rotate: false - xy: 549, 1583 + xy: 913, 653 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 thorium-reactor-lights rotate: false - xy: 647, 1583 + xy: 913, 555 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 turbine-generator-top rotate: false - xy: 1581, 1167 + xy: 1069, 1431 size: 64, 64 orig: 64, 64 offset: 0, 0 @@ -1224,196 +1308,196 @@ alloy-smelter-top index: -1 blast-mixer rotate: false - xy: 1976, 1821 + xy: 549, 1513 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 block-blast-mixer-full rotate: false - xy: 1976, 1821 + xy: 549, 1513 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 cryofluidmixer-bottom rotate: false - xy: 890, 985 + xy: 945, 1454 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 cryofluidmixer-liquid rotate: false - xy: 890, 919 + xy: 937, 1388 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 cryofluidmixer-top rotate: false - xy: 890, 853 + xy: 937, 1322 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 cultivator rotate: false - xy: 913, 787 + xy: 937, 1256 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 cultivator-middle rotate: false - xy: 913, 721 + xy: 921, 1190 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 cultivator-top rotate: false - xy: 913, 655 + xy: 987, 1190 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 kiln-top rotate: false - xy: 937, 1322 + xy: 1011, 794 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 silicon-smelter-top rotate: false - xy: 937, 1322 + xy: 1011, 794 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 phase-weaver rotate: false - xy: 1531, 1299 + xy: 1077, 530 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 phase-weaver-bottom rotate: false - xy: 1597, 1299 + xy: 1077, 464 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 phase-weaver-weave rotate: false - xy: 1663, 1299 + xy: 1053, 398 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 plastanium-compressor-top rotate: false - xy: 1729, 1299 + xy: 1053, 332 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 pulverizer rotate: false - xy: 1403, 799 + xy: 1505, 849 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 pulverizer-rotator rotate: false - xy: 1369, 731 + xy: 1505, 815 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 pump-liquid rotate: false - xy: 1403, 765 + xy: 1505, 781 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 separator-liquid rotate: false - xy: 1861, 1233 + xy: 1143, 728 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 spore-press rotate: false - xy: 987, 1167 + xy: 1143, 596 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 spore-press-frame0 rotate: false - xy: 1053, 1167 + xy: 1143, 530 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 spore-press-frame1 rotate: false - xy: 1119, 1167 + xy: 1143, 464 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 spore-press-frame2 rotate: false - xy: 1185, 1167 + xy: 1185, 398 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 spore-press-liquid rotate: false - xy: 1251, 1167 + xy: 1185, 332 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 spore-press-top rotate: false - xy: 1317, 1167 + xy: 1185, 266 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 unloader-center rotate: false - xy: 1369, 493 + xy: 1845, 789 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 arc-heat rotate: false - xy: 2009, 1103 + xy: 856, 851 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-1 rotate: false - xy: 1029, 155 + xy: 1209, 759 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-2 rotate: false - xy: 1976, 1755 + xy: 913, 243 size: 64, 64 orig: 64, 64 offset: 0, 0 @@ -1434,14 +1518,14 @@ block-4 index: -1 hail-heat rotate: false - xy: 1206, 867 + xy: 1069, 1257 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 lancer-heat rotate: false - xy: 1003, 1299 + xy: 1011, 728 size: 64, 64 orig: 64, 64 offset: 0, 0 @@ -1455,161 +1539,161 @@ meltdown-heat index: -1 ripple-heat rotate: false - xy: 815, 359 + xy: 815, 261 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 salvo-heat rotate: false - xy: 1333, 1233 + xy: 1003, 1256 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 salvo-panel-left rotate: false - xy: 1399, 1233 + xy: 1053, 1190 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 salvo-panel-right rotate: false - xy: 1465, 1233 + xy: 1092, 1124 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 scorch-heat rotate: false - xy: 1471, 799 + xy: 1573, 823 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 wave-liquid rotate: false - xy: 956, 969 + xy: 1267, 1365 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 crawler-factory rotate: false - xy: 890, 1117 + xy: 871, 1281 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 dagger-factory rotate: false - xy: 890, 1117 + xy: 871, 1281 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 draug-factory rotate: false - xy: 890, 1117 + xy: 871, 1281 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 phantom-factory rotate: false - xy: 890, 1117 + xy: 871, 1281 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 spirit-factory rotate: false - xy: 890, 1117 + xy: 871, 1281 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 wraith-factory rotate: false - xy: 890, 1117 + xy: 871, 1281 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 crawler-factory-top rotate: false - xy: 890, 1051 + xy: 945, 1520 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 dagger-factory-top rotate: false - xy: 913, 589 + xy: 960, 1124 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 draug-factory-top rotate: false - xy: 913, 457 + xy: 960, 992 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 fortress-factory rotate: false - xy: 651, 751 + xy: 619, 242 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 fortress-factory-top rotate: false - xy: 619, 637 + xy: 619, 144 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 ghoul-factory-top rotate: false - xy: 619, 637 + xy: 619, 144 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 titan-factory-top rotate: false - xy: 619, 637 + xy: 619, 144 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 ghoul-factory rotate: false - xy: 619, 441 + xy: 651, 730 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 phantom-factory-top rotate: false - xy: 1465, 1299 + xy: 1011, 464 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 rally-point rotate: false - xy: 921, 1183 + xy: 1119, 266 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 repair-point-base rotate: false - xy: 1369, 697 + xy: 1539, 823 size: 32, 32 orig: 32, 32 offset: 0, 0 @@ -1630,133 +1714,133 @@ revenant-factory-top index: -1 spirit-factory-top rotate: false - xy: 1927, 1233 + xy: 1143, 662 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 titan-factory rotate: false - xy: 745, 1579 + xy: 913, 457 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 wraith-factory-top rotate: false - xy: 1022, 1035 + xy: 1201, 1299 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 door-large-open rotate: false - xy: 913, 523 + xy: 960, 1058 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 door-open rotate: false - xy: 1301, 459 + xy: 1335, 801 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 insulator-wall rotate: false - xy: 1199, 323 + xy: 1380, 891 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 insulator-wall-large rotate: false - xy: 871, 1249 + xy: 945, 794 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 scrap-wall-huge2 rotate: false - xy: 815, 163 + xy: 815, 65 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 scrap-wall-huge3 rotate: false - xy: 815, 65 + xy: 847, 751 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 scrap-wall-large1 rotate: false - xy: 1597, 1233 + xy: 1092, 992 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 scrap-wall-large2 rotate: false - xy: 1663, 1233 + xy: 1120, 926 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 scrap-wall-large3 rotate: false - xy: 1729, 1233 + xy: 1120, 860 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 scrap-wall-large4 rotate: false - xy: 1795, 1233 + xy: 1143, 794 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 scrap-wall2 rotate: false - xy: 1369, 663 + xy: 1607, 857 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 scrap-wall3 rotate: false - xy: 1403, 697 + xy: 1573, 789 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 scrap-wall4 rotate: false - xy: 1437, 731 + xy: 1607, 823 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 scrap-wall5 rotate: false - xy: 1437, 731 + xy: 1607, 823 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 bullet rotate: false - xy: 1501, 1113 + xy: 1095, 7 size: 52, 52 orig: 52, 52 offset: 0, 0 index: -1 bullet-back rotate: false - xy: 1555, 1113 + xy: 1149, 14 size: 52, 52 orig: 52, 52 offset: 0, 0 @@ -1768,6 +1852,20 @@ casing orig: 8, 16 offset: 0, 0 index: -1 +circle-end + rotate: false + xy: 464, 926 + size: 100, 199 + orig: 100, 199 + offset: 0, 0 + index: -1 +circle-mid + rotate: false + xy: 2022, 1030 + size: 1, 199 + orig: 1, 199 + offset: 0, 0 + index: -1 circle-shadow rotate: false xy: 863, 1846 @@ -1777,154 +1875,154 @@ circle-shadow index: -1 error rotate: false - xy: 1959, 1117 + xy: 1991, 1331 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 laser rotate: false - xy: 2043, 1087 + xy: 1053, 1536 size: 4, 48 orig: 4, 48 offset: 0, 0 index: -1 laser-end rotate: false - xy: 549, 1509 + xy: 913, 383 size: 72, 72 orig: 72, 72 offset: 0, 0 index: -1 minelaser rotate: false - xy: 2043, 1037 + xy: 1053, 1486 size: 4, 48 orig: 4, 48 offset: 0, 0 index: -1 minelaser-end rotate: false - xy: 623, 1509 + xy: 549, 1579 size: 72, 72 orig: 72, 72 offset: 0, 0 index: -1 missile rotate: false - xy: 1146, 964 + xy: 863, 1808 size: 36, 36 orig: 36, 36 offset: 0, 0 index: -1 missile-back rotate: false - xy: 863, 1808 + xy: 921, 1152 size: 36, 36 orig: 36, 36 offset: 0, 0 index: -1 scale_marker rotate: false - xy: 607, 1371 + xy: 723, 1143 size: 4, 4 orig: 4, 4 offset: 0, 0 index: -1 scorch1 rotate: false - xy: 1369, 391 + xy: 1243, 673 size: 28, 100 orig: 28, 100 offset: 0, 0 index: -1 scorch2 rotate: false - xy: 1369, 289 + xy: 1243, 571 size: 28, 100 orig: 28, 100 offset: 0, 0 index: -1 scorch3 rotate: false - xy: 1369, 187 + xy: 1243, 469 size: 28, 100 orig: 28, 100 offset: 0, 0 index: -1 scorch4 rotate: false - xy: 1369, 85 + xy: 1251, 367 size: 28, 100 orig: 28, 100 offset: 0, 0 index: -1 scorch5 rotate: false - xy: 1496, 1007 + xy: 1273, 673 size: 28, 100 orig: 28, 100 offset: 0, 0 index: -1 shell rotate: false - xy: 993, 15 + xy: 873, 27 size: 36, 36 orig: 36, 36 offset: 0, 0 index: -1 shell-back rotate: false - xy: 2009, 1137 + xy: 1186, 861 size: 36, 36 orig: 36, 36 offset: 0, 0 index: -1 shot rotate: false - xy: 1505, 799 + xy: 1607, 789 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 transfer rotate: false - xy: 195, 894 + xy: 979, 259 size: 4, 48 orig: 4, 48 offset: 0, 0 index: -1 transfer-arrow rotate: false - xy: 1505, 663 + xy: 1879, 857 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 transfer-end rotate: false - xy: 607, 1435 + xy: 913, 309 size: 72, 72 orig: 72, 72 offset: 0, 0 index: -1 white rotate: false - xy: 1164, 959 + xy: 1209, 464 size: 3, 3 orig: 3, 3 offset: 0, 0 index: -1 arc rotate: false - xy: 723, 1145 + xy: 389, 49 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-arc-full rotate: false - xy: 1029, 121 + xy: 1209, 725 size: 32, 32 orig: 32, 32 offset: 0, 0 @@ -1938,147 +2036,147 @@ block-blast-drill-full index: -1 block-bridge-conduit-full rotate: false - xy: 1029, 53 + xy: 1209, 657 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 bridge-conduit rotate: false - xy: 1029, 53 + xy: 1209, 657 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-bridge-conveyor-full rotate: false - xy: 1063, 830 + xy: 1209, 623 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 bridge-conveyor rotate: false - xy: 1063, 830 + xy: 1209, 623 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-char-full rotate: false - xy: 1097, 830 + xy: 1209, 589 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-cliffs-full rotate: false - xy: 1063, 796 + xy: 1209, 555 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-coal-centrifuge-full rotate: false - xy: 1969, 1689 + xy: 913, 177 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 coal-centrifuge rotate: false - xy: 1969, 1689 + xy: 913, 177 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 block-combustion-generator-full rotate: false - xy: 1063, 762 + xy: 1209, 521 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 combustion-generator rotate: false - xy: 1063, 762 + xy: 1209, 521 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-command-center-full rotate: false - xy: 843, 1537 + xy: 913, 111 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 command-center rotate: false - xy: 843, 1537 + xy: 913, 111 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 block-conduit-full rotate: false - xy: 1097, 796 + xy: 1209, 487 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-container-full rotate: false - xy: 909, 1520 + xy: 1976, 1821 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 container rotate: false - xy: 909, 1520 + xy: 1976, 1821 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 block-conveyor-full rotate: false - xy: 1063, 728 + xy: 695, 10 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conveyor-0-0 rotate: false - xy: 1063, 728 + xy: 695, 10 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-copper-wall-full rotate: false - xy: 1097, 762 + xy: 729, 10 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 copper-wall rotate: false - xy: 1097, 762 + xy: 729, 10 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-copper-wall-large-full rotate: false - xy: 975, 1520 + xy: 1976, 1755 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 copper-wall-large rotate: false - xy: 975, 1520 + xy: 1976, 1755 size: 64, 64 orig: 64, 64 offset: 0, 0 @@ -2127,28 +2225,28 @@ core-shard index: -1 block-craters-full rotate: false - xy: 1063, 694 + xy: 763, 10 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-crawler-factory-full rotate: false - xy: 697, 1513 + xy: 1969, 1689 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 block-cryofluidmixer-full rotate: false - xy: 763, 1513 + xy: 913, 45 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 block-cultivator-full rotate: false - xy: 681, 1443 + xy: 623, 1615 size: 64, 64 orig: 64, 64 offset: 0, 0 @@ -2162,112 +2260,112 @@ block-cyclone-full index: -1 block-dagger-factory-full rotate: false - xy: 747, 1447 + xy: 689, 1615 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 block-dark-metal-full rotate: false - xy: 1097, 728 + xy: 1334, 1013 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-dark-panel-1-full rotate: false - xy: 1063, 660 + xy: 1346, 979 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-dark-panel-2-full rotate: false - xy: 1097, 694 + xy: 1346, 945 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-dark-panel-3-full rotate: false - xy: 1063, 626 + xy: 1346, 911 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-dark-panel-4-full rotate: false - xy: 1097, 660 + xy: 1270, 869 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-dark-panel-5-full rotate: false - xy: 1063, 592 + xy: 1304, 869 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-dark-panel-6-full rotate: false - xy: 1097, 626 + xy: 1346, 877 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-darksand-full rotate: false - xy: 1063, 558 + xy: 1342, 1181 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-darksand-tainted-water-full rotate: false - xy: 1097, 592 + xy: 1342, 1147 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-darksand-water-full rotate: false - xy: 1063, 524 + xy: 1342, 1113 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-dart-mech-pad-full rotate: false - xy: 813, 1447 + xy: 623, 1549 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 dart-mech-pad rotate: false - xy: 813, 1447 + xy: 623, 1549 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 block-deepwater-full rotate: false - xy: 1097, 558 + xy: 1342, 1079 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-delta-mech-pad-full rotate: false - xy: 879, 1454 + xy: 689, 1549 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 delta-mech-pad rotate: false - xy: 879, 1454 + xy: 689, 1549 size: 64, 64 orig: 64, 64 offset: 0, 0 @@ -2286,184 +2384,212 @@ differential-generator orig: 96, 96 offset: 0, 0 index: -1 +block-diode-full + rotate: false + xy: 1376, 1205 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +diode + rotate: false + xy: 1376, 1205 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 block-distributor-full rotate: false - xy: 945, 1454 + xy: 615, 1483 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 distributor rotate: false - xy: 945, 1454 + xy: 615, 1483 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 block-door-full rotate: false - xy: 1063, 490 + xy: 1376, 1171 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 door rotate: false - xy: 1063, 490 + xy: 1376, 1171 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-door-large-full rotate: false - xy: 681, 1377 + xy: 681, 1483 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 door-large rotate: false - xy: 681, 1377 + xy: 681, 1483 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 block-draug-factory-full rotate: false - xy: 747, 1381 + xy: 607, 1417 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 block-dunerocks-full rotate: false - xy: 1097, 524 + xy: 1376, 1137 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-duo-full rotate: false - xy: 1063, 456 + xy: 1376, 1103 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-force-projector-full rotate: false - xy: 464, 1029 + xy: 464, 828 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 force-projector rotate: false - xy: 464, 1029 + xy: 464, 828 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 block-fortress-factory-full rotate: false - xy: 464, 931 + xy: 455, 730 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 block-fuse-full rotate: false - xy: 464, 833 + xy: 423, 632 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 block-ghoul-factory-full rotate: false - xy: 455, 735 + xy: 423, 534 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 block-glaive-ship-pad-full rotate: false - xy: 625, 1143 + xy: 423, 436 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 glaive-ship-pad rotate: false - xy: 625, 1143 + xy: 423, 436 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 block-graphite-press-full rotate: false - xy: 813, 1381 + xy: 673, 1417 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 graphite-press rotate: false - xy: 813, 1381 + xy: 673, 1417 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 block-grass-full rotate: false - xy: 1097, 490 + xy: 1410, 1197 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-hail-full rotate: false - xy: 1063, 422 + xy: 1410, 1163 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-holostone-full rotate: false - xy: 1097, 456 + xy: 1410, 1129 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-hotrock-full rotate: false - xy: 1063, 388 + xy: 1410, 1095 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-ice-full rotate: false - xy: 1097, 422 + xy: 1376, 1069 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-ice-snow-full rotate: false - xy: 1063, 354 + xy: 1410, 1061 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-icerocks-full rotate: false - xy: 1097, 388 + xy: 1444, 1189 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-ignarock-full rotate: false - xy: 1063, 320 + xy: 1444, 1155 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-illuminator-full + rotate: false + xy: 1478, 1189 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +illuminator + rotate: false + xy: 1478, 1189 size: 32, 32 orig: 32, 32 offset: 0, 0 @@ -2477,126 +2603,126 @@ block-impact-reactor-full index: -1 block-incinerator-full rotate: false - xy: 1097, 354 + xy: 1444, 1121 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 incinerator rotate: false - xy: 1097, 354 + xy: 1444, 1121 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-inverted-sorter-full rotate: false - xy: 1063, 286 + xy: 1478, 1155 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 inverted-sorter rotate: false - xy: 1063, 286 + xy: 1478, 1155 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-item-source-full rotate: false - xy: 1097, 320 + xy: 1444, 1087 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-source rotate: false - xy: 1097, 320 + xy: 1444, 1087 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-item-void-full rotate: false - xy: 1063, 252 + xy: 1478, 1121 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-void rotate: false - xy: 1063, 252 + xy: 1478, 1121 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-javelin-ship-pad-full rotate: false - xy: 879, 1388 + xy: 987, 391 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 javelin-ship-pad rotate: false - xy: 879, 1388 + xy: 987, 391 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 block-junction-full rotate: false - xy: 1097, 286 + xy: 1478, 1087 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 junction rotate: false - xy: 1097, 286 + xy: 1478, 1087 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-kiln-full rotate: false - xy: 945, 1388 + xy: 987, 325 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 kiln rotate: false - xy: 945, 1388 + xy: 987, 325 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 block-lancer-full rotate: false - xy: 673, 1311 + xy: 755, 1611 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 block-laser-drill-full rotate: false - xy: 562, 1045 + xy: 423, 338 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 block-launch-pad-full rotate: false - xy: 562, 947 + xy: 423, 240 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 launch-pad rotate: false - xy: 562, 947 + xy: 423, 240 size: 96, 96 orig: 96, 96 offset: 0, 0 @@ -2617,77 +2743,77 @@ launch-pad-large index: -1 block-liquid-junction-full rotate: false - xy: 1063, 218 + xy: 1444, 1053 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 liquid-junction rotate: false - xy: 1063, 218 + xy: 1444, 1053 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-liquid-router-full rotate: false - xy: 1097, 252 + xy: 1478, 1053 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-liquid-source-full rotate: false - xy: 1063, 184 + xy: 1512, 1189 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 liquid-source rotate: false - xy: 1063, 184 + xy: 1512, 1189 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-liquid-tank-full rotate: false - xy: 562, 849 + xy: 423, 142 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 block-magmarock-full rotate: false - xy: 1097, 218 + xy: 1512, 1155 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-mass-driver-full rotate: false - xy: 660, 1045 + xy: 423, 44 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 block-mechanical-drill-full rotate: false - xy: 673, 1245 + xy: 821, 1611 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 block-mechanical-pump-full rotate: false - xy: 1063, 150 + xy: 1512, 1121 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 mechanical-pump rotate: false - xy: 1063, 150 + xy: 1512, 1121 size: 32, 32 orig: 32, 32 offset: 0, 0 @@ -2701,630 +2827,637 @@ block-meltdown-full index: -1 block-melter-full rotate: false - xy: 1097, 184 + xy: 1512, 1087 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 melter rotate: false - xy: 1097, 184 + xy: 1512, 1087 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-mend-projector-full rotate: false - xy: 1011, 1431 + xy: 755, 1545 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 mend-projector rotate: false - xy: 1011, 1431 + xy: 755, 1545 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 block-mender-full rotate: false - xy: 1063, 116 + xy: 1512, 1053 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 mender rotate: false - xy: 1063, 116 + xy: 1512, 1053 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-message-full rotate: false - xy: 1097, 150 + xy: 1546, 1197 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 message rotate: false - xy: 1097, 150 + xy: 1546, 1197 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-metal-floor-2-full rotate: false - xy: 1063, 82 + xy: 1546, 1163 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-metal-floor-3-full rotate: false - xy: 1097, 116 + xy: 1580, 1197 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-metal-floor-5-full rotate: false - xy: 1097, 82 + xy: 1546, 1129 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-metal-floor-damaged-full rotate: false - xy: 1131, 830 + xy: 1580, 1163 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-metal-floor-full rotate: false - xy: 1131, 796 + xy: 1614, 1197 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-moss-full rotate: false - xy: 1131, 728 + xy: 1580, 1129 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-multi-press-full rotate: false - xy: 660, 947 + xy: 625, 1143 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 multi-press rotate: false - xy: 660, 947 + xy: 625, 1143 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 block-oil-extractor-full rotate: false - xy: 660, 849 + xy: 566, 1045 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 block-omega-mech-pad-full rotate: false - xy: 423, 635 + xy: 566, 947 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 omega-mech-pad rotate: false - xy: 423, 635 + xy: 566, 947 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 block-ore-coal-full rotate: false - xy: 1131, 694 + xy: 1614, 1163 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-ore-coal-medium rotate: false - xy: 1131, 694 + xy: 1614, 1163 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-ore-coal-large rotate: false - xy: 1407, 1455 + xy: 887, 1635 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-ore-coal-small rotate: false - xy: 259, 1379 + xy: 873, 1 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-ore-coal-tiny rotate: false - xy: 1041, 1568 + xy: 797, 26 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-ore-coal-xlarge rotate: false - xy: 1809, 1117 + xy: 1448, 1381 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-ore-copper-full rotate: false - xy: 1131, 660 + xy: 1648, 1197 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-ore-copper-medium rotate: false - xy: 1131, 660 + xy: 1648, 1197 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-ore-copper-large rotate: false - xy: 549, 1685 + xy: 887, 1593 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-ore-copper-small rotate: false - xy: 847, 757 + xy: 1342, 1053 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-ore-copper-tiny rotate: false - xy: 1041, 1550 + xy: 797, 8 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-ore-copper-xlarge rotate: false - xy: 1859, 1117 + xy: 1498, 1381 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-ore-lead-full rotate: false - xy: 1131, 626 + xy: 1546, 1061 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-ore-lead-medium rotate: false - xy: 1131, 626 + xy: 1546, 1061 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-ore-lead-large rotate: false - xy: 571, 9 + xy: 887, 1551 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-ore-lead-small rotate: false - xy: 1993, 1239 + xy: 1224, 861 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-ore-lead-tiny rotate: false - xy: 1041, 1532 + xy: 204, 1129 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-ore-lead-xlarge rotate: false - xy: 1909, 1117 + xy: 1548, 1381 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-ore-scrap-full rotate: false - xy: 1131, 592 + xy: 1580, 1095 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-ore-scrap-medium rotate: false - xy: 1131, 592 + xy: 1580, 1095 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-ore-scrap-large rotate: false - xy: 867, 23 + xy: 607, 1375 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-ore-scrap-small rotate: false - xy: 901, 1820 + xy: 259, 1379 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-ore-scrap-tiny rotate: false - xy: 1041, 1514 + xy: 566, 929 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-ore-scrap-xlarge rotate: false - xy: 979, 803 + xy: 1598, 1381 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-ore-thorium-full rotate: false - xy: 1131, 558 + xy: 1614, 1129 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-ore-thorium-medium rotate: false - xy: 1131, 558 + xy: 1614, 1129 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-ore-thorium-large rotate: false - xy: 1164, 867 + xy: 673, 1243 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-ore-thorium-small rotate: false - xy: 1063, 56 + xy: 960, 966 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-ore-thorium-tiny rotate: false - xy: 1031, 1 + xy: 660, 831 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-ore-thorium-xlarge rotate: false - xy: 979, 753 + xy: 1648, 1381 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-ore-titanium-full rotate: false - xy: 1131, 524 + xy: 1648, 1163 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-ore-titanium-medium rotate: false - xy: 1131, 524 + xy: 1648, 1163 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-ore-titanium-large rotate: false - xy: 1364, 917 + xy: 945, 752 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-ore-titanium-small rotate: false - xy: 1403, 535 + xy: 901, 1820 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-ore-titanium-tiny rotate: false - xy: 1049, 1 + xy: 749, 733 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-ore-titanium-xlarge rotate: false - xy: 979, 703 + xy: 1698, 1381 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-overdrive-projector-full rotate: false - xy: 1077, 1431 + xy: 821, 1545 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 overdrive-projector rotate: false - xy: 1077, 1431 + xy: 821, 1545 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 block-overflow-gate-full rotate: false - xy: 1131, 490 + xy: 1682, 1197 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 overflow-gate rotate: false - xy: 1131, 490 + xy: 1682, 1197 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-pebbles-full rotate: false - xy: 1131, 456 + xy: 1580, 1061 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-phantom-factory-full rotate: false - xy: 1143, 1431 + xy: 747, 1479 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 block-phase-conduit-full rotate: false - xy: 1131, 422 + xy: 1614, 1095 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 phase-conduit rotate: false - xy: 1131, 422 + xy: 1614, 1095 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-phase-conveyor-full rotate: false - xy: 1131, 388 + xy: 1648, 1129 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 phase-conveyor rotate: false - xy: 1131, 388 + xy: 1648, 1129 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-phase-wall-full rotate: false - xy: 1131, 354 + xy: 1682, 1163 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 phase-wall rotate: false - xy: 1131, 354 + xy: 1682, 1163 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-phase-wall-large-full rotate: false - xy: 1209, 1431 + xy: 813, 1479 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 phase-wall-large rotate: false - xy: 1209, 1431 + xy: 813, 1479 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 block-phase-weaver-full rotate: false - xy: 1275, 1431 + xy: 739, 1413 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 block-pine-full rotate: false - xy: 979, 653 + xy: 1748, 1381 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-plastanium-compressor-full rotate: false - xy: 1341, 1431 + xy: 805, 1413 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 plastanium-compressor rotate: false - xy: 1341, 1431 + xy: 805, 1413 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 block-plastanium-wall-full rotate: false - xy: 1131, 320 + xy: 1716, 1197 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 plastanium-wall rotate: false - xy: 1131, 320 + xy: 1716, 1197 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-plastanium-wall-large-full rotate: false - xy: 1011, 1365 + xy: 673, 1351 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 plastanium-wall-large rotate: false - xy: 1011, 1365 + xy: 673, 1351 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 +block-plated-conduit-full + rotate: false + xy: 1614, 1061 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 block-pneumatic-drill-full rotate: false - xy: 1077, 1365 + xy: 673, 1285 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 block-power-node-full rotate: false - xy: 1131, 286 + xy: 1648, 1095 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 power-node rotate: false - xy: 1131, 286 + xy: 1648, 1095 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-power-node-large-full rotate: false - xy: 1143, 1365 + xy: 739, 1347 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 power-node-large rotate: false - xy: 1143, 1365 + xy: 739, 1347 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 block-power-source-full rotate: false - xy: 1131, 252 + xy: 1682, 1129 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-power-void-full rotate: false - xy: 1131, 218 + xy: 1716, 1163 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 power-void rotate: false - xy: 1131, 218 + xy: 1716, 1163 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-pulse-conduit-full rotate: false - xy: 1131, 184 + xy: 1750, 1197 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-pulverizer-full rotate: false - xy: 1131, 150 + xy: 1648, 1061 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-pyratite-mixer-full rotate: false - xy: 1209, 1365 + xy: 805, 1347 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 pyratite-mixer rotate: false - xy: 1209, 1365 + xy: 805, 1347 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 block-repair-point-full rotate: false - xy: 1131, 116 + xy: 1682, 1095 size: 32, 32 orig: 32, 32 offset: 0, 0 @@ -3338,140 +3471,140 @@ block-revenant-factory-full index: -1 block-ripple-full rotate: false - xy: 423, 537 + xy: 664, 1045 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 block-rock-full rotate: false - xy: 979, 603 + xy: 1798, 1381 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-rocks-full rotate: false - xy: 1131, 82 + xy: 1716, 1129 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-rotary-pump-full rotate: false - xy: 1275, 1365 + xy: 739, 1281 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 rotary-pump rotate: false - xy: 1275, 1365 + xy: 739, 1281 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 block-router-full rotate: false - xy: 1031, 19 + xy: 1750, 1163 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 router rotate: false - xy: 1031, 19 + xy: 1750, 1163 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-rtg-generator-full rotate: false - xy: 1341, 1365 + xy: 805, 1281 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 rtg-generator rotate: false - xy: 1341, 1365 + xy: 805, 1281 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 block-salt-full rotate: false - xy: 1165, 833 + xy: 1784, 1197 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-saltrocks-full rotate: false - xy: 1165, 799 + xy: 1682, 1061 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-salvo-full rotate: false - xy: 1407, 1365 + xy: 987, 259 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 block-sand-boulder-full rotate: false - xy: 1199, 833 + xy: 1716, 1095 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-sand-full rotate: false - xy: 1165, 765 + xy: 1750, 1129 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-sand-water-full rotate: false - xy: 1199, 799 + xy: 1784, 1163 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-sandrocks-full rotate: false - xy: 1233, 833 + xy: 1818, 1197 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-scatter-full rotate: false - xy: 1473, 1365 + xy: 979, 193 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 block-scorch-full rotate: false - xy: 1165, 731 + xy: 1716, 1061 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-scrap-wall-full rotate: false - xy: 1199, 765 + xy: 1750, 1095 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 scrap-wall1 rotate: false - xy: 1199, 765 + xy: 1750, 1095 size: 32, 32 orig: 32, 32 offset: 0, 0 @@ -3492,161 +3625,161 @@ scrap-wall-gigantic index: -1 block-scrap-wall-huge-full rotate: false - xy: 423, 439 + xy: 664, 947 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 scrap-wall-huge1 rotate: false - xy: 423, 439 + xy: 664, 947 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 block-scrap-wall-large-full rotate: false - xy: 1539, 1365 + xy: 979, 127 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 block-separator-full rotate: false - xy: 1605, 1365 + xy: 979, 61 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 separator rotate: false - xy: 1605, 1365 + xy: 979, 61 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 block-shale-boulder-full rotate: false - xy: 1267, 833 + xy: 1818, 1163 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-shale-full rotate: false - xy: 1165, 697 + xy: 1852, 1197 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-shalerocks-full rotate: false - xy: 1199, 731 + xy: 1750, 1061 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-shock-mine-full rotate: false - xy: 1233, 765 + xy: 1784, 1095 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-shrubs-full rotate: false - xy: 1267, 799 + xy: 1818, 1129 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-silicon-smelter-full rotate: false - xy: 1671, 1365 + xy: 723, 1215 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 silicon-smelter rotate: false - xy: 1671, 1365 + xy: 723, 1215 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 block-snow-full rotate: false - xy: 1301, 833 + xy: 1852, 1163 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-snow-pine-full rotate: false - xy: 979, 553 + xy: 1848, 1381 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-snowrock-full rotate: false - xy: 979, 503 + xy: 1898, 1381 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-snowrocks-full rotate: false - xy: 1165, 663 + xy: 1886, 1197 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-solar-panel-full rotate: false - xy: 1199, 697 + xy: 1784, 1061 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 solar-panel rotate: false - xy: 1199, 697 + xy: 1784, 1061 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-solar-panel-large-full rotate: false - xy: 423, 341 + xy: 1449, 1431 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 solar-panel-large rotate: false - xy: 423, 341 + xy: 1449, 1431 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 block-sorter-full rotate: false - xy: 1233, 731 + xy: 1818, 1095 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 sorter rotate: false - xy: 1233, 731 + xy: 1818, 1095 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-spawn-full rotate: false - xy: 1267, 765 + xy: 1852, 1129 size: 32, 32 orig: 32, 32 offset: 0, 0 @@ -3660,203 +3793,203 @@ block-spectre-full index: -1 block-spirit-factory-full rotate: false - xy: 1737, 1365 + xy: 723, 1149 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 block-spore-cluster-full rotate: false - xy: 591, 1685 + xy: 1011, 1544 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-spore-moss-full rotate: false - xy: 1301, 799 + xy: 1886, 1163 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-spore-pine-full rotate: false - xy: 979, 453 + xy: 1948, 1381 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-spore-press-full rotate: false - xy: 1803, 1365 + xy: 789, 1215 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 block-sporerocks-full rotate: false - xy: 1335, 833 + xy: 1920, 1197 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-stone-full rotate: false - xy: 1165, 629 + xy: 1818, 1061 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-surge-tower-full rotate: false - xy: 1869, 1365 + xy: 789, 1149 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 surge-tower rotate: false - xy: 1869, 1365 + xy: 789, 1149 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 block-surge-wall-full rotate: false - xy: 1199, 663 + xy: 1852, 1095 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 surge-wall rotate: false - xy: 1199, 663 + xy: 1852, 1095 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-surge-wall-large-full rotate: false - xy: 1935, 1365 + xy: 762, 1083 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 surge-wall-large rotate: false - xy: 1935, 1365 + xy: 762, 1083 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 block-swarmer-full rotate: false - xy: 723, 1179 + xy: 762, 1017 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 block-tainted-water-full rotate: false - xy: 1233, 697 + xy: 1886, 1129 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-tar-full rotate: false - xy: 1267, 731 + xy: 1920, 1163 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-tau-mech-pad-full rotate: false - xy: 739, 1311 + xy: 762, 951 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 tau-mech-pad rotate: false - xy: 739, 1311 + xy: 762, 951 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 block-tendrils-full rotate: false - xy: 1301, 765 + xy: 1954, 1197 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-thermal-generator-full rotate: false - xy: 739, 1245 + xy: 828, 1083 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 thermal-generator rotate: false - xy: 739, 1245 + xy: 828, 1083 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 block-thermal-pump-full rotate: false - xy: 423, 243 + xy: 1547, 1431 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 thermal-pump rotate: false - xy: 423, 243 + xy: 1547, 1431 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 block-thorium-reactor-full rotate: false - xy: 423, 145 + xy: 1645, 1431 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 thorium-reactor rotate: false - xy: 423, 145 + xy: 1645, 1431 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 block-thorium-wall-full rotate: false - xy: 1335, 799 + xy: 1852, 1061 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 thorium-wall rotate: false - xy: 1335, 799 + xy: 1852, 1061 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-thorium-wall-large-full rotate: false - xy: 805, 1315 + xy: 828, 1017 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 thorium-wall-large rotate: false - xy: 805, 1315 + xy: 828, 1017 size: 64, 64 orig: 64, 64 offset: 0, 0 @@ -3877,126 +4010,126 @@ thruster index: -1 block-titan-factory-full rotate: false - xy: 423, 47 + xy: 1743, 1431 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 block-titanium-conveyor-full rotate: false - xy: 1165, 595 + xy: 1886, 1095 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-conveyor-0-0 rotate: false - xy: 1165, 595 + xy: 1886, 1095 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-titanium-wall-full rotate: false - xy: 1199, 629 + xy: 1920, 1129 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-wall rotate: false - xy: 1199, 629 + xy: 1920, 1129 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-titanium-wall-large-full rotate: false - xy: 805, 1249 + xy: 828, 951 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 titanium-wall-large rotate: false - xy: 805, 1249 + xy: 828, 951 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 block-trident-ship-pad-full rotate: false - xy: 789, 1179 + xy: 856, 885 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 trident-ship-pad rotate: false - xy: 789, 1179 + xy: 856, 885 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 block-turbine-generator-full rotate: false - xy: 758, 1113 + xy: 855, 1215 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 turbine-generator rotate: false - xy: 758, 1113 + xy: 855, 1215 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 block-unloader-full rotate: false - xy: 1233, 663 + xy: 1954, 1163 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 unloader rotate: false - xy: 1233, 663 + xy: 1954, 1163 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-vault-full rotate: false - xy: 1449, 1431 + xy: 1841, 1431 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 vault rotate: false - xy: 1449, 1431 + xy: 1841, 1431 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 block-water-extractor-full rotate: false - xy: 758, 1047 + xy: 855, 1149 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 block-water-full rotate: false - xy: 1267, 697 + xy: 1988, 1197 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-wave-full rotate: false - xy: 758, 981 + xy: 894, 1083 size: 64, 64 orig: 64, 64 offset: 0, 0 @@ -4017,175 +4150,175 @@ block-white-tree-full index: -1 block-wraith-factory-full rotate: false - xy: 758, 915 + xy: 894, 1017 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 cracks-1-0 rotate: false - xy: 1233, 425 + xy: 1776, 993 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 cracks-1-1 rotate: false - xy: 1267, 459 + xy: 1810, 993 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 cracks-1-2 rotate: false - xy: 1301, 493 + xy: 1844, 993 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 cracks-1-3 rotate: false - xy: 1335, 527 + xy: 1878, 993 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 cracks-1-4 rotate: false - xy: 1165, 323 + xy: 1912, 993 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 cracks-1-5 rotate: false - xy: 1199, 357 + xy: 1946, 993 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 cracks-1-6 rotate: false - xy: 1233, 391 + xy: 1980, 993 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 cracks-1-7 rotate: false - xy: 1267, 425 + xy: 2014, 993 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 cracks-2-0 rotate: false - xy: 758, 849 + xy: 894, 951 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 cracks-2-1 rotate: false - xy: 824, 1113 + xy: 922, 885 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 cracks-2-2 rotate: false - xy: 824, 1047 + xy: 1045, 193 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 cracks-2-3 rotate: false - xy: 824, 981 + xy: 1045, 127 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 cracks-2-4 rotate: false - xy: 824, 915 + xy: 1045, 61 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 cracks-2-5 rotate: false - xy: 824, 849 + xy: 879, 1479 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 cracks-2-6 rotate: false - xy: 847, 783 + xy: 871, 1413 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 cracks-2-7 rotate: false - xy: 855, 1183 + xy: 871, 1347 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 cracks-3-0 rotate: false - xy: 1547, 1431 + xy: 521, 632 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 cracks-3-1 rotate: false - xy: 1645, 1431 + xy: 521, 534 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 cracks-3-2 rotate: false - xy: 1743, 1431 + xy: 521, 436 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 cracks-3-3 rotate: false - xy: 1841, 1431 + xy: 521, 338 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 cracks-3-4 rotate: false - xy: 1939, 1529 + xy: 521, 240 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 cracks-3-5 rotate: false - xy: 1939, 1431 + xy: 521, 142 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 cracks-3-6 rotate: false - xy: 521, 637 + xy: 521, 44 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 cracks-3-7 rotate: false - xy: 521, 539 + xy: 553, 730 size: 96, 96 orig: 96, 96 offset: 0, 0 @@ -4304,763 +4437,763 @@ cracks-5-7 index: -1 cyclone rotate: false - xy: 521, 441 + xy: 562, 828 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 duo rotate: false - xy: 1335, 493 + xy: 1369, 775 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 fuse rotate: false - xy: 619, 539 + xy: 619, 46 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 hail rotate: false - xy: 1165, 289 + xy: 1380, 959 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-blast-compound-large rotate: false - xy: 1406, 917 + xy: 1219, 1257 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 item-blast-compound-medium rotate: false - xy: 1267, 391 + xy: 1414, 985 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-blast-compound-small rotate: false - xy: 1437, 569 + xy: 1879, 831 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 item-blast-compound-tiny rotate: false - xy: 204, 1129 + xy: 623, 1709 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 item-blast-compound-xlarge rotate: false - xy: 1759, 1067 + xy: 1575, 1281 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 item-coal-large rotate: false - xy: 1248, 867 + xy: 1219, 1215 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 item-coal-medium rotate: false - xy: 1335, 459 + xy: 1448, 985 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-coal-small rotate: false - xy: 1471, 603 + xy: 1913, 865 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 item-coal-tiny rotate: false - xy: 1407, 1437 + xy: 649, 1399 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 item-coal-xlarge rotate: false - xy: 1809, 1067 + xy: 1625, 1281 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 item-copper-large rotate: false - xy: 1448, 917 + xy: 1208, 1007 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 item-copper-medium rotate: false - xy: 1199, 289 + xy: 1448, 951 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-copper-small rotate: false - xy: 1505, 637 + xy: 1243, 775 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 item-copper-tiny rotate: false - xy: 2001, 1371 + xy: 987, 776 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 item-copper-xlarge rotate: false - xy: 1859, 1067 + xy: 1675, 1281 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 item-graphite-large rotate: false - xy: 1290, 867 + xy: 1011, 1502 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 item-graphite-medium rotate: false - xy: 1267, 357 + xy: 1448, 917 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-graphite-small rotate: false - xy: 1496, 981 + xy: 1251, 341 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 item-graphite-tiny rotate: false - xy: 697, 31 + xy: 924, 867 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 item-graphite-xlarge rotate: false - xy: 1909, 1067 + xy: 1725, 1281 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 item-lead-large rotate: false - xy: 99, 2 + xy: 1011, 1460 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 item-lead-medium rotate: false - xy: 1335, 425 + xy: 1482, 917 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-lead-small rotate: false - xy: 285, 1379 + xy: 1273, 647 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 item-lead-tiny rotate: false - xy: 1496, 963 + xy: 924, 849 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 item-lead-xlarge rotate: false - xy: 1959, 1067 + xy: 1775, 1281 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 item-metaglass-large rotate: false - xy: 2001, 1389 + xy: 99, 2 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 item-metaglass-medium rotate: false - xy: 1199, 255 + xy: 1448, 883 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-metaglass-small rotate: false - xy: 873, 757 + xy: 285, 1379 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 item-metaglass-tiny rotate: false - xy: 1297, 67 + xy: 1345, 1239 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 item-metaglass-xlarge rotate: false - xy: 1014, 919 + xy: 1825, 1281 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 item-phase-fabric-large rotate: false - xy: 613, 7 + xy: 1261, 1215 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 item-phase-fabric-medium rotate: false - xy: 1267, 323 + xy: 1403, 849 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-phase-fabric-small rotate: false - xy: 1089, 56 + xy: 1879, 805 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 item-phase-fabric-tiny rotate: false - xy: 1011, 1502 + xy: 1345, 1221 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 item-phase-fabric-xlarge rotate: false - xy: 1014, 869 + xy: 1875, 1281 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 item-plastanium-large rotate: false - xy: 655, 7 + xy: 1303, 1215 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 item-plastanium-medium rotate: false - xy: 1335, 391 + xy: 1437, 849 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-plastanium-small rotate: false - xy: 1403, 509 + xy: 1939, 865 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 item-plastanium-tiny rotate: false - xy: 222, 1129 + xy: 1516, 1001 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 item-plastanium-xlarge rotate: false - xy: 1064, 914 + xy: 1925, 1281 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 item-pyratite-large rotate: false - xy: 909, 19 + xy: 1258, 1173 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 item-pyratite-medium rotate: false - xy: 1199, 221 + xy: 1437, 815 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-pyratite-small rotate: false - xy: 1115, 56 + xy: 1269, 775 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 item-pyratite-tiny rotate: false - xy: 1425, 1437 + xy: 2026, 975 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 item-pyratite-xlarge rotate: false - xy: 1064, 864 + xy: 1975, 1281 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 item-sand-large rotate: false - xy: 1332, 867 + xy: 1258, 1131 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 item-sand-medium rotate: false - xy: 1267, 289 + xy: 1437, 781 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-sand-small rotate: false - xy: 2019, 1239 + xy: 1295, 775 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 item-sand-tiny rotate: false - xy: 2019, 1371 + xy: 1209, 469 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 item-sand-xlarge rotate: false - xy: 1114, 914 + xy: 1267, 1257 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 item-scrap-large rotate: false - xy: 1374, 875 + xy: 1300, 1173 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 item-scrap-medium rotate: false - xy: 1335, 357 + xy: 1471, 781 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-scrap-small rotate: false - xy: 1141, 56 + xy: 1251, 315 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 item-scrap-tiny rotate: false - xy: 697, 13 + xy: 1250, 869 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 item-scrap-xlarge rotate: false - xy: 1114, 864 + xy: 1317, 1257 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 item-silicon-large rotate: false - xy: 1416, 875 + xy: 1258, 1089 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 item-silicon-medium rotate: false - xy: 1199, 187 + xy: 1516, 925 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-silicon-small rotate: false - xy: 1065, 30 + xy: 1273, 621 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 item-silicon-tiny rotate: false - xy: 1315, 67 + xy: 1347, 783 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 item-silicon-xlarge rotate: false - xy: 1993, 1315 + xy: 1367, 1239 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 item-spore-pod-large rotate: false - xy: 1458, 875 + xy: 1300, 1131 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 item-spore-pod-medium rotate: false - xy: 1267, 255 + xy: 1516, 891 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-spore-pod-small rotate: false - xy: 1091, 30 + xy: 1965, 865 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 item-spore-pod-tiny rotate: false - xy: 240, 1129 + xy: 1329, 757 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 item-spore-pod-xlarge rotate: false - xy: 1993, 1265 + xy: 1417, 1231 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 item-surge-alloy-large rotate: false - xy: 1490, 917 + xy: 1300, 1089 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 item-surge-alloy-medium rotate: false - xy: 1335, 323 + xy: 1584, 959 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-surge-alloy-small rotate: false - xy: 1117, 30 + xy: 1321, 775 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 item-surge-alloy-tiny rotate: false - xy: 1333, 67 + xy: 1251, 271 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 item-surge-alloy-xlarge rotate: false - xy: 1146, 1052 + xy: 1467, 1223 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 item-thorium-large rotate: false - xy: 1500, 875 + xy: 1258, 1047 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 item-thorium-medium rotate: false - xy: 1199, 153 + xy: 1584, 925 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-thorium-small rotate: false - xy: 1143, 30 + xy: 1303, 749 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 item-thorium-tiny rotate: false - xy: 1351, 67 + xy: 1303, 705 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 item-thorium-xlarge rotate: false - xy: 1146, 1002 + xy: 1525, 1231 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 item-titanium-large rotate: false - xy: 1374, 833 + xy: 1300, 1047 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 item-titanium-medium rotate: false - xy: 1267, 221 + xy: 1584, 891 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-titanium-small rotate: false - xy: 1167, 59 + xy: 1251, 289 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 item-titanium-tiny rotate: false - xy: 1369, 67 + xy: 1273, 551 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 item-titanium-xlarge rotate: false - xy: 1196, 1059 + xy: 1575, 1231 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 lancer rotate: false - xy: 937, 1256 + xy: 1077, 794 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 liquid-cryofluid-large rotate: false - xy: 1416, 833 + xy: 1250, 1005 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 liquid-cryofluid-medium rotate: false - xy: 1335, 289 + xy: 1652, 959 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 liquid-cryofluid-small rotate: false - xy: 1193, 59 + xy: 1273, 595 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 liquid-cryofluid-tiny rotate: false - xy: 1403, 491 + xy: 222, 1129 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 liquid-cryofluid-xlarge rotate: false - xy: 1296, 1059 + xy: 1775, 1231 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 liquid-oil-large rotate: false - xy: 1458, 833 + xy: 1292, 1005 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 liquid-oil-medium rotate: false - xy: 1199, 119 + xy: 1652, 925 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 liquid-oil-small rotate: false - xy: 1219, 59 + xy: 1991, 865 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 liquid-oil-tiny rotate: false - xy: 1169, 41 + xy: 584, 929 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 liquid-oil-xlarge rotate: false - xy: 1296, 1009 + xy: 1825, 1231 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 liquid-slag-large rotate: false - xy: 1500, 833 + xy: 1236, 963 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 liquid-slag-medium rotate: false - xy: 1199, 85 + xy: 1754, 959 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 liquid-slag-small rotate: false - xy: 1245, 59 + xy: 1303, 723 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 liquid-slag-tiny rotate: false - xy: 1187, 41 + xy: 678, 831 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 liquid-slag-xlarge rotate: false - xy: 1346, 1059 + xy: 1875, 1231 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 liquid-water-large rotate: false - xy: 951, 11 + xy: 1236, 921 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 liquid-water-medium rotate: false - xy: 1267, 153 + xy: 1754, 925 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 liquid-water-small rotate: false - xy: 1271, 59 + xy: 1273, 569 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 liquid-water-tiny rotate: false - xy: 1205, 41 + xy: 767, 733 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 liquid-water-xlarge rotate: false - xy: 1346, 1009 + xy: 1925, 1231 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 mass-driver rotate: false - xy: 717, 359 + xy: 1939, 1529 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 mech-alpha-mech-full rotate: false - xy: 1396, 1059 + xy: 1975, 1231 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 mech-dart-ship-full rotate: false - xy: 1396, 1009 + xy: 1119, 1249 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 mech-delta-mech-full rotate: false - xy: 1446, 1059 + xy: 1169, 1249 size: 48, 48 orig: 48, 48 offset: 0, 0 @@ -5074,28 +5207,28 @@ mech-glaive-ship-full index: -1 mech-javelin-ship-full rotate: false - xy: 1446, 1009 + xy: 1119, 1199 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 mech-omega-mech-full rotate: false - xy: 607, 1377 + xy: 1333, 1374 size: 56, 56 orig: 56, 56 offset: 0, 0 index: -1 mech-tau-mech-full rotate: false - xy: 1153, 1109 + xy: 1243, 70 size: 56, 56 orig: 56, 56 offset: 0, 0 index: -1 mech-trident-ship-full rotate: false - xy: 956, 911 + xy: 1267, 1307 size: 56, 56 orig: 56, 56 offset: 0, 0 @@ -5109,35 +5242,35 @@ meltdown index: -1 repair-point rotate: false - xy: 1437, 799 + xy: 1539, 857 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ripple rotate: false - xy: 815, 457 + xy: 815, 359 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 salvo rotate: false - xy: 1267, 1233 + xy: 1003, 1322 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 scatter rotate: false - xy: 1531, 1233 + xy: 1092, 1058 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 scorch rotate: false - xy: 1437, 765 + xy: 1539, 789 size: 32, 32 orig: 32, 32 offset: 0, 0 @@ -5151,7 +5284,7 @@ spectre index: -1 swarmer rotate: false - xy: 1383, 1167 + xy: 1177, 200 size: 64, 64 orig: 64, 64 offset: 0, 0 @@ -5165,14 +5298,14 @@ unit-chaos-array-full index: -1 unit-crawler-full rotate: false - xy: 1214, 909 + xy: 1208, 1149 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 unit-dagger-full rotate: false - xy: 1264, 909 + xy: 1208, 1099 size: 48, 48 orig: 48, 48 offset: 0, 0 @@ -5186,266 +5319,266 @@ unit-eradicator-full index: -1 unit-eruptor-full rotate: false - xy: 1647, 1167 + xy: 1069, 1365 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 unit-fortress-full rotate: false - xy: 1713, 1167 + xy: 1135, 1431 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 unit-titan-full rotate: false - xy: 1779, 1167 + xy: 1069, 1299 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 wave rotate: false - xy: 1022, 1101 + xy: 1267, 1431 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 item-blast-compound rotate: false - xy: 1233, 357 + xy: 1380, 993 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-coal rotate: false - xy: 1301, 425 + xy: 1414, 951 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-copper rotate: false - xy: 1165, 255 + xy: 1414, 917 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-graphite rotate: false - xy: 1233, 323 + xy: 1482, 985 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-lead rotate: false - xy: 1301, 391 + xy: 1482, 951 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-metaglass rotate: false - xy: 1165, 221 + xy: 1414, 883 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-phase-fabric rotate: false - xy: 1233, 289 + xy: 1482, 883 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-plastanium rotate: false - xy: 1301, 357 + xy: 1403, 815 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-pyratite rotate: false - xy: 1165, 187 + xy: 1403, 781 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-sand rotate: false - xy: 1233, 255 + xy: 1471, 849 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-scrap rotate: false - xy: 1301, 323 + xy: 1471, 815 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-silicon rotate: false - xy: 1165, 153 + xy: 1516, 959 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-spore-pod rotate: false - xy: 1233, 221 + xy: 1550, 959 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-surge-alloy rotate: false - xy: 1301, 289 + xy: 1550, 925 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-thorium rotate: false - xy: 1165, 119 + xy: 1550, 891 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-titanium rotate: false - xy: 1233, 187 + xy: 1618, 959 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 liquid-cryofluid rotate: false - xy: 1301, 255 + xy: 1618, 925 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 liquid-oil rotate: false - xy: 1165, 85 + xy: 1618, 891 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 liquid-slag rotate: false - xy: 1335, 255 + xy: 1720, 925 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 liquid-water rotate: false - xy: 1233, 119 + xy: 1720, 891 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 alpha-mech rotate: false - xy: 521, 1 + xy: 1398, 1447 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 alpha-mech-base rotate: false - xy: 1609, 1117 + xy: 1203, 18 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 alpha-mech-leg rotate: false - xy: 1659, 1117 + xy: 1253, 20 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 delta-mech rotate: false - xy: 207, 33 + xy: 1791, 1331 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 delta-mech-base rotate: false - xy: 257, 33 + xy: 1841, 1331 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 delta-mech-leg rotate: false - xy: 307, 33 + xy: 1891, 1331 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 omega-mech rotate: false - xy: 956, 853 + xy: 157, 25 size: 56, 56 orig: 56, 56 offset: 0, 0 index: -1 omega-mech-armor rotate: false - xy: 1333, 1299 + xy: 1011, 530 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 omega-mech-base rotate: false - xy: 1022, 977 + xy: 215, 25 size: 56, 56 orig: 56, 56 offset: 0, 0 index: -1 omega-mech-leg rotate: false - xy: 1211, 1109 + xy: 273, 25 size: 56, 56 orig: 56, 56 offset: 0, 0 index: -1 tau-mech rotate: false - xy: 1385, 1109 + xy: 979, 3 size: 56, 56 orig: 56, 56 offset: 0, 0 index: -1 tau-mech-base rotate: false - xy: 1446, 959 + xy: 1186, 949 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 tau-mech-leg rotate: false - xy: 1164, 909 + xy: 1186, 899 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 dart-ship rotate: false - xy: 157, 33 + xy: 1741, 1331 size: 48, 48 orig: 48, 48 offset: 0, 0 @@ -5459,28 +5592,28 @@ glaive-ship index: -1 javelin-ship rotate: false - xy: 1196, 1009 + xy: 1625, 1231 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 javelin-ship-shield rotate: false - xy: 1246, 1059 + xy: 1675, 1231 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 trident-ship rotate: false - xy: 1443, 1109 + xy: 1037, 3 size: 56, 56 orig: 56, 56 offset: 0, 0 index: -1 blank rotate: false - xy: 1, 1 + xy: 423, 730 size: 1, 1 orig: 1, 1 offset: 0, 0 @@ -5494,7 +5627,7 @@ circle index: -1 shape-3 rotate: false - xy: 1088, 1102 + xy: 1333, 1432 size: 63, 63 orig: 63, 63 offset: 0, 0 @@ -5522,49 +5655,49 @@ chaos-array-leg index: -1 crawler rotate: false - xy: 979, 303 + xy: 1441, 1331 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 crawler-base rotate: false - xy: 979, 253 + xy: 1491, 1331 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 crawler-leg rotate: false - xy: 979, 203 + xy: 1541, 1331 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 dagger rotate: false - xy: 979, 153 + xy: 1591, 1331 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 dagger-base rotate: false - xy: 979, 103 + xy: 1641, 1331 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 dagger-leg rotate: false - xy: 979, 53 + xy: 1691, 1331 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 draug rotate: false - xy: 357, 33 + xy: 1941, 1331 size: 48, 48 orig: 48, 48 offset: 0, 0 @@ -5592,56 +5725,56 @@ eradicator-leg index: -1 eruptor rotate: false - xy: 913, 325 + xy: 1026, 1058 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 eruptor-base rotate: false - xy: 913, 259 + xy: 1026, 992 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 eruptor-leg rotate: false - xy: 913, 193 + xy: 988, 926 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 fortress rotate: false - xy: 913, 127 + xy: 988, 860 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 fortress-base rotate: false - xy: 913, 61 + xy: 1054, 926 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 titan-base rotate: false - xy: 913, 61 + xy: 1054, 926 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 fortress-leg rotate: false - xy: 871, 1315 + xy: 1054, 860 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 ghoul rotate: false - xy: 843, 1603 + xy: 549, 1653 size: 72, 72 orig: 72, 72 offset: 0, 0 @@ -5655,14 +5788,14 @@ lich index: -1 phantom rotate: false - xy: 1269, 1109 + xy: 331, 25 size: 56, 56 orig: 56, 56 offset: 0, 0 index: -1 power-cell rotate: false - xy: 1327, 1109 + xy: 815, 7 size: 56, 56 orig: 56, 56 offset: 0, 0 @@ -5683,140 +5816,140 @@ revenant index: -1 spirit rotate: false - xy: 1346, 959 + xy: 1158, 1049 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 titan rotate: false - xy: 1449, 1167 + xy: 1177, 134 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 titan-leg rotate: false - xy: 1515, 1167 + xy: 1177, 68 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 wraith rotate: false - xy: 1314, 909 + xy: 1208, 1049 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 artillery-equip rotate: false - xy: 1709, 1109 + xy: 1325, 1307 size: 48, 56 orig: 48, 56 offset: 0, 0 index: -1 blaster-equip rotate: false - xy: 1759, 1117 + xy: 1398, 1397 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 bomber-equip rotate: false - xy: 979, 403 + xy: 1998, 1381 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 missiles-equip rotate: false - xy: 979, 403 + xy: 1998, 1381 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 chain-blaster-equip rotate: false - xy: 979, 353 + xy: 1391, 1347 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 chaos-equip rotate: false - xy: 1088, 964 + xy: 1243, 128 size: 56, 136 orig: 56, 136 offset: 0, 0 index: -1 eradication-equip rotate: false - xy: 521, 51 + xy: 619, 438 size: 96, 192 orig: 96, 192 offset: 0, 0 index: -1 eruption-equip rotate: false - xy: 1977, 1175 + xy: 1375, 1289 size: 48, 56 orig: 48, 56 offset: 0, 0 index: -1 flakgun-equip rotate: false - xy: 717, 15 + xy: 1425, 1281 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 flamethrower-equip rotate: false - xy: 767, 7 + xy: 1475, 1273 size: 48, 56 orig: 48, 56 offset: 0, 0 index: -1 heal-blaster-equip rotate: false - xy: 817, 15 + xy: 1525, 1281 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 lich-missiles-equip rotate: false - xy: 1246, 1009 + xy: 1725, 1231 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 reaper-gun-equip rotate: false - xy: 1196, 959 + xy: 1169, 1199 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 revenant-missiles-equip rotate: false - xy: 1246, 959 + xy: 1158, 1149 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 shockgun-equip rotate: false - xy: 1296, 959 + xy: 1158, 1099 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 swarmer-equip rotate: false - xy: 1396, 959 + xy: 1158, 999 size: 48, 48 orig: 48, 48 offset: 0, 0 @@ -7205,10220 +7338,6 @@ size: 2048,1024 format: RGBA8888 filter: Nearest,Nearest repeat: none -bar - rotate: false - xy: 1951, 364 - size: 27, 36 - split: 9, 9, 9, 9 - orig: 27, 36 - offset: 0, 0 - index: -1 -bar-top - rotate: false - xy: 1922, 364 - size: 27, 36 - split: 9, 10, 9, 10 - orig: 27, 36 - offset: 0, 0 - index: -1 -block-alloy-smelter-large - rotate: false - xy: 301, 582 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-alloy-smelter-medium - rotate: false - xy: 2009, 940 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-alloy-smelter-small - rotate: false - xy: 2023, 622 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-alloy-smelter-tiny - rotate: false - xy: 553, 11 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-alloy-smelter-xlarge - rotate: false - xy: 1, 669 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-arc-large - rotate: false - xy: 351, 632 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-arc-medium - rotate: false - xy: 2009, 906 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-arc-small - rotate: false - xy: 2023, 596 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-arc-tiny - rotate: false - xy: 747, 367 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-arc-xlarge - rotate: false - xy: 259, 927 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-armored-conveyor-large - rotate: false - xy: 401, 682 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-armored-conveyor-medium - rotate: false - xy: 2009, 872 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-armored-conveyor-small - rotate: false - xy: 2009, 778 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-armored-conveyor-tiny - rotate: false - xy: 1011, 394 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-armored-conveyor-xlarge - rotate: false - xy: 1, 619 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-battery-large - rotate: false - xy: 301, 540 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-battery-large-large - rotate: false - xy: 443, 682 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-battery-large-medium - rotate: false - xy: 2009, 838 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-battery-large-small - rotate: false - xy: 1765, 312 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-battery-large-tiny - rotate: false - xy: 749, 281 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-battery-large-xlarge - rotate: false - xy: 259, 877 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-battery-medium - rotate: false - xy: 2009, 804 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-battery-small - rotate: false - xy: 1797, 344 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-battery-tiny - rotate: false - xy: 2031, 302 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-battery-xlarge - rotate: false - xy: 1, 569 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-blast-drill-large - rotate: false - xy: 301, 498 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-blast-drill-medium - rotate: false - xy: 469, 41 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-blast-drill-small - rotate: false - xy: 1029, 280 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-blast-drill-tiny - rotate: false - xy: 2031, 284 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-blast-drill-xlarge - rotate: false - xy: 259, 827 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-blast-mixer-large - rotate: false - xy: 485, 682 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-blast-mixer-medium - rotate: false - xy: 1037, 606 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-blast-mixer-small - rotate: false - xy: 1055, 280 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-blast-mixer-tiny - rotate: false - xy: 1, 1 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-blast-mixer-xlarge - rotate: false - xy: 1, 519 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-bridge-conduit-large - rotate: false - xy: 301, 456 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-bridge-conduit-medium - rotate: false - xy: 1071, 606 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-bridge-conduit-small - rotate: false - xy: 1081, 280 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-bridge-conduit-tiny - rotate: false - xy: 1131, 210 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-bridge-conduit-xlarge - rotate: false - xy: 259, 777 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-bridge-conveyor-large - rotate: false - xy: 527, 682 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-bridge-conveyor-medium - rotate: false - xy: 1105, 606 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-bridge-conveyor-small - rotate: false - xy: 1107, 280 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-bridge-conveyor-tiny - rotate: false - xy: 19, 1 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-bridge-conveyor-xlarge - rotate: false - xy: 1, 469 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-char-large - rotate: false - xy: 301, 414 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-char-medium - rotate: false - xy: 1139, 606 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-char-small - rotate: false - xy: 1133, 280 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-char-tiny - rotate: false - xy: 1131, 192 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-char-xlarge - rotate: false - xy: 1, 419 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-cliffs-large - rotate: false - xy: 569, 682 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-cliffs-medium - rotate: false - xy: 1173, 606 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-cliffs-small - rotate: false - xy: 1159, 280 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-cliffs-tiny - rotate: false - xy: 1149, 210 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-cliffs-xlarge - rotate: false - xy: 1, 369 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-coal-centrifuge-large - rotate: false - xy: 301, 372 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-coal-centrifuge-medium - rotate: false - xy: 1207, 606 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-coal-centrifuge-small - rotate: false - xy: 1185, 280 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-coal-centrifuge-tiny - rotate: false - xy: 1149, 192 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-coal-centrifuge-xlarge - rotate: false - xy: 1, 319 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-combustion-generator-large - rotate: false - xy: 611, 682 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-combustion-generator-medium - rotate: false - xy: 1241, 606 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-combustion-generator-small - rotate: false - xy: 1211, 280 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-combustion-generator-tiny - rotate: false - xy: 1167, 210 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-combustion-generator-xlarge - rotate: false - xy: 1, 269 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-command-center-large - rotate: false - xy: 301, 330 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-command-center-medium - rotate: false - xy: 1275, 606 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-command-center-small - rotate: false - xy: 1237, 280 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-command-center-tiny - rotate: false - xy: 1167, 192 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-command-center-xlarge - rotate: false - xy: 1, 219 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-conduit-large - rotate: false - xy: 653, 682 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-conduit-medium - rotate: false - xy: 1309, 606 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-conduit-small - rotate: false - xy: 1263, 280 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-conduit-tiny - rotate: false - xy: 1185, 210 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-conduit-xlarge - rotate: false - xy: 1, 169 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-container-large - rotate: false - xy: 301, 288 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-container-medium - rotate: false - xy: 1343, 606 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-container-small - rotate: false - xy: 1289, 280 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-container-tiny - rotate: false - xy: 1185, 192 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-container-xlarge - rotate: false - xy: 1, 119 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-conveyor-large - rotate: false - xy: 695, 682 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-conveyor-medium - rotate: false - xy: 1377, 606 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-conveyor-small - rotate: false - xy: 1315, 280 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-conveyor-tiny - rotate: false - xy: 1203, 210 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-conveyor-xlarge - rotate: false - xy: 1, 69 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-copper-wall-large - rotate: false - xy: 301, 246 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-copper-wall-large-large - rotate: false - xy: 737, 682 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-copper-wall-large-medium - rotate: false - xy: 1411, 606 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-copper-wall-large-small - rotate: false - xy: 1341, 280 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-copper-wall-large-tiny - rotate: false - xy: 1203, 192 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-copper-wall-large-xlarge - rotate: false - xy: 1, 19 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-copper-wall-medium - rotate: false - xy: 1445, 606 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-copper-wall-small - rotate: false - xy: 1367, 280 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-copper-wall-tiny - rotate: false - xy: 1221, 210 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-copper-wall-xlarge - rotate: false - xy: 87, 716 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-core-foundation-large - rotate: false - xy: 301, 204 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-core-foundation-medium - rotate: false - xy: 1479, 606 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-core-foundation-small - rotate: false - xy: 1393, 280 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-core-foundation-tiny - rotate: false - xy: 1221, 192 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-core-foundation-xlarge - rotate: false - xy: 137, 716 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-core-nucleus-large - rotate: false - xy: 779, 682 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-core-nucleus-medium - rotate: false - xy: 1513, 606 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-core-nucleus-small - rotate: false - xy: 1419, 280 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-core-nucleus-tiny - rotate: false - xy: 1239, 210 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-core-nucleus-xlarge - rotate: false - xy: 187, 716 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-core-shard-large - rotate: false - xy: 301, 162 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-core-shard-medium - rotate: false - xy: 1547, 606 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-core-shard-small - rotate: false - xy: 1445, 280 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-core-shard-tiny - rotate: false - xy: 1239, 192 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-core-shard-xlarge - rotate: false - xy: 345, 974 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-craters-large - rotate: false - xy: 821, 682 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-craters-medium - rotate: false - xy: 1581, 606 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-craters-small - rotate: false - xy: 1471, 280 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-craters-tiny - rotate: false - xy: 1257, 210 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-craters-xlarge - rotate: false - xy: 395, 974 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-crawler-factory-large - rotate: false - xy: 301, 120 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-crawler-factory-medium - rotate: false - xy: 1615, 606 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-crawler-factory-small - rotate: false - xy: 1497, 280 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-crawler-factory-tiny - rotate: false - xy: 1257, 192 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-crawler-factory-xlarge - rotate: false - xy: 445, 974 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-cryofluidmixer-large - rotate: false - xy: 863, 682 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-cryofluidmixer-medium - rotate: false - xy: 1649, 606 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-cryofluidmixer-small - rotate: false - xy: 1523, 280 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-cryofluidmixer-tiny - rotate: false - xy: 1275, 210 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-cryofluidmixer-xlarge - rotate: false - xy: 495, 974 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-cultivator-large - rotate: false - xy: 301, 78 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-cultivator-medium - rotate: false - xy: 1683, 606 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-cultivator-small - rotate: false - xy: 1549, 280 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-cultivator-tiny - rotate: false - xy: 1275, 192 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-cultivator-xlarge - rotate: false - xy: 545, 974 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-cyclone-large - rotate: false - xy: 905, 682 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-cyclone-medium - rotate: false - xy: 1717, 606 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-cyclone-small - rotate: false - xy: 1575, 280 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-cyclone-tiny - rotate: false - xy: 1293, 210 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-cyclone-xlarge - rotate: false - xy: 595, 974 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-dagger-factory-large - rotate: false - xy: 301, 36 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-dagger-factory-medium - rotate: false - xy: 1751, 606 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-dagger-factory-small - rotate: false - xy: 1601, 280 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-dagger-factory-tiny - rotate: false - xy: 1293, 192 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-dagger-factory-xlarge - rotate: false - xy: 645, 974 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-dark-metal-large - rotate: false - xy: 947, 682 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-dark-metal-medium - rotate: false - xy: 1785, 606 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-dark-metal-small - rotate: false - xy: 1627, 280 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-dark-metal-tiny - rotate: false - xy: 1311, 210 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-dark-metal-xlarge - rotate: false - xy: 695, 974 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-dark-panel-1-large - rotate: false - xy: 989, 682 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-dark-panel-1-medium - rotate: false - xy: 1819, 606 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-dark-panel-1-small - rotate: false - xy: 1653, 280 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-dark-panel-1-tiny - rotate: false - xy: 1311, 192 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-dark-panel-1-xlarge - rotate: false - xy: 745, 974 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-dark-panel-2-large - rotate: false - xy: 1031, 682 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-dark-panel-2-medium - rotate: false - xy: 1853, 606 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-dark-panel-2-small - rotate: false - xy: 1679, 280 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-dark-panel-2-tiny - rotate: false - xy: 1329, 210 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-dark-panel-2-xlarge - rotate: false - xy: 795, 974 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-dark-panel-3-large - rotate: false - xy: 1073, 682 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-dark-panel-3-medium - rotate: false - xy: 1887, 606 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-dark-panel-3-small - rotate: false - xy: 1705, 280 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-dark-panel-3-tiny - rotate: false - xy: 1329, 192 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-dark-panel-3-xlarge - rotate: false - xy: 845, 974 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-dark-panel-4-large - rotate: false - xy: 1115, 682 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-dark-panel-4-medium - rotate: false - xy: 1921, 606 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-dark-panel-4-small - rotate: false - xy: 1731, 280 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-dark-panel-4-tiny - rotate: false - xy: 1347, 210 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-dark-panel-4-xlarge - rotate: false - xy: 895, 974 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-dark-panel-5-large - rotate: false - xy: 1157, 682 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-dark-panel-5-medium - rotate: false - xy: 1955, 606 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-dark-panel-5-small - rotate: false - xy: 501, 3 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-dark-panel-5-tiny - rotate: false - xy: 1347, 192 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-dark-panel-5-xlarge - rotate: false - xy: 945, 974 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-dark-panel-6-large - rotate: false - xy: 1199, 682 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-dark-panel-6-medium - rotate: false - xy: 1989, 614 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-dark-panel-6-small - rotate: false - xy: 527, 3 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-dark-panel-6-tiny - rotate: false - xy: 1365, 210 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-dark-panel-6-xlarge - rotate: false - xy: 995, 974 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-darksand-large - rotate: false - xy: 1241, 682 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-darksand-medium - rotate: false - xy: 301, 2 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-darksand-small - rotate: false - xy: 2009, 346 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-darksand-tainted-water-large - rotate: false - xy: 1283, 682 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-darksand-tainted-water-medium - rotate: false - xy: 335, 2 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-darksand-tainted-water-small - rotate: false - xy: 1823, 336 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-darksand-tainted-water-tiny - rotate: false - xy: 1365, 192 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-darksand-tainted-water-xlarge - rotate: false - xy: 1045, 974 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-darksand-tiny - rotate: false - xy: 1383, 210 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-darksand-water-large - rotate: false - xy: 1325, 682 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-darksand-water-medium - rotate: false - xy: 1036, 572 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-darksand-water-small - rotate: false - xy: 1849, 336 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-darksand-water-tiny - rotate: false - xy: 1383, 192 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-darksand-water-xlarge - rotate: false - xy: 1095, 974 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-darksand-xlarge - rotate: false - xy: 1145, 974 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-dart-mech-pad-large - rotate: false - xy: 1367, 682 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-dart-mech-pad-medium - rotate: false - xy: 1070, 572 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-dart-mech-pad-small - rotate: false - xy: 1875, 336 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-dart-mech-pad-tiny - rotate: false - xy: 1401, 210 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-dart-mech-pad-xlarge - rotate: false - xy: 1195, 974 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-deepwater-large - rotate: false - xy: 1409, 682 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-deepwater-medium - rotate: false - xy: 1104, 572 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-deepwater-small - rotate: false - xy: 1901, 336 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-deepwater-tiny - rotate: false - xy: 1401, 192 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-deepwater-xlarge - rotate: false - xy: 1245, 974 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-delta-mech-pad-large - rotate: false - xy: 1451, 682 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-delta-mech-pad-medium - rotate: false - xy: 1138, 572 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-delta-mech-pad-small - rotate: false - xy: 1927, 338 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-delta-mech-pad-tiny - rotate: false - xy: 1419, 210 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-delta-mech-pad-xlarge - rotate: false - xy: 1295, 974 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-differential-generator-large - rotate: false - xy: 1493, 682 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-differential-generator-medium - rotate: false - xy: 1172, 572 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-differential-generator-small - rotate: false - xy: 1953, 338 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-differential-generator-tiny - rotate: false - xy: 1419, 192 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-differential-generator-xlarge - rotate: false - xy: 1345, 974 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-distributor-large - rotate: false - xy: 1535, 682 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-distributor-medium - rotate: false - xy: 1206, 572 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-distributor-small - rotate: false - xy: 1797, 318 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-distributor-tiny - rotate: false - xy: 1437, 210 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-distributor-xlarge - rotate: false - xy: 1395, 974 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-door-large - rotate: false - xy: 1577, 682 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-door-large-large - rotate: false - xy: 1619, 682 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-door-large-medium - rotate: false - xy: 1240, 572 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-door-large-small - rotate: false - xy: 1823, 310 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-door-large-tiny - rotate: false - xy: 1437, 192 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-door-large-xlarge - rotate: false - xy: 1445, 974 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-door-medium - rotate: false - xy: 1274, 572 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-door-small - rotate: false - xy: 1849, 310 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-door-tiny - rotate: false - xy: 1455, 210 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-door-xlarge - rotate: false - xy: 1495, 974 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-draug-factory-large - rotate: false - xy: 1661, 682 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-draug-factory-medium - rotate: false - xy: 1308, 572 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-draug-factory-small - rotate: false - xy: 1875, 310 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-draug-factory-tiny - rotate: false - xy: 1455, 192 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-draug-factory-xlarge - rotate: false - xy: 1545, 974 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-dunerocks-large - rotate: false - xy: 1703, 682 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-dunerocks-medium - rotate: false - xy: 1342, 572 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-dunerocks-small - rotate: false - xy: 1901, 310 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-dunerocks-tiny - rotate: false - xy: 1473, 210 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-dunerocks-xlarge - rotate: false - xy: 1595, 974 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-duo-large - rotate: false - xy: 1745, 682 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-duo-medium - rotate: false - xy: 1376, 572 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-duo-small - rotate: false - xy: 1927, 312 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-duo-tiny - rotate: false - xy: 1473, 192 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-duo-xlarge - rotate: false - xy: 1645, 974 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-force-projector-large - rotate: false - xy: 1787, 682 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-force-projector-medium - rotate: false - xy: 1410, 572 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-force-projector-small - rotate: false - xy: 1953, 312 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-force-projector-tiny - rotate: false - xy: 1491, 210 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-force-projector-xlarge - rotate: false - xy: 1695, 974 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-fortress-factory-large - rotate: false - xy: 1829, 682 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-fortress-factory-medium - rotate: false - xy: 1444, 572 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-fortress-factory-small - rotate: false - xy: 1979, 313 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-fortress-factory-tiny - rotate: false - xy: 1491, 192 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-fortress-factory-xlarge - rotate: false - xy: 1745, 974 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-fuse-large - rotate: false - xy: 1871, 682 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-fuse-medium - rotate: false - xy: 1478, 572 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-fuse-small - rotate: false - xy: 1757, 280 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-fuse-tiny - rotate: false - xy: 1509, 210 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-fuse-xlarge - rotate: false - xy: 1795, 974 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-ghoul-factory-large - rotate: false - xy: 1913, 682 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-ghoul-factory-medium - rotate: false - xy: 1512, 572 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-ghoul-factory-small - rotate: false - xy: 2009, 320 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-ghoul-factory-tiny - rotate: false - xy: 1509, 192 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-ghoul-factory-xlarge - rotate: false - xy: 1845, 974 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-glaive-ship-pad-large - rotate: false - xy: 1955, 682 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-glaive-ship-pad-medium - rotate: false - xy: 1546, 572 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-glaive-ship-pad-small - rotate: false - xy: 2021, 452 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-glaive-ship-pad-tiny - rotate: false - xy: 1527, 210 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-glaive-ship-pad-xlarge - rotate: false - xy: 1895, 974 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-graphite-press-large - rotate: false - xy: 1987, 732 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-graphite-press-medium - rotate: false - xy: 1580, 572 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-graphite-press-small - rotate: false - xy: 2005, 294 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-graphite-press-tiny - rotate: false - xy: 1527, 192 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-graphite-press-xlarge - rotate: false - xy: 1945, 974 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-grass-large - rotate: false - xy: 1997, 690 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-grass-medium - rotate: false - xy: 1614, 572 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-grass-small - rotate: false - xy: 1979, 287 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-grass-tiny - rotate: false - xy: 1545, 210 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-grass-xlarge - rotate: false - xy: 1995, 974 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-hail-large - rotate: false - xy: 343, 582 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-hail-medium - rotate: false - xy: 1648, 572 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-hail-small - rotate: false - xy: 2005, 268 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-hail-tiny - rotate: false - xy: 1545, 192 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-hail-xlarge - rotate: false - xy: 237, 716 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-holostone-large - rotate: false - xy: 343, 540 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-holostone-medium - rotate: false - xy: 1682, 572 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-holostone-small - rotate: false - xy: 743, 53 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-holostone-tiny - rotate: false - xy: 1563, 210 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-holostone-xlarge - rotate: false - xy: 51, 666 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-hotrock-large - rotate: false - xy: 343, 498 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-hotrock-medium - rotate: false - xy: 1716, 572 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-hotrock-small - rotate: false - xy: 743, 27 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-hotrock-tiny - rotate: false - xy: 1563, 192 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-hotrock-xlarge - rotate: false - xy: 51, 616 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-ice-large - rotate: false - xy: 343, 456 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-ice-medium - rotate: false - xy: 1750, 572 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-ice-small - rotate: false - xy: 743, 1 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-ice-snow-large - rotate: false - xy: 343, 414 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-ice-snow-medium - rotate: false - xy: 1784, 572 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-ice-snow-small - rotate: false - xy: 1783, 286 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-ice-snow-tiny - rotate: false - xy: 1581, 210 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-ice-snow-xlarge - rotate: false - xy: 101, 666 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-ice-tiny - rotate: false - xy: 1581, 192 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-ice-xlarge - rotate: false - xy: 51, 566 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-icerocks-large - rotate: false - xy: 343, 372 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-icerocks-medium - rotate: false - xy: 1818, 572 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-icerocks-small - rotate: false - xy: 1809, 284 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-icerocks-tiny - rotate: false - xy: 1599, 210 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-icerocks-xlarge - rotate: false - xy: 101, 616 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-ignarock-large - rotate: false - xy: 343, 330 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-ignarock-medium - rotate: false - xy: 1852, 572 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-ignarock-small - rotate: false - xy: 1835, 284 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-ignarock-tiny - rotate: false - xy: 1599, 192 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-ignarock-xlarge - rotate: false - xy: 151, 666 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-impact-reactor-large - rotate: false - xy: 343, 288 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-impact-reactor-medium - rotate: false - xy: 1886, 572 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-impact-reactor-small - rotate: false - xy: 1861, 284 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-impact-reactor-tiny - rotate: false - xy: 1617, 210 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-impact-reactor-xlarge - rotate: false - xy: 51, 516 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-incinerator-large - rotate: false - xy: 343, 246 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-incinerator-medium - rotate: false - xy: 1920, 572 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-incinerator-small - rotate: false - xy: 1887, 284 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-incinerator-tiny - rotate: false - xy: 1617, 192 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-incinerator-xlarge - rotate: false - xy: 101, 566 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-inverted-sorter-large - rotate: false - xy: 343, 204 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-inverted-sorter-medium - rotate: false - xy: 1954, 572 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-inverted-sorter-small - rotate: false - xy: 1913, 284 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-inverted-sorter-tiny - rotate: false - xy: 1635, 210 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-inverted-sorter-xlarge - rotate: false - xy: 151, 616 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-item-source-large - rotate: false - xy: 343, 162 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-item-source-medium - rotate: false - xy: 369, 2 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-item-source-small - rotate: false - xy: 1939, 286 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-item-source-tiny - rotate: false - xy: 1635, 192 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-item-source-xlarge - rotate: false - xy: 201, 666 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-item-void-large - rotate: false - xy: 343, 120 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-item-void-medium - rotate: false - xy: 403, 10 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-item-void-small - rotate: false - xy: 1783, 260 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-item-void-tiny - rotate: false - xy: 1653, 210 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-item-void-xlarge - rotate: false - xy: 51, 466 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-javelin-ship-pad-large - rotate: false - xy: 343, 78 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-javelin-ship-pad-medium - rotate: false - xy: 511, 199 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-javelin-ship-pad-small - rotate: false - xy: 1809, 258 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-javelin-ship-pad-tiny - rotate: false - xy: 1653, 192 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-javelin-ship-pad-xlarge - rotate: false - xy: 101, 516 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-junction-large - rotate: false - xy: 343, 36 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-junction-medium - rotate: false - xy: 507, 165 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-junction-small - rotate: false - xy: 1835, 258 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-junction-tiny - rotate: false - xy: 1671, 210 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-junction-xlarge - rotate: false - xy: 151, 566 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-kiln-large - rotate: false - xy: 393, 632 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-kiln-medium - rotate: false - xy: 507, 131 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-kiln-small - rotate: false - xy: 1861, 258 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-kiln-tiny - rotate: false - xy: 1671, 192 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-kiln-xlarge - rotate: false - xy: 201, 616 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-lancer-large - rotate: false - xy: 385, 590 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-lancer-medium - rotate: false - xy: 507, 97 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-lancer-small - rotate: false - xy: 1887, 258 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-lancer-tiny - rotate: false - xy: 1689, 210 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-lancer-xlarge - rotate: false - xy: 51, 416 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-laser-drill-large - rotate: false - xy: 385, 548 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-laser-drill-medium - rotate: false - xy: 507, 63 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-laser-drill-small - rotate: false - xy: 1913, 258 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-laser-drill-tiny - rotate: false - xy: 1689, 192 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-laser-drill-xlarge - rotate: false - xy: 101, 466 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-launch-pad-large - rotate: false - xy: 385, 506 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-launch-pad-large-large - rotate: false - xy: 385, 464 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-launch-pad-large-medium - rotate: false - xy: 503, 29 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-launch-pad-large-small - rotate: false - xy: 1939, 260 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-launch-pad-large-tiny - rotate: false - xy: 1707, 210 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-launch-pad-large-xlarge - rotate: false - xy: 151, 516 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-launch-pad-medium - rotate: false - xy: 553, 241 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-launch-pad-small - rotate: false - xy: 1965, 261 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-launch-pad-tiny - rotate: false - xy: 1707, 192 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-launch-pad-xlarge - rotate: false - xy: 201, 566 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-liquid-junction-large - rotate: false - xy: 385, 422 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-liquid-junction-medium - rotate: false - xy: 595, 283 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-liquid-junction-small - rotate: false - xy: 1939, 234 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-liquid-junction-tiny - rotate: false - xy: 1725, 210 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-liquid-junction-xlarge - rotate: false - xy: 51, 366 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-liquid-router-large - rotate: false - xy: 385, 380 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-liquid-router-medium - rotate: false - xy: 637, 325 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-liquid-router-small - rotate: false - xy: 1965, 235 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-liquid-router-tiny - rotate: false - xy: 1725, 192 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-liquid-router-xlarge - rotate: false - xy: 101, 416 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-liquid-source-large - rotate: false - xy: 385, 338 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-liquid-source-medium - rotate: false - xy: 679, 367 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-liquid-source-small - rotate: false - xy: 1991, 242 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-liquid-source-tiny - rotate: false - xy: 1743, 210 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-liquid-source-xlarge - rotate: false - xy: 151, 466 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-liquid-tank-large - rotate: false - xy: 385, 296 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-liquid-tank-medium - rotate: false - xy: 721, 409 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-liquid-tank-small - rotate: false - xy: 2017, 242 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-liquid-tank-tiny - rotate: false - xy: 1743, 192 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-liquid-tank-xlarge - rotate: false - xy: 201, 516 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-magmarock-large - rotate: false - xy: 385, 254 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-magmarock-medium - rotate: false - xy: 763, 451 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-magmarock-small - rotate: false - xy: 1991, 216 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-magmarock-tiny - rotate: false - xy: 1761, 210 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-magmarock-xlarge - rotate: false - xy: 51, 316 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-mass-driver-large - rotate: false - xy: 385, 212 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-mass-driver-medium - rotate: false - xy: 797, 451 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-mass-driver-small - rotate: false - xy: 2017, 216 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-mass-driver-tiny - rotate: false - xy: 1761, 192 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-mass-driver-xlarge - rotate: false - xy: 101, 366 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-mechanical-drill-large - rotate: false - xy: 385, 170 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-mechanical-drill-medium - rotate: false - xy: 847, 548 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-mechanical-drill-small - rotate: false - xy: 1965, 209 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-mechanical-drill-tiny - rotate: false - xy: 1017, 567 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-mechanical-drill-xlarge - rotate: false - xy: 151, 416 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-mechanical-pump-large - rotate: false - xy: 385, 128 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-mechanical-pump-medium - rotate: false - xy: 881, 548 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-mechanical-pump-small - rotate: false - xy: 1991, 190 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-mechanical-pump-tiny - rotate: false - xy: 1017, 549 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-mechanical-pump-xlarge - rotate: false - xy: 201, 466 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-meltdown-large - rotate: false - xy: 385, 86 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-meltdown-medium - rotate: false - xy: 915, 548 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-meltdown-small - rotate: false - xy: 2017, 190 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-meltdown-tiny - rotate: false - xy: 689, 255 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-meltdown-xlarge - rotate: false - xy: 51, 266 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-melter-large - rotate: false - xy: 385, 44 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-melter-medium - rotate: false - xy: 949, 548 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-melter-small - rotate: false - xy: 697, 273 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-melter-tiny - rotate: false - xy: 1781, 216 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-melter-xlarge - rotate: false - xy: 101, 316 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-mend-projector-large - rotate: false - xy: 435, 640 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-mend-projector-medium - rotate: false - xy: 843, 514 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-mend-projector-small - rotate: false - xy: 723, 273 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-mend-projector-tiny - rotate: false - xy: 1779, 198 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-mend-projector-xlarge - rotate: false - xy: 151, 366 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-mender-large - rotate: false - xy: 477, 640 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-mender-medium - rotate: false - xy: 877, 514 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-mender-small - rotate: false - xy: 715, 247 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-mender-tiny - rotate: false - xy: 1799, 214 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-mender-xlarge - rotate: false - xy: 201, 416 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-message-large - rotate: false - xy: 519, 640 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-message-medium - rotate: false - xy: 911, 514 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-message-small - rotate: false - xy: 715, 221 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-message-tiny - rotate: false - xy: 1817, 214 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-message-xlarge - rotate: false - xy: 51, 216 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-metal-floor-2-large - rotate: false - xy: 561, 640 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-metal-floor-2-medium - rotate: false - xy: 945, 514 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-metal-floor-2-small - rotate: false - xy: 715, 195 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-metal-floor-2-tiny - rotate: false - xy: 1835, 214 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-metal-floor-2-xlarge - rotate: false - xy: 101, 266 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-metal-floor-3-large - rotate: false - xy: 603, 640 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-metal-floor-3-medium - rotate: false - xy: 839, 480 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-metal-floor-3-small - rotate: false - xy: 741, 247 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-metal-floor-3-tiny - rotate: false - xy: 1853, 214 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-metal-floor-3-xlarge - rotate: false - xy: 151, 316 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-metal-floor-5-large - rotate: false - xy: 645, 640 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-metal-floor-5-medium - rotate: false - xy: 873, 480 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-metal-floor-5-small - rotate: false - xy: 741, 221 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-metal-floor-5-tiny - rotate: false - xy: 1871, 214 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-metal-floor-5-xlarge - rotate: false - xy: 201, 366 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-metal-floor-damaged-large - rotate: false - xy: 687, 640 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-metal-floor-damaged-medium - rotate: false - xy: 907, 480 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-metal-floor-damaged-small - rotate: false - xy: 741, 195 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-metal-floor-damaged-tiny - rotate: false - xy: 1889, 214 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-metal-floor-damaged-xlarge - rotate: false - xy: 51, 166 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-metal-floor-large - rotate: false - xy: 729, 640 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-metal-floor-medium - rotate: false - xy: 941, 480 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-metal-floor-small - rotate: false - xy: 745, 169 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-metal-floor-tiny - rotate: false - xy: 1907, 214 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-metal-floor-xlarge - rotate: false - xy: 101, 216 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-moss-large - rotate: false - xy: 771, 640 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-moss-medium - rotate: false - xy: 831, 446 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-moss-small - rotate: false - xy: 745, 143 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-moss-tiny - rotate: false - xy: 1797, 196 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-moss-xlarge - rotate: false - xy: 151, 266 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-multi-press-large - rotate: false - xy: 813, 640 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-multi-press-medium - rotate: false - xy: 865, 446 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-multi-press-small - rotate: false - xy: 745, 117 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-multi-press-tiny - rotate: false - xy: 1815, 196 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-multi-press-xlarge - rotate: false - xy: 201, 316 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-oil-extractor-large - rotate: false - xy: 855, 640 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-oil-extractor-medium - rotate: false - xy: 899, 446 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-oil-extractor-small - rotate: false - xy: 745, 91 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-oil-extractor-tiny - rotate: false - xy: 1833, 196 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-oil-extractor-xlarge - rotate: false - xy: 51, 116 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-omega-mech-pad-large - rotate: false - xy: 897, 640 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-omega-mech-pad-medium - rotate: false - xy: 933, 446 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-omega-mech-pad-small - rotate: false - xy: 767, 263 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-omega-mech-pad-tiny - rotate: false - xy: 1851, 196 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-omega-mech-pad-xlarge - rotate: false - xy: 101, 166 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-overdrive-projector-large - rotate: false - xy: 939, 640 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-overdrive-projector-medium - rotate: false - xy: 983, 548 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-overdrive-projector-small - rotate: false - xy: 767, 237 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-overdrive-projector-tiny - rotate: false - xy: 1869, 196 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-overdrive-projector-xlarge - rotate: false - xy: 151, 216 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-overflow-gate-large - rotate: false - xy: 981, 640 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-overflow-gate-medium - rotate: false - xy: 979, 514 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-overflow-gate-small - rotate: false - xy: 767, 211 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-overflow-gate-tiny - rotate: false - xy: 1887, 196 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-overflow-gate-xlarge - rotate: false - xy: 201, 266 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-pebbles-large - rotate: false - xy: 1023, 640 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-pebbles-medium - rotate: false - xy: 975, 480 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-pebbles-small - rotate: false - xy: 793, 258 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-pebbles-tiny - rotate: false - xy: 1905, 196 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-pebbles-xlarge - rotate: false - xy: 51, 66 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-phantom-factory-large - rotate: false - xy: 1065, 640 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-phantom-factory-medium - rotate: false - xy: 967, 446 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-phantom-factory-small - rotate: false - xy: 793, 232 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-phantom-factory-tiny - rotate: false - xy: 1925, 214 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-phantom-factory-xlarge - rotate: false - xy: 101, 116 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-phase-conduit-large - rotate: false - xy: 1107, 640 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-phase-conduit-medium - rotate: false - xy: 1989, 580 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-phase-conduit-small - rotate: false - xy: 819, 258 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-phase-conduit-tiny - rotate: false - xy: 1923, 196 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-phase-conduit-xlarge - rotate: false - xy: 151, 166 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-phase-conveyor-large - rotate: false - xy: 1149, 640 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-phase-conveyor-medium - rotate: false - xy: 1001, 446 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-phase-conveyor-small - rotate: false - xy: 819, 232 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-phase-conveyor-tiny - rotate: false - xy: 1943, 216 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-phase-conveyor-xlarge - rotate: false - xy: 201, 216 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-phase-wall-large - rotate: false - xy: 1191, 640 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-phase-wall-large-large - rotate: false - xy: 1233, 640 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-phase-wall-large-medium - rotate: false - xy: 1009, 480 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-phase-wall-large-small - rotate: false - xy: 845, 258 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-phase-wall-large-tiny - rotate: false - xy: 1779, 180 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-phase-wall-large-xlarge - rotate: false - xy: 101, 66 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-phase-wall-medium - rotate: false - xy: 1013, 514 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-phase-wall-small - rotate: false - xy: 845, 232 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-phase-wall-tiny - rotate: false - xy: 1797, 178 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-phase-wall-xlarge - rotate: false - xy: 151, 116 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-phase-weaver-large - rotate: false - xy: 1275, 640 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-phase-weaver-medium - rotate: false - xy: 1047, 538 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-phase-weaver-small - rotate: false - xy: 871, 258 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-phase-weaver-tiny - rotate: false - xy: 1815, 178 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-phase-weaver-xlarge - rotate: false - xy: 201, 166 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-pine-large - rotate: false - xy: 1317, 640 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-pine-medium - rotate: false - xy: 1081, 538 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-pine-small - rotate: false - xy: 871, 232 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-pine-tiny - rotate: false - xy: 1833, 178 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-pine-xlarge - rotate: false - xy: 151, 66 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-plastanium-compressor-large - rotate: false - xy: 1359, 640 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-plastanium-compressor-medium - rotate: false - xy: 1115, 538 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-plastanium-compressor-small - rotate: false - xy: 897, 258 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-plastanium-compressor-tiny - rotate: false - xy: 1851, 178 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-plastanium-compressor-xlarge - rotate: false - xy: 201, 116 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-plastanium-wall-large - rotate: false - xy: 1401, 640 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-plastanium-wall-large-large - rotate: false - xy: 1443, 640 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-plastanium-wall-large-medium - rotate: false - xy: 1149, 538 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-plastanium-wall-large-small - rotate: false - xy: 897, 232 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-plastanium-wall-large-tiny - rotate: false - xy: 1869, 178 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-plastanium-wall-large-xlarge - rotate: false - xy: 201, 66 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-plastanium-wall-medium - rotate: false - xy: 1183, 538 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-plastanium-wall-small - rotate: false - xy: 923, 258 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-plastanium-wall-tiny - rotate: false - xy: 1887, 178 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-plastanium-wall-xlarge - rotate: false - xy: 51, 16 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-pneumatic-drill-large - rotate: false - xy: 1485, 640 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-pneumatic-drill-medium - rotate: false - xy: 1217, 538 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-pneumatic-drill-small - rotate: false - xy: 923, 232 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-pneumatic-drill-tiny - rotate: false - xy: 1905, 178 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-pneumatic-drill-xlarge - rotate: false - xy: 101, 16 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-power-node-large - rotate: false - xy: 1527, 640 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-power-node-large-large - rotate: false - xy: 1569, 640 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-power-node-large-medium - rotate: false - xy: 1251, 538 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-power-node-large-small - rotate: false - xy: 949, 258 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-power-node-large-tiny - rotate: false - xy: 1923, 178 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-power-node-large-xlarge - rotate: false - xy: 151, 16 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-power-node-medium - rotate: false - xy: 1285, 538 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-power-node-small - rotate: false - xy: 949, 232 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-power-node-tiny - rotate: false - xy: 1105, 173 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-power-node-xlarge - rotate: false - xy: 201, 16 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-power-source-large - rotate: false - xy: 1611, 640 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-power-source-medium - rotate: false - xy: 1319, 538 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-power-source-small - rotate: false - xy: 975, 258 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-power-source-tiny - rotate: false - xy: 1123, 173 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-power-source-xlarge - rotate: false - xy: 251, 666 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-power-void-large - rotate: false - xy: 1653, 640 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-power-void-medium - rotate: false - xy: 1353, 538 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-power-void-small - rotate: false - xy: 975, 232 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-power-void-tiny - rotate: false - xy: 1141, 174 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-power-void-xlarge - rotate: false - xy: 251, 616 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-pulse-conduit-large - rotate: false - xy: 1695, 640 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-pulse-conduit-medium - rotate: false - xy: 1387, 538 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-pulse-conduit-small - rotate: false - xy: 1001, 258 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-pulse-conduit-tiny - rotate: false - xy: 1159, 174 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-pulse-conduit-xlarge - rotate: false - xy: 251, 566 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-pulverizer-large - rotate: false - xy: 1737, 640 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-pulverizer-medium - rotate: false - xy: 1421, 538 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-pulverizer-small - rotate: false - xy: 1001, 232 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-pulverizer-tiny - rotate: false - xy: 1177, 174 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-pulverizer-xlarge - rotate: false - xy: 251, 516 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-pyratite-mixer-large - rotate: false - xy: 1779, 640 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-pyratite-mixer-medium - rotate: false - xy: 1455, 538 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-pyratite-mixer-small - rotate: false - xy: 1027, 254 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-pyratite-mixer-tiny - rotate: false - xy: 1195, 174 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-pyratite-mixer-xlarge - rotate: false - xy: 251, 466 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-repair-point-large - rotate: false - xy: 1821, 640 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-repair-point-medium - rotate: false - xy: 1489, 538 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-repair-point-small - rotate: false - xy: 1053, 254 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-repair-point-tiny - rotate: false - xy: 1213, 174 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-repair-point-xlarge - rotate: false - xy: 251, 416 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-revenant-factory-large - rotate: false - xy: 1863, 640 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-revenant-factory-medium - rotate: false - xy: 1523, 538 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-revenant-factory-small - rotate: false - xy: 1079, 254 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-revenant-factory-tiny - rotate: false - xy: 1231, 174 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-revenant-factory-xlarge - rotate: false - xy: 251, 366 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-ripple-large - rotate: false - xy: 1905, 640 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-ripple-medium - rotate: false - xy: 1557, 538 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-ripple-small - rotate: false - xy: 1105, 254 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-ripple-tiny - rotate: false - xy: 1249, 174 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-ripple-xlarge - rotate: false - xy: 251, 316 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-rock-large - rotate: false - xy: 1947, 640 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-rock-medium - rotate: false - xy: 1591, 538 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-rock-small - rotate: false - xy: 1131, 254 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-rock-tiny - rotate: false - xy: 1267, 174 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-rock-xlarge - rotate: false - xy: 251, 266 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-rocks-large - rotate: false - xy: 1997, 648 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-rocks-medium - rotate: false - xy: 1625, 538 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-rocks-small - rotate: false - xy: 1157, 254 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-rocks-tiny - rotate: false - xy: 1285, 174 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-rocks-xlarge - rotate: false - xy: 251, 216 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-rotary-pump-large - rotate: false - xy: 427, 590 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-rotary-pump-medium - rotate: false - xy: 1659, 538 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-rotary-pump-small - rotate: false - xy: 1183, 254 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-rotary-pump-tiny - rotate: false - xy: 1303, 174 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-rotary-pump-xlarge - rotate: false - xy: 251, 166 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-router-large - rotate: false - xy: 427, 548 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-router-medium - rotate: false - xy: 1693, 538 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-router-small - rotate: false - xy: 1209, 254 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-router-tiny - rotate: false - xy: 1321, 174 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-router-xlarge - rotate: false - xy: 251, 116 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-rtg-generator-large - rotate: false - xy: 427, 506 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-rtg-generator-medium - rotate: false - xy: 1727, 538 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-rtg-generator-small - rotate: false - xy: 1235, 254 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-rtg-generator-tiny - rotate: false - xy: 1339, 174 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-rtg-generator-xlarge - rotate: false - xy: 251, 66 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-salt-large - rotate: false - xy: 427, 464 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-salt-medium - rotate: false - xy: 1761, 538 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-salt-small - rotate: false - xy: 1261, 254 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-salt-tiny - rotate: false - xy: 1357, 174 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-salt-xlarge - rotate: false - xy: 251, 16 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-saltrocks-large - rotate: false - xy: 427, 422 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-saltrocks-medium - rotate: false - xy: 1795, 538 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-saltrocks-small - rotate: false - xy: 1287, 254 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-saltrocks-tiny - rotate: false - xy: 1375, 174 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-saltrocks-xlarge - rotate: false - xy: 309, 924 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-salvo-large - rotate: false - xy: 427, 380 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-salvo-medium - rotate: false - xy: 1829, 538 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-salvo-small - rotate: false - xy: 1313, 254 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-salvo-tiny - rotate: false - xy: 1393, 174 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-salvo-xlarge - rotate: false - xy: 309, 874 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-sand-boulder-large - rotate: false - xy: 427, 338 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-sand-boulder-medium - rotate: false - xy: 1863, 538 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-sand-boulder-small - rotate: false - xy: 1339, 254 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-sand-boulder-tiny - rotate: false - xy: 1411, 174 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-sand-boulder-xlarge - rotate: false - xy: 359, 924 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-sand-large - rotate: false - xy: 427, 296 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-sand-medium - rotate: false - xy: 1897, 538 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-sand-small - rotate: false - xy: 1365, 254 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-sand-tiny - rotate: false - xy: 1429, 174 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-sand-water-large - rotate: false - xy: 427, 254 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-sand-water-medium - rotate: false - xy: 1931, 538 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-sand-water-small - rotate: false - xy: 1391, 254 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-sand-water-tiny - rotate: false - xy: 1447, 174 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-sand-water-xlarge - rotate: false - xy: 309, 824 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-sand-xlarge - rotate: false - xy: 359, 874 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-sandrocks-large - rotate: false - xy: 427, 212 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-sandrocks-medium - rotate: false - xy: 1047, 504 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-sandrocks-small - rotate: false - xy: 1417, 254 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-sandrocks-tiny - rotate: false - xy: 1465, 174 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-sandrocks-xlarge - rotate: false - xy: 409, 924 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-scatter-large - rotate: false - xy: 427, 170 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-scatter-medium - rotate: false - xy: 1081, 504 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-scatter-small - rotate: false - xy: 1443, 254 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-scatter-tiny - rotate: false - xy: 1483, 174 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-scatter-xlarge - rotate: false - xy: 359, 824 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-scorch-large - rotate: false - xy: 427, 128 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-scorch-medium - rotate: false - xy: 1115, 504 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-scorch-small - rotate: false - xy: 1469, 254 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-scorch-tiny - rotate: false - xy: 1501, 174 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-scorch-xlarge - rotate: false - xy: 409, 874 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-scrap-wall-gigantic-large - rotate: false - xy: 427, 86 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-scrap-wall-gigantic-medium - rotate: false - xy: 1149, 504 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-scrap-wall-gigantic-small - rotate: false - xy: 1495, 254 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-scrap-wall-gigantic-tiny - rotate: false - xy: 1519, 174 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-scrap-wall-gigantic-xlarge - rotate: false - xy: 459, 924 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-scrap-wall-huge-large - rotate: false - xy: 427, 44 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-scrap-wall-huge-medium - rotate: false - xy: 1183, 504 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-scrap-wall-huge-small - rotate: false - xy: 1521, 254 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-scrap-wall-huge-tiny - rotate: false - xy: 1537, 174 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-scrap-wall-huge-xlarge - rotate: false - xy: 409, 824 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-scrap-wall-large - rotate: false - xy: 469, 598 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-scrap-wall-large-large - rotate: false - xy: 469, 556 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-scrap-wall-large-medium - rotate: false - xy: 1217, 504 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-scrap-wall-large-small - rotate: false - xy: 1547, 254 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-scrap-wall-large-tiny - rotate: false - xy: 1555, 174 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-scrap-wall-large-xlarge - rotate: false - xy: 459, 874 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-scrap-wall-medium - rotate: false - xy: 1251, 504 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-scrap-wall-small - rotate: false - xy: 1573, 254 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-scrap-wall-tiny - rotate: false - xy: 1573, 174 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-scrap-wall-xlarge - rotate: false - xy: 509, 924 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-separator-large - rotate: false - xy: 511, 598 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-separator-medium - rotate: false - xy: 1285, 504 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-separator-small - rotate: false - xy: 1599, 254 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-separator-tiny - rotate: false - xy: 1591, 174 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-separator-xlarge - rotate: false - xy: 459, 824 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-shale-boulder-large - rotate: false - xy: 469, 514 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-shale-boulder-medium - rotate: false - xy: 1319, 504 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-shale-boulder-small - rotate: false - xy: 1625, 254 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-shale-boulder-tiny - rotate: false - xy: 1609, 174 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-shale-boulder-xlarge - rotate: false - xy: 509, 874 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-shale-large - rotate: false - xy: 511, 556 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-shale-medium - rotate: false - xy: 1353, 504 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-shale-small - rotate: false - xy: 1651, 254 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-shale-tiny - rotate: false - xy: 1627, 174 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-shale-xlarge - rotate: false - xy: 559, 924 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-shalerocks-large - rotate: false - xy: 553, 598 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-shalerocks-medium - rotate: false - xy: 1387, 504 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-shalerocks-small - rotate: false - xy: 1677, 254 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-shalerocks-tiny - rotate: false - xy: 1645, 174 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-shalerocks-xlarge - rotate: false - xy: 509, 824 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-shock-mine-large - rotate: false - xy: 469, 472 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-shock-mine-medium - rotate: false - xy: 1421, 504 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-shock-mine-small - rotate: false - xy: 1703, 254 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-shock-mine-tiny - rotate: false - xy: 1663, 174 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-shock-mine-xlarge - rotate: false - xy: 559, 874 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-shrubs-large - rotate: false - xy: 511, 514 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-shrubs-medium - rotate: false - xy: 1455, 504 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-shrubs-small - rotate: false - xy: 1729, 254 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-shrubs-tiny - rotate: false - xy: 1681, 174 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-shrubs-xlarge - rotate: false - xy: 609, 924 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-silicon-smelter-large - rotate: false - xy: 553, 556 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-silicon-smelter-medium - rotate: false - xy: 1489, 504 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-silicon-smelter-small - rotate: false - xy: 1755, 254 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-silicon-smelter-tiny - rotate: false - xy: 1699, 174 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-silicon-smelter-xlarge - rotate: false - xy: 559, 824 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-snow-large - rotate: false - xy: 595, 598 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-snow-medium - rotate: false - xy: 1523, 504 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-snow-pine-large - rotate: false - xy: 469, 430 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-snow-pine-medium - rotate: false - xy: 1557, 504 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-snow-pine-small - rotate: false - xy: 1027, 228 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-snow-pine-tiny - rotate: false - xy: 1717, 174 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-snow-pine-xlarge - rotate: false - xy: 609, 874 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-snow-small - rotate: false - xy: 1053, 228 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-snow-tiny - rotate: false - xy: 1735, 174 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-snow-xlarge - rotate: false - xy: 659, 924 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-snowrock-large - rotate: false - xy: 511, 472 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-snowrock-medium - rotate: false - xy: 1591, 504 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-snowrock-small - rotate: false - xy: 1079, 228 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-snowrock-tiny - rotate: false - xy: 1753, 174 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-snowrock-xlarge - rotate: false - xy: 609, 824 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-snowrocks-large - rotate: false - xy: 553, 514 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-snowrocks-medium - rotate: false - xy: 1625, 504 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-snowrocks-small - rotate: false - xy: 1105, 228 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-snowrocks-tiny - rotate: false - xy: 2029, 760 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-snowrocks-xlarge - rotate: false - xy: 659, 874 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-solar-panel-large - rotate: false - xy: 595, 556 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-solar-panel-large-large - rotate: false - xy: 637, 598 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-solar-panel-large-medium - rotate: false - xy: 1659, 504 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-solar-panel-large-small - rotate: false - xy: 1131, 228 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-solar-panel-large-tiny - rotate: false - xy: 2029, 742 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-solar-panel-large-xlarge - rotate: false - xy: 709, 924 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-solar-panel-medium - rotate: false - xy: 1693, 504 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-solar-panel-small - rotate: false - xy: 1157, 228 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-solar-panel-tiny - rotate: false - xy: 771, 193 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-solar-panel-xlarge - rotate: false - xy: 659, 824 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-sorter-large - rotate: false - xy: 469, 388 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-sorter-medium - rotate: false - xy: 1727, 504 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-sorter-small - rotate: false - xy: 1183, 228 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-sorter-tiny - rotate: false - xy: 771, 175 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-sorter-xlarge - rotate: false - xy: 709, 874 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-spawn-large - rotate: false - xy: 511, 430 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-spawn-medium - rotate: false - xy: 1761, 504 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-spawn-small - rotate: false - xy: 1209, 228 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-spawn-tiny - rotate: false - xy: 771, 157 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-spawn-xlarge - rotate: false - xy: 759, 924 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-spectre-large - rotate: false - xy: 553, 472 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-spectre-medium - rotate: false - xy: 1795, 504 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-spectre-small - rotate: false - xy: 1235, 228 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-spectre-tiny - rotate: false - xy: 771, 139 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-spectre-xlarge - rotate: false - xy: 709, 824 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-spirit-factory-large - rotate: false - xy: 595, 514 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-spirit-factory-medium - rotate: false - xy: 1829, 504 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-spirit-factory-small - rotate: false - xy: 1261, 228 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-spirit-factory-tiny - rotate: false - xy: 771, 121 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-spirit-factory-xlarge - rotate: false - xy: 759, 874 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-spore-cluster-large - rotate: false - xy: 637, 556 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-spore-cluster-medium - rotate: false - xy: 1863, 504 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-spore-cluster-small - rotate: false - xy: 1287, 228 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-spore-cluster-tiny - rotate: false - xy: 771, 103 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-spore-cluster-xlarge - rotate: false - xy: 809, 924 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-spore-moss-large - rotate: false - xy: 679, 598 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-spore-moss-medium - rotate: false - xy: 1897, 504 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-spore-moss-small - rotate: false - xy: 1313, 228 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-spore-moss-tiny - rotate: false - xy: 789, 188 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-spore-moss-xlarge - rotate: false - xy: 759, 824 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-spore-pine-large - rotate: false - xy: 469, 346 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-spore-pine-medium - rotate: false - xy: 1931, 504 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-spore-pine-small - rotate: false - xy: 1339, 228 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-spore-pine-tiny - rotate: false - xy: 807, 188 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-spore-pine-xlarge - rotate: false - xy: 809, 874 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-spore-press-large - rotate: false - xy: 511, 388 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-spore-press-medium - rotate: false - xy: 1965, 538 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-spore-press-small - rotate: false - xy: 1365, 228 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-spore-press-tiny - rotate: false - xy: 789, 170 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-spore-press-xlarge - rotate: false - xy: 859, 924 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-sporerocks-large - rotate: false - xy: 553, 430 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-sporerocks-medium - rotate: false - xy: 1965, 504 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-sporerocks-small - rotate: false - xy: 1391, 228 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-sporerocks-tiny - rotate: false - xy: 825, 188 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-sporerocks-xlarge - rotate: false - xy: 809, 824 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-stone-large - rotate: false - xy: 595, 472 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-stone-medium - rotate: false - xy: 1043, 470 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-stone-small - rotate: false - xy: 1417, 228 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-stone-tiny - rotate: false - xy: 789, 152 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-stone-xlarge - rotate: false - xy: 859, 874 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-surge-tower-large - rotate: false - xy: 637, 514 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-surge-tower-medium - rotate: false - xy: 1077, 470 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-surge-tower-small - rotate: false - xy: 1443, 228 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-surge-tower-tiny - rotate: false - xy: 807, 170 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-surge-tower-xlarge - rotate: false - xy: 909, 924 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-surge-wall-large - rotate: false - xy: 679, 556 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-surge-wall-large-large - rotate: false - xy: 721, 598 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-surge-wall-large-medium - rotate: false - xy: 1111, 470 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-surge-wall-large-small - rotate: false - xy: 1469, 228 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-surge-wall-large-tiny - rotate: false - xy: 843, 188 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-surge-wall-large-xlarge - rotate: false - xy: 859, 824 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-surge-wall-medium - rotate: false - xy: 1145, 470 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-surge-wall-small - rotate: false - xy: 1495, 228 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-surge-wall-tiny - rotate: false - xy: 789, 134 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-surge-wall-xlarge - rotate: false - xy: 909, 874 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-swarmer-large - rotate: false - xy: 469, 304 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-swarmer-medium - rotate: false - xy: 1179, 470 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-swarmer-small - rotate: false - xy: 1521, 228 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-swarmer-tiny - rotate: false - xy: 807, 152 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-swarmer-xlarge - rotate: false - xy: 959, 924 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-tainted-water-large - rotate: false - xy: 511, 346 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-tainted-water-medium - rotate: false - xy: 1213, 470 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-tainted-water-small - rotate: false - xy: 1547, 228 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-tainted-water-tiny - rotate: false - xy: 825, 170 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-tainted-water-xlarge - rotate: false - xy: 909, 824 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-tar-large - rotate: false - xy: 553, 388 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-tar-medium - rotate: false - xy: 1247, 470 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-tar-small - rotate: false - xy: 1573, 228 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-tar-tiny - rotate: false - xy: 861, 188 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-tar-xlarge - rotate: false - xy: 959, 874 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-tau-mech-pad-large - rotate: false - xy: 595, 430 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-tau-mech-pad-medium - rotate: false - xy: 1281, 470 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-tau-mech-pad-small - rotate: false - xy: 1599, 228 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-tau-mech-pad-tiny - rotate: false - xy: 789, 116 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-tau-mech-pad-xlarge - rotate: false - xy: 1009, 924 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-tendrils-large - rotate: false - xy: 637, 472 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-tendrils-medium - rotate: false - xy: 1315, 470 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-tendrils-small - rotate: false - xy: 1625, 228 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-tendrils-tiny - rotate: false - xy: 807, 134 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-tendrils-xlarge - rotate: false - xy: 959, 824 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-thermal-generator-large - rotate: false - xy: 679, 514 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-thermal-generator-medium - rotate: false - xy: 1349, 470 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-thermal-generator-small - rotate: false - xy: 1651, 228 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-thermal-generator-tiny - rotate: false - xy: 825, 152 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-thermal-generator-xlarge - rotate: false - xy: 1009, 874 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-thermal-pump-large - rotate: false - xy: 721, 556 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-thermal-pump-medium - rotate: false - xy: 1383, 470 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-thermal-pump-small - rotate: false - xy: 1677, 228 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-thermal-pump-tiny - rotate: false - xy: 843, 170 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-thermal-pump-xlarge - rotate: false - xy: 1059, 924 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-thorium-reactor-large - rotate: false - xy: 763, 598 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-thorium-reactor-medium - rotate: false - xy: 1417, 470 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-thorium-reactor-small - rotate: false - xy: 1703, 228 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-thorium-reactor-tiny - rotate: false - xy: 879, 188 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-thorium-reactor-xlarge - rotate: false - xy: 1009, 824 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-thorium-wall-large - rotate: false - xy: 469, 262 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-thorium-wall-large-large - rotate: false - xy: 511, 304 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-thorium-wall-large-medium - rotate: false - xy: 1451, 470 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-thorium-wall-large-small - rotate: false - xy: 1729, 228 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-thorium-wall-large-tiny - rotate: false - xy: 807, 116 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-thorium-wall-large-xlarge - rotate: false - xy: 1059, 874 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-thorium-wall-medium - rotate: false - xy: 1485, 470 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-thorium-wall-small - rotate: false - xy: 1755, 228 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-thorium-wall-tiny - rotate: false - xy: 825, 134 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-thorium-wall-xlarge - rotate: false - xy: 1109, 924 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-thruster-large - rotate: false - xy: 553, 346 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-thruster-medium - rotate: false - xy: 1519, 470 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-thruster-small - rotate: false - xy: 1781, 234 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-thruster-tiny - rotate: false - xy: 843, 152 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-thruster-xlarge - rotate: false - xy: 1059, 824 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-titan-factory-large - rotate: false - xy: 595, 388 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-titan-factory-medium - rotate: false - xy: 1553, 470 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-titan-factory-small - rotate: false - xy: 1807, 232 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-titan-factory-tiny - rotate: false - xy: 861, 170 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-titan-factory-xlarge - rotate: false - xy: 1109, 874 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-titanium-conveyor-large - rotate: false - xy: 637, 430 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-titanium-conveyor-medium - rotate: false - xy: 1587, 470 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-titanium-conveyor-small - rotate: false - xy: 1833, 232 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-titanium-conveyor-tiny - rotate: false - xy: 897, 188 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-titanium-conveyor-xlarge - rotate: false - xy: 1159, 924 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-titanium-wall-large - rotate: false - xy: 679, 472 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-titanium-wall-large-large - rotate: false - xy: 721, 514 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-titanium-wall-large-medium - rotate: false - xy: 1621, 470 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-titanium-wall-large-small - rotate: false - xy: 1859, 232 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-titanium-wall-large-tiny - rotate: false - xy: 825, 116 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-titanium-wall-large-xlarge - rotate: false - xy: 1109, 824 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-titanium-wall-medium - rotate: false - xy: 1655, 470 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-titanium-wall-small - rotate: false - xy: 1885, 232 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-titanium-wall-tiny - rotate: false - xy: 843, 134 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-titanium-wall-xlarge - rotate: false - xy: 1159, 874 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-trident-ship-pad-large - rotate: false - xy: 763, 556 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-trident-ship-pad-medium - rotate: false - xy: 1689, 470 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-trident-ship-pad-small - rotate: false - xy: 1911, 232 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-trident-ship-pad-tiny - rotate: false - xy: 861, 152 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-trident-ship-pad-xlarge - rotate: false - xy: 1209, 924 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-turbine-generator-large - rotate: false - xy: 805, 598 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-turbine-generator-medium - rotate: false - xy: 1723, 470 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-turbine-generator-small - rotate: false - xy: 793, 206 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-turbine-generator-tiny - rotate: false - xy: 879, 170 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-turbine-generator-xlarge - rotate: false - xy: 1159, 824 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-unloader-large - rotate: false - xy: 469, 220 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-unloader-medium - rotate: false - xy: 1757, 470 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-unloader-small - rotate: false - xy: 819, 206 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-unloader-tiny - rotate: false - xy: 915, 188 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-unloader-xlarge - rotate: false - xy: 1209, 874 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-vault-large - rotate: false - xy: 511, 262 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-vault-medium - rotate: false - xy: 1791, 470 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-vault-small - rotate: false - xy: 845, 206 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-vault-tiny - rotate: false - xy: 843, 116 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-vault-xlarge - rotate: false - xy: 1259, 924 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-water-extractor-large - rotate: false - xy: 553, 304 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-water-extractor-medium - rotate: false - xy: 1825, 470 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-water-extractor-small - rotate: false - xy: 871, 206 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-water-extractor-tiny - rotate: false - xy: 861, 134 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-water-extractor-xlarge - rotate: false - xy: 1209, 824 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-water-large - rotate: false - xy: 595, 346 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-water-medium - rotate: false - xy: 1859, 470 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-water-small - rotate: false - xy: 897, 206 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-water-tiny - rotate: false - xy: 879, 152 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-water-xlarge - rotate: false - xy: 1259, 874 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-wave-large - rotate: false - xy: 637, 388 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-wave-medium - rotate: false - xy: 1893, 470 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-wave-small - rotate: false - xy: 923, 206 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-wave-tiny - rotate: false - xy: 897, 170 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-wave-xlarge - rotate: false - xy: 1309, 924 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-white-tree-dead-large - rotate: false - xy: 679, 430 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-white-tree-dead-medium - rotate: false - xy: 1927, 470 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-white-tree-dead-small - rotate: false - xy: 949, 206 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-white-tree-dead-tiny - rotate: false - xy: 933, 188 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-white-tree-dead-xlarge - rotate: false - xy: 1259, 824 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-white-tree-large - rotate: false - xy: 721, 472 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-white-tree-medium - rotate: false - xy: 1961, 470 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-white-tree-small - rotate: false - xy: 975, 206 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-white-tree-tiny - rotate: false - xy: 861, 116 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-white-tree-xlarge - rotate: false - xy: 1309, 874 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-wraith-factory-large - rotate: false - xy: 763, 514 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-wraith-factory-medium - rotate: false - xy: 1999, 546 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-wraith-factory-small - rotate: false - xy: 1001, 206 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-wraith-factory-tiny - rotate: false - xy: 879, 134 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-wraith-factory-xlarge - rotate: false - xy: 1359, 924 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -button - rotate: false - xy: 923, 611 - size: 36, 27 - split: 12, 12, 12, 12 - orig: 36, 27 - offset: 0, 0 - index: -1 -button-disabled - rotate: false - xy: 847, 611 - size: 36, 27 - split: 12, 12, 12, 12 - orig: 36, 27 - offset: 0, 0 - index: -1 -button-down - rotate: false - xy: 469, 191 - size: 36, 27 - split: 12, 12, 12, 12 - orig: 36, 27 - offset: 0, 0 - index: -1 -button-edge-1 - rotate: false - xy: 511, 233 - size: 36, 27 - split: 12, 12, 12, 12 - orig: 36, 27 - offset: 0, 0 - index: -1 -button-edge-2 - rotate: false - xy: 553, 275 - size: 36, 27 - split: 12, 12, 12, 12 - orig: 36, 27 - offset: 0, 0 - index: -1 -button-edge-3 - rotate: false - xy: 595, 317 - size: 36, 27 - split: 12, 12, 12, 12 - orig: 36, 27 - offset: 0, 0 - index: -1 -button-edge-4 - rotate: false - xy: 637, 359 - size: 36, 27 - split: 12, 12, 12, 12 - orig: 36, 27 - offset: 0, 0 - index: -1 -button-edge-over-4 - rotate: false - xy: 679, 401 - size: 36, 27 - split: 12, 12, 12, 12 - orig: 36, 27 - offset: 0, 0 - index: -1 -button-over - rotate: false - xy: 721, 443 - size: 36, 27 - split: 12, 12, 12, 12 - orig: 36, 27 - offset: 0, 0 - index: -1 -button-red - rotate: false - xy: 763, 485 - size: 36, 27 - split: 12, 12, 12, 12 - orig: 36, 27 - offset: 0, 0 - index: -1 -button-right - rotate: false - xy: 885, 611 - size: 36, 27 - split: 12, 12, 12, 12 - orig: 36, 27 - offset: 0, 0 - index: -1 -button-right-down - rotate: false - xy: 805, 543 - size: 36, 27 - split: 12, 12, 12, 12 - orig: 36, 27 - offset: 0, 0 - index: -1 -button-right-over - rotate: false - xy: 847, 582 - size: 36, 27 - split: 12, 12, 12, 12 - orig: 36, 27 - offset: 0, 0 - index: -1 -button-select - rotate: false - xy: 1027, 202 - size: 24, 24 - split: 4, 4, 4, 4 - orig: 24, 24 - offset: 0, 0 - index: -1 -button-square - rotate: false - xy: 801, 485 - size: 36, 27 - split: 12, 12, 12, 12 - orig: 36, 27 - offset: 0, 0 - index: -1 -button-square-down - rotate: false - xy: 469, 162 - size: 36, 27 - split: 12, 12, 12, 12 - orig: 36, 27 - offset: 0, 0 - index: -1 -button-square-over - rotate: false - xy: 805, 514 - size: 36, 27 - split: 12, 12, 12, 12 - orig: 36, 27 - offset: 0, 0 - index: -1 -button-trans - rotate: false - xy: 885, 582 - size: 36, 27 - split: 12, 12, 12, 12 - orig: 36, 27 - offset: 0, 0 - index: -1 -check-disabled - rotate: false - xy: 1999, 512 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -check-off - rotate: false - xy: 1035, 436 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -check-on - rotate: false - xy: 1069, 436 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -check-on-disabled - rotate: false - xy: 1103, 436 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -check-on-over - rotate: false - xy: 1137, 436 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -check-over - rotate: false - xy: 1171, 436 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -clear - rotate: false - xy: 1041, 190 - size: 10, 10 - orig: 10, 10 - offset: 0, 0 - index: -1 -cursor - rotate: false - xy: 1823, 364 - size: 4, 4 - orig: 4, 4 - offset: 0, 0 - index: -1 -discord-banner - rotate: false - xy: 1, 719 - size: 84, 45 - orig: 84, 45 - offset: 0, 0 - index: -1 -flat-down-base - rotate: false - xy: 469, 133 - size: 36, 27 - split: 12, 12, 12, 12 - orig: 36, 27 - offset: 0, 0 - index: -1 -icon-about - rotate: false - xy: 1309, 824 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-about-small - rotate: false - xy: 1205, 436 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-about-smaller - rotate: false - xy: 2017, 404 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-about-tiny - rotate: false - xy: 897, 152 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-add - rotate: false - xy: 1359, 874 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-add-small - rotate: false - xy: 1239, 436 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-add-smaller - rotate: false - xy: 437, 12 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-add-tiny - rotate: false - xy: 915, 170 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-admin - rotate: false - xy: 1409, 924 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-admin-badge - rotate: false - xy: 1359, 824 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-admin-badge-small - rotate: false - xy: 1273, 436 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-admin-badge-smaller - rotate: false - xy: 2017, 372 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-admin-badge-tiny - rotate: false - xy: 951, 188 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-admin-small - rotate: false - xy: 1307, 436 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-admin-smaller - rotate: false - xy: 711, 47 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-admin-tiny - rotate: false - xy: 879, 116 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-arrow - rotate: false - xy: 1409, 874 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-arrow-16 - rotate: false - xy: 1409, 874 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-arrow-16-small - rotate: false - xy: 1341, 436 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-arrow-small - rotate: false - xy: 1341, 436 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-arrow-16-smaller - rotate: false - xy: 711, 15 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-arrow-smaller - rotate: false - xy: 711, 15 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-arrow-16-tiny - rotate: false - xy: 897, 134 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-arrow-tiny - rotate: false - xy: 897, 134 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-arrow-down - rotate: false - xy: 1459, 924 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-arrow-down-small - rotate: false - xy: 1375, 436 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-arrow-down-smaller - rotate: false - xy: 469, 9 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-arrow-down-tiny - rotate: false - xy: 915, 152 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-arrow-left - rotate: false - xy: 1409, 824 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-arrow-left-small - rotate: false - xy: 1409, 436 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-arrow-left-smaller - rotate: false - xy: 755, 385 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-arrow-left-tiny - rotate: false - xy: 933, 170 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-arrow-right - rotate: false - xy: 1459, 874 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-arrow-right-small - rotate: false - xy: 1443, 436 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-arrow-right-smaller - rotate: false - xy: 787, 385 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-arrow-right-tiny - rotate: false - xy: 969, 188 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-arrow-up - rotate: false - xy: 1509, 924 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-arrow-up-small - rotate: false - xy: 1477, 436 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-arrow-up-smaller - rotate: false - xy: 819, 380 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-arrow-up-tiny - rotate: false - xy: 897, 116 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-back - rotate: false - xy: 1459, 824 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-back-small - rotate: false - xy: 1511, 436 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-back-smaller - rotate: false - xy: 851, 380 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-back-tiny - rotate: false - xy: 915, 134 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-ban - rotate: false - xy: 1509, 874 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-ban-small - rotate: false - xy: 1545, 436 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-ban-smaller - rotate: false - xy: 883, 380 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-ban-tiny - rotate: false - xy: 933, 152 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-break - rotate: false - xy: 1559, 924 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-break-small - rotate: false - xy: 1579, 436 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-break-smaller - rotate: false - xy: 915, 380 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-break-tiny - rotate: false - xy: 951, 170 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-cancel - rotate: false - xy: 1509, 824 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-cancel-small - rotate: false - xy: 1613, 436 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-cancel-smaller - rotate: false - xy: 947, 380 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-cancel-tiny - rotate: false - xy: 987, 188 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-quit-tiny - rotate: false - xy: 987, 188 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-changelog - rotate: false - xy: 1559, 874 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-changelog-small - rotate: false - xy: 1647, 436 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-changelog-smaller - rotate: false - xy: 979, 380 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-changelog-tiny - rotate: false - xy: 915, 116 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-chat - rotate: false - xy: 1609, 924 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-chat-small - rotate: false - xy: 1681, 436 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-chat-smaller - rotate: false - xy: 773, 353 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-chat-tiny - rotate: false - xy: 933, 134 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-check - rotate: false - xy: 1559, 824 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-check-small - rotate: false - xy: 1715, 436 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-check-smaller - rotate: false - xy: 773, 321 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-check-tiny - rotate: false - xy: 951, 152 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-command-attack - rotate: false - xy: 1609, 874 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-command-attack-small - rotate: false - xy: 1749, 436 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-command-attack-smaller - rotate: false - xy: 773, 289 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-command-attack-tiny - rotate: false - xy: 969, 170 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-command-patrol - rotate: false - xy: 1659, 924 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-command-patrol-small - rotate: false - xy: 1783, 436 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-command-patrol-smaller - rotate: false - xy: 805, 348 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-command-patrol-tiny - rotate: false - xy: 1005, 188 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-command-rally - rotate: false - xy: 1609, 824 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-command-rally-small - rotate: false - xy: 1817, 436 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-command-rally-smaller - rotate: false - xy: 805, 316 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-command-rally-tiny - rotate: false - xy: 933, 116 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-command-retreat - rotate: false - xy: 1659, 874 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-command-retreat-small - rotate: false - xy: 1851, 436 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-command-retreat-smaller - rotate: false - xy: 837, 348 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-command-retreat-tiny - rotate: false - xy: 951, 134 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-copy - rotate: false - xy: 1709, 924 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-copy-small - rotate: false - xy: 1885, 436 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-copy-smaller - rotate: false - xy: 837, 316 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-copy-tiny - rotate: false - xy: 969, 152 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-crafting - rotate: false - xy: 1659, 824 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-crafting-small - rotate: false - xy: 1919, 436 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-crafting-smaller - rotate: false - xy: 869, 348 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-crafting-tiny - rotate: false - xy: 987, 170 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-cursor - rotate: false - xy: 1709, 874 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-cursor-small - rotate: false - xy: 1953, 436 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-cursor-smaller - rotate: false - xy: 869, 316 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-cursor-tiny - rotate: false - xy: 951, 116 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-database - rotate: false - xy: 1759, 924 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-database-small - rotate: false - xy: 1999, 478 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-database-smaller - rotate: false - xy: 901, 348 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-database-tiny - rotate: false - xy: 969, 134 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-defense - rotate: false - xy: 1709, 824 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-defense-small - rotate: false - xy: 1987, 436 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-defense-smaller - rotate: false - xy: 901, 316 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-defense-tiny - rotate: false - xy: 987, 152 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-dev-builds - rotate: false - xy: 1759, 874 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-dev-builds-small - rotate: false - xy: 545, 199 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-dev-builds-smaller - rotate: false - xy: 933, 348 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-dev-builds-tiny - rotate: false - xy: 1005, 170 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-diagonal - rotate: false - xy: 1809, 924 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-diagonal-small - rotate: false - xy: 541, 165 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-diagonal-smaller - rotate: false - xy: 933, 316 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-diagonal-tiny - rotate: false - xy: 969, 116 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-discord - rotate: false - xy: 1759, 824 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-discord-small - rotate: false - xy: 541, 131 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-discord-smaller - rotate: false - xy: 965, 348 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-discord-tiny - rotate: false - xy: 987, 134 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-distribution - rotate: false - xy: 1809, 874 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-distribution-small - rotate: false - xy: 541, 97 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-distribution-smaller - rotate: false - xy: 965, 316 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-distribution-tiny - rotate: false - xy: 1005, 152 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-donate - rotate: false - xy: 1859, 924 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-donate-small - rotate: false - xy: 541, 63 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-donate-smaller - rotate: false - xy: 805, 284 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-donate-tiny - rotate: false - xy: 987, 116 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-dots - rotate: false - xy: 1809, 824 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-dots-small - rotate: false - xy: 537, 29 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-dots-smaller - rotate: false - xy: 837, 284 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-dots-tiny - rotate: false - xy: 1005, 134 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-editor - rotate: false - xy: 1859, 874 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-editor-small - rotate: false - xy: 587, 241 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-editor-smaller - rotate: false - xy: 869, 284 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-editor-tiny - rotate: false - xy: 1005, 116 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-effect - rotate: false - xy: 1909, 924 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-effect-small - rotate: false - xy: 579, 207 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-effect-smaller - rotate: false - xy: 901, 284 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-effect-tiny - rotate: false - xy: 1023, 184 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-elevation - rotate: false - xy: 1859, 824 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-elevation-small - rotate: false - xy: 579, 173 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-elevation-smaller - rotate: false - xy: 933, 284 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-elevation-tiny - rotate: false - xy: 1023, 166 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-eraser - rotate: false - xy: 1909, 874 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-eraser-small - rotate: false - xy: 575, 139 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-eraser-smaller - rotate: false - xy: 965, 284 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-eraser-tiny - rotate: false - xy: 1023, 148 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-exit - rotate: false - xy: 1959, 924 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-exit-small - rotate: false - xy: 575, 105 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-exit-smaller - rotate: false - xy: 997, 348 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-exit-tiny - rotate: false - xy: 1023, 130 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-fdroid - rotate: false - xy: 1909, 824 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-fdroid-small - rotate: false - xy: 575, 71 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-fdroid-smaller - rotate: false - xy: 997, 316 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-fdroid-tiny - rotate: false - xy: 1023, 112 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-file - rotate: false - xy: 1959, 874 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-file-image - rotate: false - xy: 1959, 824 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-file-image-small - rotate: false - xy: 613, 207 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-file-image-smaller - rotate: false - xy: 997, 284 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-file-image-tiny - rotate: false - xy: 789, 98 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-file-small - rotate: false - xy: 613, 173 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-file-smaller - rotate: false - xy: 1029, 370 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-file-text - rotate: false - xy: 309, 774 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-file-text-small - rotate: false - xy: 609, 139 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-file-text-smaller - rotate: false - xy: 1061, 370 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-file-text-tiny - rotate: false - xy: 807, 98 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-file-tiny - rotate: false - xy: 825, 98 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-fill - rotate: false - xy: 359, 774 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-fill-small - rotate: false - xy: 609, 105 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-fill-smaller - rotate: false - xy: 1029, 338 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-fill-tiny - rotate: false - xy: 843, 98 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-floppy - rotate: false - xy: 409, 774 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-floppy-16 - rotate: false - xy: 459, 774 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-floppy-16-small - rotate: false - xy: 609, 71 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-floppy-16-smaller - rotate: false - xy: 1093, 370 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-floppy-16-tiny - rotate: false - xy: 861, 98 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-floppy-small - rotate: false - xy: 575, 37 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-floppy-smaller - rotate: false - xy: 1029, 306 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-floppy-tiny - rotate: false - xy: 879, 98 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-folder - rotate: false - xy: 509, 774 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-folder-parent - rotate: false - xy: 559, 774 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-folder-parent-small - rotate: false - xy: 609, 37 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-folder-parent-smaller - rotate: false - xy: 1061, 338 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-folder-parent-tiny - rotate: false - xy: 897, 98 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-folder-small - rotate: false - xy: 671, 325 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-folder-smaller - rotate: false - xy: 1125, 370 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-folder-tiny - rotate: false - xy: 915, 98 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-github - rotate: false - xy: 609, 774 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-github-small - rotate: false - xy: 713, 367 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-github-smaller - rotate: false - xy: 1061, 306 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-github-tiny - rotate: false - xy: 933, 98 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-google-play - rotate: false - xy: 659, 774 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-google-play-small - rotate: false - xy: 705, 333 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-google-play-smaller - rotate: false - xy: 1093, 338 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-google-play-tiny - rotate: false - xy: 951, 98 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-grid - rotate: false - xy: 709, 774 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-grid-small - rotate: false - xy: 705, 299 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-grid-smaller - rotate: false - xy: 1157, 370 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-grid-tiny - rotate: false - xy: 969, 98 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-home - rotate: false - xy: 759, 774 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-home-small - rotate: false - xy: 739, 333 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-home-smaller - rotate: false - xy: 1093, 306 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-home-tiny - rotate: false - xy: 987, 98 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-host - rotate: false - xy: 809, 774 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-host-small - rotate: false - xy: 739, 299 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-host-smaller - rotate: false - xy: 1125, 338 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-host-tiny - rotate: false - xy: 1005, 98 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-info - rotate: false - xy: 859, 774 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-info-small - rotate: false - xy: 643, 139 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-info-smaller - rotate: false - xy: 1189, 370 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-info-tiny - rotate: false - xy: 771, 85 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-itch.io - rotate: false - xy: 909, 774 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-itch.io-small - rotate: false - xy: 643, 105 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-itch.io-smaller - rotate: false - xy: 1125, 306 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-itch.io-tiny - rotate: false - xy: 1023, 94 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-item - rotate: false - xy: 959, 774 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-item-small - rotate: false - xy: 643, 71 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-item-smaller - rotate: false - xy: 1157, 338 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-item-tiny - rotate: false - xy: 789, 80 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-line - rotate: false - xy: 1009, 774 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-line-small - rotate: false - xy: 643, 37 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-line-smaller - rotate: false - xy: 1221, 370 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-line-tiny - rotate: false - xy: 807, 80 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-link - rotate: false - xy: 1059, 774 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-link-small - rotate: false - xy: 571, 3 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-link-smaller - rotate: false - xy: 1157, 306 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-link-tiny - rotate: false - xy: 825, 80 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-liquid - rotate: false - xy: 1109, 774 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-liquid-consume - rotate: false - xy: 1159, 774 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-liquid-consume-small - rotate: false - xy: 605, 3 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-liquid-consume-smaller - rotate: false - xy: 1189, 338 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-liquid-consume-tiny - rotate: false - xy: 843, 80 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-liquid-small - rotate: false - xy: 639, 3 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-liquid-smaller - rotate: false - xy: 1253, 370 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-liquid-tiny - rotate: false - xy: 861, 80 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-load - rotate: false - xy: 1209, 774 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-load-image - rotate: false - xy: 1259, 774 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-load-image-small - rotate: false - xy: 629, 283 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-load-image-smaller - rotate: false - xy: 1189, 306 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-load-image-tiny - rotate: false - xy: 879, 80 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-load-map - rotate: false - xy: 1309, 774 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-load-map-small - rotate: false - xy: 621, 249 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-load-map-smaller - rotate: false - xy: 1221, 338 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-load-map-tiny - rotate: false - xy: 897, 80 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-load-small - rotate: false - xy: 663, 291 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-load-smaller - rotate: false - xy: 1285, 370 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-load-tiny - rotate: false - xy: 915, 80 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-loading - rotate: false - xy: 1359, 774 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-loading-small - rotate: false - xy: 655, 249 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-loading-smaller - rotate: false - xy: 1221, 306 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-loading-tiny - rotate: false - xy: 933, 80 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-locked - rotate: false - xy: 1409, 774 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-locked-small - rotate: false - xy: 647, 215 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-locked-smaller - rotate: false - xy: 1253, 338 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-locked-tiny - rotate: false - xy: 951, 80 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-map - rotate: false - xy: 1459, 774 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-map-small - rotate: false - xy: 647, 181 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-map-smaller - rotate: false - xy: 1317, 370 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-map-tiny - rotate: false - xy: 969, 80 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-menu - rotate: false - xy: 1509, 774 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-menu-large - rotate: false - xy: 1559, 774 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-menu-large-small - rotate: false - xy: 681, 215 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-menu-large-smaller - rotate: false - xy: 1253, 306 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-menu-large-tiny - rotate: false - xy: 987, 80 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-menu-small - rotate: false - xy: 681, 181 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-menu-smaller - rotate: false - xy: 1285, 338 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-menu-tiny - rotate: false - xy: 1005, 80 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-missing - rotate: false - xy: 1609, 774 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-missing-small - rotate: false - xy: 677, 147 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-missing-smaller - rotate: false - xy: 1349, 370 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-missing-tiny - rotate: false - xy: 1023, 76 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-mode-attack - rotate: false - xy: 1659, 774 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-mode-attack-small - rotate: false - xy: 677, 113 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-mode-attack-smaller - rotate: false - xy: 1285, 306 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-mode-attack-tiny - rotate: false - xy: 769, 67 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-mode-pvp - rotate: false - xy: 1709, 774 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-mode-pvp-small - rotate: false - xy: 677, 79 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-mode-pvp-smaller - rotate: false - xy: 1317, 338 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-mode-pvp-tiny - rotate: false - xy: 769, 49 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-mode-survival - rotate: false - xy: 1759, 774 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-mode-survival-small - rotate: false - xy: 677, 45 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-mode-survival-smaller - rotate: false - xy: 1381, 370 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-mode-survival-tiny - rotate: false - xy: 769, 31 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-none - rotate: false - xy: 1809, 774 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-none-small - rotate: false - xy: 677, 11 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-none-smaller - rotate: false - xy: 1317, 306 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-none-tiny - rotate: false - xy: 769, 13 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-paste - rotate: false - xy: 1859, 774 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-paste-small - rotate: false - xy: 759, 417 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-paste-smaller - rotate: false - xy: 1349, 338 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-paste-tiny - rotate: false - xy: 787, 62 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-pause - rotate: false - xy: 1909, 774 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-pause-small - rotate: false - xy: 793, 417 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-pause-smaller - rotate: false - xy: 1413, 370 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-pause-tiny - rotate: false - xy: 787, 44 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-pencil - rotate: false - xy: 1959, 774 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-pencil-small - rotate: false - xy: 827, 412 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-pencil-smaller - rotate: false - xy: 1349, 306 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-pencil-tiny - rotate: false - xy: 805, 62 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-pick - rotate: false - xy: 287, 724 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-pick-small - rotate: false - xy: 861, 412 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-pick-smaller - rotate: false - xy: 1381, 338 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-pick-tiny - rotate: false - xy: 787, 26 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-play - rotate: false - xy: 337, 724 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-play-2 - rotate: false - xy: 387, 724 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-play-2-small - rotate: false - xy: 895, 412 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-play-2-smaller - rotate: false - xy: 1445, 370 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-play-2-tiny - rotate: false - xy: 805, 44 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-play-tiny - rotate: false - xy: 805, 44 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-play-custom - rotate: false - xy: 437, 724 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-play-custom-small - rotate: false - xy: 929, 412 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-play-custom-smaller - rotate: false - xy: 1381, 306 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-play-custom-tiny - rotate: false - xy: 823, 62 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-play-small - rotate: false - xy: 963, 412 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-play-smaller - rotate: false - xy: 1413, 338 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-players - rotate: false - xy: 487, 724 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-players-small - rotate: false - xy: 997, 412 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-players-smaller - rotate: false - xy: 1477, 370 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-players-tiny - rotate: false - xy: 805, 26 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-power - rotate: false - xy: 537, 724 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-power-small - rotate: false - xy: 1031, 402 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-power-smaller - rotate: false - xy: 1413, 306 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-power-tiny - rotate: false - xy: 823, 44 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-production - rotate: false - xy: 587, 724 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-production-small - rotate: false - xy: 1065, 402 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-production-smaller - rotate: false - xy: 1445, 338 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-production-tiny - rotate: false - xy: 841, 62 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-quit - rotate: false - xy: 637, 724 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-quit-small - rotate: false - xy: 1099, 402 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-quit-smaller - rotate: false - xy: 1509, 370 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-reddit - rotate: false - xy: 687, 724 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-reddit-small - rotate: false - xy: 1133, 402 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-reddit-smaller - rotate: false - xy: 1445, 306 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-reddit-tiny - rotate: false - xy: 823, 26 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-redo - rotate: false - xy: 737, 724 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-redo-small - rotate: false - xy: 1167, 402 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-redo-smaller - rotate: false - xy: 1477, 338 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-redo-tiny - rotate: false - xy: 841, 44 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-refresh - rotate: false - xy: 787, 724 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-refresh-small - rotate: false - xy: 1201, 402 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-refresh-smaller - rotate: false - xy: 1541, 370 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-refresh-tiny - rotate: false - xy: 859, 62 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-rename - rotate: false - xy: 837, 724 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-rename-small - rotate: false - xy: 1235, 402 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-rename-smaller - rotate: false - xy: 1477, 306 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-rename-tiny - rotate: false - xy: 841, 26 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-resize - rotate: false - xy: 887, 724 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-resize-small - rotate: false - xy: 1269, 402 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-resize-smaller - rotate: false - xy: 1509, 338 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-resize-tiny - rotate: false - xy: 859, 44 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-rotate - rotate: false - xy: 937, 724 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-rotate-arrow - rotate: false - xy: 987, 724 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-rotate-arrow-small - rotate: false - xy: 1303, 402 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-rotate-arrow-smaller - rotate: false - xy: 1573, 370 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-rotate-arrow-tiny - rotate: false - xy: 877, 62 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-rotate-left - rotate: false - xy: 1037, 724 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-rotate-left-small - rotate: false - xy: 1337, 402 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-rotate-left-smaller - rotate: false - xy: 1509, 306 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-rotate-left-tiny - rotate: false - xy: 859, 26 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-rotate-right - rotate: false - xy: 1087, 724 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-rotate-right-small - rotate: false - xy: 1371, 402 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-rotate-right-smaller - rotate: false - xy: 1541, 338 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-rotate-right-tiny - rotate: false - xy: 877, 44 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-rotate-small - rotate: false - xy: 1405, 402 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-rotate-smaller - rotate: false - xy: 1605, 370 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-rotate-tiny - rotate: false - xy: 895, 62 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-save - rotate: false - xy: 1137, 724 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-save-image - rotate: false - xy: 1187, 724 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-save-image-small - rotate: false - xy: 1439, 402 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-save-image-smaller - rotate: false - xy: 1541, 306 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-save-image-tiny - rotate: false - xy: 877, 26 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-save-map - rotate: false - xy: 1237, 724 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-save-map-small - rotate: false - xy: 1473, 402 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-save-map-smaller - rotate: false - xy: 1573, 338 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-save-map-tiny - rotate: false - xy: 895, 44 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-save-small - rotate: false - xy: 1507, 402 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-save-smaller - rotate: false - xy: 1637, 370 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-save-tiny - rotate: false - xy: 913, 62 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-settings - rotate: false - xy: 1287, 724 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-settings-small - rotate: false - xy: 1541, 402 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-settings-smaller - rotate: false - xy: 1573, 306 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-settings-tiny - rotate: false - xy: 895, 26 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-spray - rotate: false - xy: 1337, 724 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-spray-small - rotate: false - xy: 1575, 402 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-spray-smaller - rotate: false - xy: 1605, 338 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-spray-tiny - rotate: false - xy: 913, 44 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-terrain - rotate: false - xy: 1387, 724 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-terrain-small - rotate: false - xy: 1609, 402 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-terrain-smaller - rotate: false - xy: 1669, 370 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-terrain-tiny - rotate: false - xy: 931, 62 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-tools - rotate: false - xy: 1437, 724 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-tools-small - rotate: false - xy: 1643, 402 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-tools-smaller - rotate: false - xy: 1605, 306 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-tools-tiny - rotate: false - xy: 913, 26 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-trash - rotate: false - xy: 1487, 724 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-trash-16 - rotate: false - xy: 1537, 724 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-trash-16-small - rotate: false - xy: 1677, 402 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-trash-16-smaller - rotate: false - xy: 1637, 338 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-trash-16-tiny - rotate: false - xy: 931, 44 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-trash-small - rotate: false - xy: 1711, 402 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-trash-smaller - rotate: false - xy: 1701, 370 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-trash-tiny - rotate: false - xy: 949, 62 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-tree - rotate: false - xy: 1587, 724 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-tree-small - rotate: false - xy: 1745, 402 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-tree-smaller - rotate: false - xy: 1637, 306 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-tree-tiny - rotate: false - xy: 931, 26 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-trello - rotate: false - xy: 1637, 724 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-trello-small - rotate: false - xy: 1779, 402 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-trello-smaller - rotate: false - xy: 1669, 338 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-trello-tiny - rotate: false - xy: 949, 44 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-turret - rotate: false - xy: 1687, 724 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-turret-small - rotate: false - xy: 1813, 402 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-turret-smaller - rotate: false - xy: 1733, 370 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-turret-tiny - rotate: false - xy: 967, 62 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-tutorial - rotate: false - xy: 1737, 724 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-tutorial-small - rotate: false - xy: 1847, 402 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-tutorial-smaller - rotate: false - xy: 1669, 306 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-tutorial-tiny - rotate: false - xy: 949, 26 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-undo - rotate: false - xy: 1787, 724 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-undo-small - rotate: false - xy: 1881, 402 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-undo-smaller - rotate: false - xy: 1701, 338 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-undo-tiny - rotate: false - xy: 967, 44 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-units - rotate: false - xy: 1837, 724 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-units-small - rotate: false - xy: 1915, 402 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-units-smaller - rotate: false - xy: 1765, 370 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-units-tiny - rotate: false - xy: 985, 62 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-unlocks - rotate: false - xy: 1887, 724 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-unlocks-small - rotate: false - xy: 1949, 402 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-unlocks-smaller - rotate: false - xy: 1701, 306 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-unlocks-tiny - rotate: false - xy: 967, 26 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-upgrade - rotate: false - xy: 1937, 724 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-upgrade-small - rotate: false - xy: 1983, 402 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-upgrade-smaller - rotate: false - xy: 1733, 338 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-upgrade-tiny - rotate: false - xy: 985, 44 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-wiki - rotate: false - xy: 301, 674 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-wiki-small - rotate: false - xy: 711, 147 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-wiki-smaller - rotate: false - xy: 1797, 370 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-wiki-tiny - rotate: false - xy: 1003, 62 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-workshop - rotate: false - xy: 301, 624 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-workshop-small - rotate: false - xy: 711, 113 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-workshop-smaller - rotate: false - xy: 1733, 306 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-workshop-tiny - rotate: false - xy: 985, 26 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-zoom - rotate: false - xy: 351, 674 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-zoom-small - rotate: false - xy: 711, 79 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-zoom-smaller - rotate: false - xy: 1765, 338 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-zoom-tiny - rotate: false - xy: 1003, 44 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -info-banner - rotate: false - xy: 259, 977 - size: 84, 45 - orig: 84, 45 - offset: 0, 0 - index: -1 -inventory - rotate: false - xy: 1053, 186 - size: 24, 40 - split: 10, 10, 10, 14 - orig: 24, 40 - offset: 0, 0 - index: -1 -nomap - rotate: false - xy: 1, 766 - size: 256, 256 - orig: 256, 256 - offset: 0, 0 - index: -1 -pane - rotate: false - xy: 961, 611 - size: 36, 27 - split: 12, 12, 12, 12 - orig: 36, 27 - offset: 0, 0 - index: -1 -pane-2 - rotate: false - xy: 923, 582 - size: 36, 27 - split: 12, 12, 12, 12 - orig: 36, 27 - offset: 0, 0 - index: -1 -scroll - rotate: false - xy: 1105, 191 - size: 24, 35 - split: 10, 10, 6, 5 - orig: 24, 35 - offset: 0, 0 - index: -1 -scroll-horizontal - rotate: false - xy: 999, 585 - size: 35, 24 - split: 6, 5, 10, 10 - orig: 35, 24 - offset: 0, 0 - index: -1 -scroll-knob-horizontal-black - rotate: false - xy: 805, 572 - size: 40, 24 - orig: 40, 24 - offset: 0, 0 - index: -1 -scroll-knob-vertical-black - rotate: false - xy: 1079, 186 - size: 24, 40 - orig: 24, 40 - offset: 0, 0 - index: -1 -scroll-knob-vertical-thin - rotate: false - xy: 2035, 330 - size: 12, 40 - orig: 12, 40 - offset: 0, 0 - index: -1 -selection - rotate: false - xy: 309, 974 - size: 1, 1 - orig: 1, 1 - offset: 0, 0 - index: -1 -slider - rotate: false - xy: 1043, 504 - size: 1, 8 - orig: 1, 8 - offset: 0, 0 - index: -1 -slider-knob - rotate: false - xy: 1829, 362 - size: 29, 38 - orig: 29, 38 - offset: 0, 0 - index: -1 -slider-knob-down - rotate: false - xy: 1860, 362 - size: 29, 38 - orig: 29, 38 - offset: 0, 0 - index: -1 -slider-knob-over - rotate: false - xy: 1891, 362 - size: 29, 38 - orig: 29, 38 - offset: 0, 0 - index: -1 -slider-vertical - rotate: false - xy: 51, 716 - size: 8, 1 - orig: 8, 1 - offset: 0, 0 - index: -1 -underline - rotate: false - xy: 469, 75 - size: 36, 27 - split: 12, 12, 12, 12 - orig: 36, 27 - offset: 0, 0 - index: -1 -underline-2 - rotate: false - xy: 469, 104 - size: 36, 27 - split: 12, 12, 12, 12 - orig: 36, 27 - offset: 0, 0 - index: -1 -underline-disabled - rotate: false - xy: 961, 582 - size: 36, 27 - split: 12, 12, 12, 12 - orig: 36, 27 - offset: 0, 0 - index: -1 -underline-red - rotate: false - xy: 999, 611 - size: 36, 27 - split: 12, 12, 12, 12 - orig: 36, 27 - offset: 0, 0 - index: -1 -whiteui - rotate: false - xy: 831, 480 - size: 3, 3 - orig: 3, 3 - offset: 0, 0 - index: -1 -window-empty - rotate: false - xy: 1980, 339 - 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 @@ -17811,6 +7730,13 @@ differential-generator-icon-editor orig: 96, 96 offset: 0, 0 index: -1 +diode-icon-editor + rotate: false + xy: 623, 297 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 distributor-icon-editor rotate: false xy: 1471, 861 @@ -17820,7 +7746,7 @@ distributor-icon-editor index: -1 door-icon-editor rotate: false - xy: 623, 297 + xy: 589, 263 size: 32, 32 orig: 32, 32 offset: 0, 0 @@ -17841,28 +7767,28 @@ draug-factory-icon-editor index: -1 dunerocks-icon-editor rotate: false - xy: 589, 263 + xy: 555, 229 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 duo-icon-editor rotate: false - xy: 555, 229 + xy: 657, 297 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-char2 rotate: false - xy: 657, 297 + xy: 623, 263 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-char3 rotate: false - xy: 623, 263 + xy: 589, 229 size: 32, 32 orig: 32, 32 offset: 0, 0 @@ -17876,714 +7802,714 @@ editor-clear index: -1 editor-craters2 rotate: false - xy: 589, 229 + xy: 555, 195 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-craters3 rotate: false - xy: 555, 195 + xy: 657, 263 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-darksand2 rotate: false - xy: 657, 263 + xy: 623, 229 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-darksand3 rotate: false - xy: 623, 229 + xy: 589, 195 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-grass1 rotate: false - xy: 589, 195 + xy: 657, 229 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 grass-icon-editor rotate: false - xy: 589, 195 + xy: 657, 229 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-grass2 rotate: false - xy: 657, 229 + xy: 623, 195 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-grass3 rotate: false - xy: 623, 195 + xy: 657, 195 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-holostone1 rotate: false - xy: 657, 195 + xy: 569, 161 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 holostone-icon-editor rotate: false - xy: 657, 195 + xy: 569, 161 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-holostone2 rotate: false - xy: 569, 161 + xy: 603, 161 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-holostone3 rotate: false - xy: 603, 161 + xy: 637, 161 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-hotrock1 rotate: false - xy: 637, 161 + xy: 671, 161 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 hotrock-icon-editor rotate: false - xy: 637, 161 + xy: 671, 161 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-hotrock2 rotate: false - xy: 671, 161 + xy: 511, 69 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-hotrock3 rotate: false - xy: 511, 69 + xy: 527, 103 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-ice-snow1 rotate: false - xy: 637, 127 + xy: 671, 127 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ice-snow-icon-editor rotate: false - xy: 637, 127 + xy: 671, 127 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-ice-snow2 rotate: false - xy: 671, 127 + xy: 545, 69 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-ice-snow3 rotate: false - xy: 545, 69 + xy: 691, 331 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-ice1 rotate: false - xy: 527, 103 + xy: 569, 127 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ice-icon-editor rotate: false - xy: 527, 103 + xy: 569, 127 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-ice2 rotate: false - xy: 569, 127 + xy: 603, 127 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-ice3 rotate: false - xy: 603, 127 + xy: 637, 127 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-ignarock1 rotate: false - xy: 691, 331 + xy: 691, 297 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ignarock-icon-editor rotate: false - xy: 691, 331 + xy: 691, 297 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-ignarock2 rotate: false - xy: 691, 297 + xy: 691, 263 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-ignarock3 rotate: false - xy: 691, 263 + xy: 691, 229 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-magmarock1 rotate: false - xy: 691, 229 + xy: 691, 195 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 magmarock-icon-editor rotate: false - xy: 691, 229 + xy: 691, 195 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-magmarock2 rotate: false - xy: 691, 195 + xy: 705, 161 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-magmarock3 rotate: false - xy: 705, 161 + xy: 705, 127 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-metal-floor rotate: false - xy: 705, 127 + xy: 465, 29 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 metal-floor-icon-editor rotate: false - xy: 705, 127 + xy: 465, 29 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-metal-floor-2 rotate: false - xy: 465, 29 + xy: 499, 35 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 metal-floor-2-icon-editor rotate: false - xy: 465, 29 + xy: 499, 35 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-metal-floor-3 rotate: false - xy: 499, 35 + xy: 499, 1 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 metal-floor-3-icon-editor rotate: false - xy: 499, 35 + xy: 499, 1 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-metal-floor-5 rotate: false - xy: 499, 1 + xy: 533, 35 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 metal-floor-5-icon-editor rotate: false - xy: 499, 1 + xy: 533, 35 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-metal-floor-damaged1 rotate: false - xy: 533, 35 + xy: 533, 1 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 metal-floor-damaged-icon-editor rotate: false - xy: 533, 35 + xy: 533, 1 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-metal-floor-damaged2 rotate: false - xy: 533, 1 + xy: 705, 399 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-metal-floor-damaged3 rotate: false - xy: 705, 399 + xy: 705, 365 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-moss1 rotate: false - xy: 705, 365 + xy: 725, 331 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 moss-icon-editor rotate: false - xy: 705, 365 + xy: 725, 331 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-moss2 rotate: false - xy: 725, 331 + xy: 725, 297 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-moss3 rotate: false - xy: 725, 297 + xy: 725, 263 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-ore-coal1 rotate: false - xy: 725, 263 + xy: 725, 229 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-ore-coal2 rotate: false - xy: 725, 229 + xy: 725, 195 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-ore-coal3 rotate: false - xy: 725, 195 + xy: 739, 161 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-ore-copper1 rotate: false - xy: 739, 161 + xy: 739, 127 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-ore-copper2 rotate: false - xy: 739, 127 + xy: 567, 35 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-ore-copper3 rotate: false - xy: 567, 35 + xy: 567, 1 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-ore-lead1 rotate: false - xy: 567, 1 + xy: 579, 93 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-ore-lead2 rotate: false - xy: 579, 93 + xy: 613, 93 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-ore-lead3 rotate: false - xy: 613, 93 + xy: 647, 93 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-ore-scrap1 rotate: false - xy: 647, 93 + xy: 681, 93 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-ore-scrap2 rotate: false - xy: 681, 93 + xy: 715, 93 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-ore-scrap3 rotate: false - xy: 715, 93 + xy: 749, 93 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-ore-thorium1 rotate: false - xy: 749, 93 + xy: 601, 59 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-ore-thorium2 rotate: false - xy: 601, 59 + xy: 601, 25 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-ore-thorium3 rotate: false - xy: 601, 25 + xy: 635, 59 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-ore-titanium1 rotate: false - xy: 635, 59 + xy: 635, 25 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-ore-titanium2 rotate: false - xy: 635, 25 + xy: 669, 59 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-ore-titanium3 rotate: false - xy: 669, 59 + xy: 669, 25 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-pebbles1 rotate: false - xy: 669, 25 + xy: 703, 59 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-pebbles2 rotate: false - xy: 703, 59 + xy: 703, 25 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-pebbles3 rotate: false - xy: 703, 25 + xy: 737, 59 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-salt rotate: false - xy: 737, 59 + xy: 737, 25 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 salt-icon-editor rotate: false - xy: 737, 59 + xy: 737, 25 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-sand-water rotate: false - xy: 733, 827 + xy: 767, 827 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 sand-water-icon-editor rotate: false - xy: 733, 827 + xy: 767, 827 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-sand1 rotate: false - xy: 737, 25 + xy: 771, 59 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 sand-icon-editor rotate: false - xy: 737, 25 + xy: 771, 59 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-sand2 rotate: false - xy: 771, 59 + xy: 771, 25 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-sand3 rotate: false - xy: 771, 25 + xy: 733, 827 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-shale1 rotate: false - xy: 767, 827 + xy: 801, 827 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 shale-icon-editor rotate: false - xy: 767, 827 + xy: 801, 827 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-shale2 rotate: false - xy: 801, 827 + xy: 835, 827 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-shale3 rotate: false - xy: 835, 827 + xy: 869, 827 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-snow1 rotate: false - xy: 869, 827 + xy: 903, 827 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-snow2 rotate: false - xy: 903, 827 + xy: 937, 827 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-snow3 rotate: false - xy: 937, 827 + xy: 971, 827 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-spawn rotate: false - xy: 971, 827 + xy: 1005, 827 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-spore-moss1 rotate: false - xy: 1005, 827 + xy: 1039, 827 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 spore-moss-icon-editor rotate: false - xy: 1005, 827 + xy: 1039, 827 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-spore-moss2 rotate: false - xy: 1039, 827 + xy: 1073, 827 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-spore-moss3 rotate: false - xy: 1073, 827 + xy: 1107, 827 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-stone1 rotate: false - xy: 1107, 827 + xy: 1141, 827 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 stone-icon-editor rotate: false - xy: 1107, 827 + xy: 1141, 827 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-stone2 rotate: false - xy: 1141, 827 + xy: 1175, 827 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-stone3 rotate: false - xy: 1175, 827 + xy: 1209, 827 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-tainted-water rotate: false - xy: 1209, 827 + xy: 1243, 827 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 tainted-water-icon-editor rotate: false - xy: 1209, 827 + xy: 1243, 827 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-tar rotate: false - xy: 1243, 827 + xy: 1277, 827 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 tar-icon-editor rotate: false - xy: 1243, 827 + xy: 1277, 827 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-tendrils1 rotate: false - xy: 1277, 827 + xy: 1311, 827 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-tendrils2 rotate: false - xy: 1311, 827 + xy: 1345, 827 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-tendrils3 rotate: false - xy: 1345, 827 + xy: 1379, 827 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-water rotate: false - xy: 1379, 827 + xy: 1413, 827 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 water-icon-editor rotate: false - xy: 1379, 827 + xy: 1413, 827 size: 32, 32 orig: 32, 32 offset: 0, 0 @@ -18632,14 +8558,21 @@ graphite-press-icon-editor index: -1 hail-icon-editor rotate: false - xy: 1413, 827 + xy: 1447, 827 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 icerocks-icon-editor rotate: false - xy: 1447, 827 + xy: 1481, 827 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +illuminator-icon-editor + rotate: false + xy: 1515, 827 size: 32, 32 orig: 32, 32 offset: 0, 0 @@ -18653,28 +8586,28 @@ impact-reactor-icon-editor index: -1 incinerator-icon-editor rotate: false - xy: 1481, 827 + xy: 1549, 827 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 inverted-sorter-icon-editor rotate: false - xy: 1515, 827 + xy: 1583, 827 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-source-icon-editor rotate: false - xy: 1549, 827 + xy: 1617, 827 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-void-icon-editor rotate: false - xy: 1583, 827 + xy: 1651, 827 size: 32, 32 orig: 32, 32 offset: 0, 0 @@ -18688,7 +8621,7 @@ javelin-ship-pad-icon-editor index: -1 junction-icon-editor rotate: false - xy: 1617, 827 + xy: 1685, 827 size: 32, 32 orig: 32, 32 offset: 0, 0 @@ -18730,21 +8663,21 @@ launch-pad-large-icon-editor index: -1 liquid-junction-icon-editor rotate: false - xy: 1651, 827 + xy: 1719, 827 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 liquid-router-icon-editor rotate: false - xy: 1685, 827 + xy: 1753, 827 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 liquid-source-icon-editor rotate: false - xy: 1719, 827 + xy: 1787, 827 size: 32, 32 orig: 32, 32 offset: 0, 0 @@ -18772,7 +8705,7 @@ mechanical-drill-icon-editor index: -1 mechanical-pump-icon-editor rotate: false - xy: 1753, 827 + xy: 1821, 827 size: 32, 32 orig: 32, 32 offset: 0, 0 @@ -18786,7 +8719,7 @@ meltdown-icon-editor index: -1 melter-icon-editor rotate: false - xy: 1787, 827 + xy: 1855, 827 size: 32, 32 orig: 32, 32 offset: 0, 0 @@ -18800,14 +8733,14 @@ mend-projector-icon-editor index: -1 mender-icon-editor rotate: false - xy: 1821, 827 + xy: 1889, 827 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 message-icon-editor rotate: false - xy: 1855, 827 + xy: 1923, 827 size: 32, 32 orig: 32, 32 offset: 0, 0 @@ -18842,14 +8775,14 @@ overdrive-projector-icon-editor index: -1 overflow-gate-icon-editor rotate: false - xy: 1889, 827 + xy: 1957, 827 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 pebbles-icon-editor rotate: false - xy: 1923, 827 + xy: 717, 793 size: 32, 32 orig: 32, 32 offset: 0, 0 @@ -18863,21 +8796,21 @@ phantom-factory-icon-editor index: -1 phase-conduit-icon-editor rotate: false - xy: 1957, 827 + xy: 717, 759 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 phase-conveyor-icon-editor rotate: false - xy: 717, 793 + xy: 751, 793 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 phase-wall-icon-editor rotate: false - xy: 717, 759 + xy: 717, 725 size: 32, 32 orig: 32, 32 offset: 0, 0 @@ -18912,7 +8845,7 @@ plastanium-compressor-icon-editor index: -1 plastanium-wall-icon-editor rotate: false - xy: 751, 793 + xy: 785, 793 size: 32, 32 orig: 32, 32 offset: 0, 0 @@ -18924,6 +8857,13 @@ plastanium-wall-large-icon-editor orig: 64, 64 offset: 0, 0 index: -1 +plated-conduit-icon-editor + rotate: false + xy: 751, 759 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 pneumatic-drill-icon-editor rotate: false xy: 585, 763 @@ -18933,7 +8873,7 @@ pneumatic-drill-icon-editor index: -1 power-node-icon-editor rotate: false - xy: 717, 725 + xy: 717, 691 size: 32, 32 orig: 32, 32 offset: 0, 0 @@ -18947,28 +8887,28 @@ power-node-large-icon-editor index: -1 power-source-icon-editor rotate: false - xy: 785, 793 + xy: 819, 793 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 power-void-icon-editor rotate: false - xy: 751, 759 + xy: 785, 759 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 pulse-conduit-icon-editor rotate: false - xy: 717, 691 + xy: 751, 725 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 pulverizer-icon-editor rotate: false - xy: 819, 793 + xy: 717, 657 size: 32, 32 orig: 32, 32 offset: 0, 0 @@ -18982,7 +8922,7 @@ pyratite-mixer-icon-editor index: -1 repair-point-icon-editor rotate: false - xy: 785, 759 + xy: 853, 793 size: 32, 32 orig: 32, 32 offset: 0, 0 @@ -19010,7 +8950,7 @@ rock-icon-editor index: -1 rocks-icon-editor rotate: false - xy: 751, 725 + xy: 819, 759 size: 32, 32 orig: 32, 32 offset: 0, 0 @@ -19024,7 +8964,7 @@ rotary-pump-icon-editor index: -1 router-icon-editor rotate: false - xy: 717, 657 + xy: 785, 725 size: 32, 32 orig: 32, 32 offset: 0, 0 @@ -19038,7 +8978,7 @@ rtg-generator-icon-editor index: -1 saltrocks-icon-editor rotate: false - xy: 853, 793 + xy: 751, 691 size: 32, 32 orig: 32, 32 offset: 0, 0 @@ -19052,14 +8992,14 @@ salvo-icon-editor index: -1 sand-boulder-icon-editor rotate: false - xy: 819, 759 + xy: 717, 623 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 sandrocks-icon-editor rotate: false - xy: 785, 725 + xy: 887, 793 size: 32, 32 orig: 32, 32 offset: 0, 0 @@ -19073,7 +9013,7 @@ scatter-icon-editor index: -1 scorch-icon-editor rotate: false - xy: 751, 691 + xy: 853, 759 size: 32, 32 orig: 32, 32 offset: 0, 0 @@ -19094,7 +9034,7 @@ scrap-wall-huge-icon-editor index: -1 scrap-wall-icon-editor rotate: false - xy: 717, 623 + xy: 819, 725 size: 32, 32 orig: 32, 32 offset: 0, 0 @@ -19115,28 +9055,28 @@ separator-icon-editor index: -1 shale-boulder-icon-editor rotate: false - xy: 887, 793 + xy: 785, 691 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 shalerocks-icon-editor rotate: false - xy: 853, 759 + xy: 751, 657 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 shock-mine-icon-editor rotate: false - xy: 819, 725 + xy: 717, 589 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 shrubs-icon-editor rotate: false - xy: 785, 691 + xy: 921, 793 size: 32, 32 orig: 32, 32 offset: 0, 0 @@ -19150,7 +9090,7 @@ silicon-smelter-icon-editor index: -1 snow-icon-editor rotate: false - xy: 751, 657 + xy: 887, 759 size: 32, 32 orig: 32, 32 offset: 0, 0 @@ -19171,14 +9111,14 @@ snowrock-icon-editor index: -1 snowrocks-icon-editor rotate: false - xy: 717, 589 + xy: 853, 725 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 solar-panel-icon-editor rotate: false - xy: 921, 793 + xy: 819, 691 size: 32, 32 orig: 32, 32 offset: 0, 0 @@ -19192,14 +9132,14 @@ solar-panel-large-icon-editor index: -1 sorter-icon-editor rotate: false - xy: 887, 759 + xy: 785, 657 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 spawn-icon-editor rotate: false - xy: 853, 725 + xy: 751, 623 size: 32, 32 orig: 32, 32 offset: 0, 0 @@ -19241,7 +9181,7 @@ spore-press-icon-editor index: -1 sporerocks-icon-editor rotate: false - xy: 819, 691 + xy: 717, 555 size: 32, 32 orig: 32, 32 offset: 0, 0 @@ -19255,7 +9195,7 @@ surge-tower-icon-editor index: -1 surge-wall-icon-editor rotate: false - xy: 785, 657 + xy: 955, 793 size: 32, 32 orig: 32, 32 offset: 0, 0 @@ -19283,7 +9223,7 @@ tau-mech-pad-icon-editor index: -1 tendrils-icon-editor rotate: false - xy: 751, 623 + xy: 921, 759 size: 32, 32 orig: 32, 32 offset: 0, 0 @@ -19311,7 +9251,7 @@ thorium-reactor-icon-editor index: -1 thorium-wall-icon-editor rotate: false - xy: 717, 555 + xy: 887, 725 size: 32, 32 orig: 32, 32 offset: 0, 0 @@ -19339,14 +9279,14 @@ titan-factory-icon-editor index: -1 titanium-conveyor-icon-editor rotate: false - xy: 955, 793 + xy: 853, 691 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-wall-icon-editor rotate: false - xy: 921, 759 + xy: 819, 657 size: 32, 32 orig: 32, 32 offset: 0, 0 @@ -19374,7 +9314,7 @@ turbine-generator-icon-editor index: -1 unloader-icon-editor rotate: false - xy: 887, 725 + xy: 785, 623 size: 32, 32 orig: 32, 32 offset: 0, 0 @@ -19421,3 +9361,10385 @@ 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, 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 diff --git a/core/assets/sprites/sprites.png b/core/assets/sprites/sprites.png index 903474a74b..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 0862796ee5..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 b8e704bef8..4f81860614 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 9c6248562c..6abff04782 100644 --- a/core/src/io/anuke/mindustry/ClientLauncher.java +++ b/core/src/io/anuke/mindustry/ClientLauncher.java @@ -104,7 +104,7 @@ public abstract class ClientLauncher extends ApplicationCore implements Platform public void resize(int width, int height){ if(assets == null) return; - if(!assets.isFinished()){ + if(!finished){ Draw.proj().setOrtho(0, 0, width, height); }else{ super.resize(width, height); diff --git a/core/src/io/anuke/mindustry/Vars.java b/core/src/io/anuke/mindustry/Vars.java index d5c4a980f5..a722095c71 100644 --- a/core/src/io/anuke/mindustry/Vars.java +++ b/core/src/io/anuke/mindustry/Vars.java @@ -48,7 +48,7 @@ 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 the links to the wiki's modding guide.*/ @@ -299,7 +299,6 @@ public class Vars implements Loadable{ //no external bundle found FileHandle handle = Core.files.internal("bundles/bundle"); - Locale locale; String loc = Core.settings.getString("locale"); if(loc.equals("default")){ diff --git a/core/src/io/anuke/mindustry/ai/BlockIndexer.java b/core/src/io/anuke/mindustry/ai/BlockIndexer.java index 0fdbbb7c5e..f6df8f7475 100644 --- a/core/src/io/anuke/mindustry/ai/BlockIndexer.java +++ b/core/src/io/anuke/mindustry/ai/BlockIndexer.java @@ -2,7 +2,7 @@ package io.anuke.mindustry.ai; import io.anuke.arc.*; import io.anuke.arc.collection.*; -import io.anuke.arc.function.*; +import io.anuke.arc.func.*; import io.anuke.arc.math.*; import io.anuke.arc.math.geom.*; import io.anuke.mindustry.content.*; @@ -27,7 +27,7 @@ public class BlockIndexer{ private final ObjectSet scanOres = new ObjectSet<>(); private final ObjectSet itemSet = new ObjectSet<>(); /** Stores all ore quadtrants on the map. */ - private ObjectMap> ores; + private ObjectMap> ores = new ObjectMap<>(); /** Tags all quadrants. */ private GridBits[] structQuadrants; /** Stores all damaged tile entities by team. */ @@ -163,11 +163,11 @@ public class BlockIndexer{ set.add(entity.tile); } - public TileEntity findTile(Team team, float x, float y, float range, Predicate pred){ + public TileEntity findTile(Team team, float x, float y, float range, Boolf pred){ return findTile(team, x, y, range, pred, false); } - public TileEntity findTile(Team team, float x, float y, float range, Predicate pred, boolean usePriority){ + public TileEntity findTile(Team team, float x, float y, float range, Boolf pred, boolean usePriority){ TileEntity closest = null; float dst = 0; @@ -182,7 +182,7 @@ public class BlockIndexer{ if(other == null) continue; - if(other.entity == null || other.getTeam() != team || !pred.test(other) || !other.block().targetable) + if(other.entity == null || other.getTeam() != team || !pred.get(other) || !other.block().targetable) continue; TileEntity e = other.entity; diff --git a/core/src/io/anuke/mindustry/ai/Pathfinder.java b/core/src/io/anuke/mindustry/ai/Pathfinder.java index 03ca073a08..14890b531f 100644 --- a/core/src/io/anuke/mindustry/ai/Pathfinder.java +++ b/core/src/io/anuke/mindustry/ai/Pathfinder.java @@ -3,7 +3,7 @@ package io.anuke.mindustry.ai; import io.anuke.annotations.Annotations.*; import io.anuke.arc.*; import io.anuke.arc.collection.*; -import io.anuke.arc.function.*; +import io.anuke.arc.func.*; import io.anuke.arc.math.geom.*; import io.anuke.arc.util.*; import io.anuke.arc.util.ArcAnnotate.*; @@ -317,15 +317,15 @@ public class Pathfinder implements Runnable{ public static final PathTarget[] all = values(); - private final BiConsumer targeter; + private final Cons2 targeter; - PathTarget(BiConsumer targeter){ + PathTarget(Cons2 targeter){ this.targeter = targeter; } /** Get targets. This must run on the main thread.*/ public IntArray getTargets(Team team, IntArray out){ - targeter.accept(team, out); + targeter.get(team, out); return out; } } diff --git a/core/src/io/anuke/mindustry/ai/WaveSpawner.java b/core/src/io/anuke/mindustry/ai/WaveSpawner.java index b4dadcd59a..ca50e36b13 100644 --- a/core/src/io/anuke/mindustry/ai/WaveSpawner.java +++ b/core/src/io/anuke/mindustry/ai/WaveSpawner.java @@ -2,7 +2,7 @@ package io.anuke.mindustry.ai; import io.anuke.arc.Events; import io.anuke.arc.collection.Array; -import io.anuke.arc.function.PositionConsumer; +import io.anuke.arc.func.Floatc2; import io.anuke.arc.math.Angles; import io.anuke.arc.math.Mathf; import io.anuke.arc.util.Time; @@ -99,17 +99,17 @@ public class WaveSpawner{ } } - private void eachFlyerSpawn(PositionConsumer cons){ + private void eachFlyerSpawn(Floatc2 cons){ for(FlyerSpawn spawn : flySpawns){ float trns = (world.width() + world.height()) * tilesize; float spawnX = Mathf.clamp(world.width() * tilesize / 2f + Angles.trnsx(spawn.angle, trns), -margin, world.width() * tilesize + margin); float spawnY = Mathf.clamp(world.height() * tilesize / 2f + Angles.trnsy(spawn.angle, trns), -margin, world.height() * tilesize + margin); - cons.accept(spawnX, spawnY); + cons.get(spawnX, spawnY); } if(state.rules.attackMode && state.teams.isActive(waveTeam)){ for(Tile core : state.teams.get(waveTeam).cores){ - cons.accept(core.worldx(), core.worldy()); + cons.get(core.worldx(), core.worldy()); } } } diff --git a/core/src/io/anuke/mindustry/content/Blocks.java b/core/src/io/anuke/mindustry/content/Blocks.java index fc713253ff..623fd0ef79 100644 --- a/core/src/io/anuke/mindustry/content/Blocks.java +++ b/core/src/io/anuke/mindustry/content/Blocks.java @@ -19,6 +19,8 @@ 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.logic.*; import io.anuke.mindustry.world.blocks.power.*; import io.anuke.mindustry.world.blocks.production.*; @@ -48,22 +50,22 @@ public class Blocks implements ContentList{ melter, separator, sporePress, pulverizer, incinerator, coalCentrifuge, //sandbox - powerVoid, powerSource, itemSource, liquidSource, itemVoid, message, + powerSource, powerVoid, itemSource, itemVoid, liquidSource, message, illuminator, //defense - scrapWall, scrapWallLarge, scrapWallHuge, scrapWallGigantic, thruster, //ok, these names are getting ridiculous, but at least I don't have humongous walls yet copperWall, copperWallLarge, titaniumWall, titaniumWallLarge, plastaniumWall, plastaniumWallLarge, thoriumWall, thoriumWallLarge, door, doorLarge, phaseWall, phaseWallLarge, surgeWall, surgeWallLarge, mender, mendProjector, overdriveProjector, forceProjector, shockMine, + scrapWall, scrapWallLarge, scrapWallHuge, scrapWallGigantic, thruster, //ok, these names are getting ridiculous, but at least I don't have humongous walls yet //transport conveyor, titaniumConveyor, armoredConveyor, distributor, junction, itemBridge, phaseConveyor, sorter, invertedSorter, router, overflowGate, massDriver, //liquids - mechanicalPump, rotaryPump, thermalPump, conduit, pulseConduit, liquidRouter, liquidTank, liquidJunction, bridgeConduit, phaseConduit, + mechanicalPump, rotaryPump, thermalPump, conduit, pulseConduit, platedConduit, liquidRouter, liquidTank, liquidJunction, bridgeConduit, phaseConduit, //power combustionGenerator, thermalGenerator, turbineGenerator, differentialGenerator, rtgGenerator, solarPanel, largeSolarPanel, thoriumReactor, - impactReactor, battery, batteryLarge, powerNode, powerNodeLarge, surgeTower, + impactReactor, battery, batteryLarge, powerNode, powerNodeLarge, surgeTower, diode, //production mechanicalDrill, pneumaticDrill, laserDrill, blastDrill, waterExtractor, oilExtractor, cultivator, @@ -505,7 +507,7 @@ 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(); @@ -537,7 +539,7 @@ public class Blocks implements ContentList{ hasPower = true; consumes.power(4f); - consumes.items(new ItemStack(Items.titanium, 2), new ItemStack(Items.lead, 4), new ItemStack(Items.silicon, 3), new ItemStack(Items.copper, 3)); + consumes.items(new ItemStack(Items.copper, 3), new ItemStack(Items.lead, 4), new ItemStack(Items.titanium, 2), new ItemStack(Items.silicon, 3)); }}; cryofluidMixer = new LiquidConverter("cryofluidmixer"){{ @@ -710,69 +712,11 @@ public class Blocks implements ContentList{ consumes.power(0.50f); }}; - //endregion - //region sandbox - - powerVoid = new PowerVoid("power-void"){{ - requirements(Category.power, BuildVisibility.sandboxOnly, ItemStack.with()); - alwaysUnlocked = true; - }}; - powerSource = new PowerSource("power-source"){{ - requirements(Category.power, BuildVisibility.sandboxOnly, ItemStack.with()); - alwaysUnlocked = true; - }}; - itemSource = new ItemSource("item-source"){{ - requirements(Category.distribution, BuildVisibility.sandboxOnly, ItemStack.with()); - alwaysUnlocked = true; - }}; - itemVoid = new ItemVoid("item-void"){{ - requirements(Category.distribution, BuildVisibility.sandboxOnly, ItemStack.with()); - alwaysUnlocked = true; - }}; - liquidSource = new LiquidSource("liquid-source"){{ - requirements(Category.liquid, BuildVisibility.sandboxOnly, ItemStack.with()); - alwaysUnlocked = true; - }}; - message = new MessageBlock("message"){{ - requirements(Category.effect, ItemStack.with(Items.graphite, 5)); - }}; - //endregion //region defense int wallHealthMultiplier = 4; - scrapWall = new Wall("scrap-wall"){{ - requirements(Category.defense, BuildVisibility.sandboxOnly, ItemStack.with()); - health = 60 * wallHealthMultiplier; - variants = 5; - }}; - - scrapWallLarge = new Wall("scrap-wall-large"){{ - requirements(Category.defense, BuildVisibility.sandboxOnly, ItemStack.with()); - health = 60 * 4 * wallHealthMultiplier; - size = 2; - variants = 4; - }}; - - scrapWallHuge = new Wall("scrap-wall-huge"){{ - requirements(Category.defense, BuildVisibility.sandboxOnly, ItemStack.with()); - health = 60 * 9 * wallHealthMultiplier; - size = 3; - variants = 3; - }}; - - scrapWallGigantic = new Wall("scrap-wall-gigantic"){{ - requirements(Category.defense, BuildVisibility.sandboxOnly, ItemStack.with()); - health = 60 * 16 * wallHealthMultiplier; - size = 4; - }}; - - thruster = new Wall("thruster"){{ - health = 55 * 16 * wallHealthMultiplier; - size = 4; - }}; - copperWall = new Wall("copper-wall"){{ requirements(Category.defense, ItemStack.with(Items.copper, 6)); health = 80 * wallHealthMultiplier; @@ -854,6 +798,37 @@ public class Blocks implements ContentList{ size = 2; }}; + scrapWall = new Wall("scrap-wall"){{ + requirements(Category.defense, BuildVisibility.sandboxOnly, ItemStack.with()); + health = 60 * wallHealthMultiplier; + variants = 5; + }}; + + scrapWallLarge = new Wall("scrap-wall-large"){{ + requirements(Category.defense, BuildVisibility.sandboxOnly, ItemStack.with()); + health = 60 * 4 * wallHealthMultiplier; + size = 2; + variants = 4; + }}; + + scrapWallHuge = new Wall("scrap-wall-huge"){{ + requirements(Category.defense, BuildVisibility.sandboxOnly, ItemStack.with()); + health = 60 * 9 * wallHealthMultiplier; + size = 3; + variants = 3; + }}; + + scrapWallGigantic = new Wall("scrap-wall-gigantic"){{ + requirements(Category.defense, BuildVisibility.sandboxOnly, ItemStack.with()); + health = 60 * 16 * wallHealthMultiplier; + size = 4; + }}; + + thruster = new Wall("thruster"){{ + health = 55 * 16 * wallHealthMultiplier; + size = 4; + }}; + mender = new MendProjector("mender"){{ requirements(Category.effect, ItemStack.with(Items.lead, 30, Items.copper, 25)); consumes.power(0.3f); @@ -918,7 +893,7 @@ public class Blocks implements ContentList{ }}; armoredConveyor = new ArmoredConveyor("armored-conveyor"){{ - requirements(Category.distribution, ItemStack.with(Items.metaglass, 1, Items.thorium, 1)); + requirements(Category.distribution, ItemStack.with(Items.plastanium, 1, Items.thorium, 1, Items.metaglass, 1)); health = 180; speed = 0.08f; }}; @@ -1002,7 +977,7 @@ public class Blocks implements ContentList{ size = 3; }}; - conduit = new Conduit("conduit"){{ + conduit = new io.anuke.mindustry.world.blocks.liquid.Conduit("conduit"){{ requirements(Category.liquid, ItemStack.with(Items.metaglass, 1)); health = 45; }}; @@ -1010,10 +985,18 @@ public class Blocks implements ContentList{ pulseConduit = new Conduit("pulse-conduit"){{ requirements(Category.liquid, ItemStack.with(Items.titanium, 2, Items.metaglass, 1)); liquidCapacity = 16f; + liquidPressure = 1.025f; health = 90; }}; - liquidRouter = new LiquidRouter("liquid-router"){{ + platedConduit = new io.anuke.mindustry.world.blocks.liquid.ArmoredConduit("plated-conduit"){{ + requirements(Category.liquid, ItemStack.with(Items.thorium, 2, Items.metaglass, 1)); + liquidCapacity = 16f; + liquidPressure = 1.025f; + health = 220; + }}; + + liquidRouter = new io.anuke.mindustry.world.blocks.liquid.LiquidRouter("liquid-router"){{ requirements(Category.liquid, ItemStack.with(Items.graphite, 4, Items.metaglass, 2)); liquidCapacity = 20f; }}; @@ -1025,17 +1008,17 @@ public class Blocks implements ContentList{ health = 500; }}; - liquidJunction = new LiquidJunction("liquid-junction"){{ + liquidJunction = new io.anuke.mindustry.world.blocks.liquid.LiquidJunction("liquid-junction"){{ requirements(Category.liquid, ItemStack.with(Items.graphite, 2, Items.metaglass, 2)); }}; - bridgeConduit = new LiquidExtendingBridge("bridge-conduit"){{ + bridgeConduit = new io.anuke.mindustry.world.blocks.liquid.LiquidExtendingBridge("bridge-conduit"){{ requirements(Category.liquid, ItemStack.with(Items.graphite, 4, Items.metaglass, 8)); range = 4; hasPower = false; }}; - phaseConduit = new LiquidBridge("phase-conduit"){{ + phaseConduit = new io.anuke.mindustry.world.blocks.liquid.LiquidBridge("phase-conduit"){{ requirements(Category.liquid, ItemStack.with(Items.phasefabric, 5, Items.silicon, 7, Items.metaglass, 20, Items.titanium, 10)); range = 12; hasPower = true; @@ -1065,6 +1048,10 @@ public class Blocks implements ContentList{ laserRange = 30f; }}; + diode = new PowerDiode("diode"){{ + requirements(Category.power, ItemStack.with(Items.silicon, 10, Items.plastanium, 5, Items.metaglass, 10)); + }}; + battery = new Battery("battery"){{ requirements(Category.power, ItemStack.with(Items.copper, 4, Items.lead, 20)); consumes.powerBuffered(4000f); @@ -1136,7 +1123,7 @@ public class Blocks implements ContentList{ powerProduction = 14f; consumes.item(Items.thorium); heating = 0.02f; - consumes.liquid(Liquids.cryofluid, 0.1f).update(false); + consumes.liquid(Liquids.cryofluid, heating / coolantPower).update(false); }}; impactReactor = new ImpactReactor("impact-reactor"){{ @@ -1805,6 +1792,45 @@ public class Blocks implements ContentList{ consumes.power(1.2f); }}; + //endregion + //region sandbox + + powerSource = new PowerSource("power-source"){{ + requirements(Category.power, BuildVisibility.sandboxOnly, ItemStack.with()); + alwaysUnlocked = true; + }}; + + powerVoid = new PowerVoid("power-void"){{ + requirements(Category.power, BuildVisibility.sandboxOnly, ItemStack.with()); + alwaysUnlocked = true; + }}; + + itemSource = new ItemSource("item-source"){{ + requirements(Category.distribution, BuildVisibility.sandboxOnly, ItemStack.with()); + alwaysUnlocked = true; + }}; + + itemVoid = new ItemVoid("item-void"){{ + requirements(Category.distribution, BuildVisibility.sandboxOnly, ItemStack.with()); + alwaysUnlocked = true; + }}; + + liquidSource = new LiquidSource("liquid-source"){{ + requirements(Category.liquid, BuildVisibility.sandboxOnly, ItemStack.with()); + alwaysUnlocked = true; + }}; + + message = new MessageBlock("message"){{ + requirements(Category.effect, ItemStack.with(Items.graphite, 5)); + }}; + + illuminator = new LightBlock("illuminator"){{ + requirements(Category.effect, BuildVisibility.lightingOnly, ItemStack.with(Items.graphite, 4, Items.silicon, 2)); + brightness = 0.67f; + radius = 120f; + consumes.power(0.05f); + }}; + //endregion } } diff --git a/core/src/io/anuke/mindustry/content/Fx.java b/core/src/io/anuke/mindustry/content/Fx.java index 397f15e67b..d7aeed4c65 100644 --- a/core/src/io/anuke/mindustry/content/Fx.java +++ b/core/src/io/anuke/mindustry/content/Fx.java @@ -13,7 +13,7 @@ import io.anuke.mindustry.graphics.*; import io.anuke.mindustry.type.*; import io.anuke.mindustry.ui.Cicon; -import static io.anuke.mindustry.Vars.tilesize; +import static io.anuke.mindustry.Vars.*; public class Fx implements ContentList{ public static Effect @@ -456,6 +456,8 @@ public class Fx implements ContentList{ }); Draw.color(); + + renderer.lights.add(e.x, e.y, 20f * e.fslope(), Pal.lightFlame, 0.5f); }); fireSmoke = new Effect(35f, e -> { diff --git a/core/src/io/anuke/mindustry/content/Liquids.java b/core/src/io/anuke/mindustry/content/Liquids.java index bf103bceaa..bbc934cd16 100644 --- a/core/src/io/anuke/mindustry/content/Liquids.java +++ b/core/src/io/anuke/mindustry/content/Liquids.java @@ -19,6 +19,7 @@ public class Liquids implements ContentList{ temperature = 1f; viscosity = 0.8f; effect = StatusEffects.melting; + lightColor = Color.valueOf("f0511d").a(0.4f); }}; oil = new Liquid("oil", Color.valueOf("313131")){{ @@ -26,6 +27,7 @@ public class Liquids implements ContentList{ flammability = 1.2f; explosiveness = 1.2f; heatCapacity = 0.7f; + barColor = Color.valueOf("6b675f"); effect = StatusEffects.tarred; }}; @@ -33,6 +35,7 @@ public class Liquids implements ContentList{ heatCapacity = 0.9f; temperature = 0.25f; effect = StatusEffects.freezing; + lightColor = Color.valueOf("0097f5").a(0.2f); }}; } } diff --git a/core/src/io/anuke/mindustry/content/Loadouts.java b/core/src/io/anuke/mindustry/content/Loadouts.java index af4a5962c0..631066a24f 100644 --- a/core/src/io/anuke/mindustry/content/Loadouts.java +++ b/core/src/io/anuke/mindustry/content/Loadouts.java @@ -1,10 +1,12 @@ package io.anuke.mindustry.content; -import io.anuke.mindustry.ctype.ContentList; -import io.anuke.mindustry.type.Loadout; +import io.anuke.mindustry.ctype.*; +import io.anuke.mindustry.game.*; + +import java.io.*; public class Loadouts implements ContentList{ - public static Loadout + public static Schematic basicShard, advancedShard, basicFoundation, @@ -12,43 +14,13 @@ public class Loadouts implements ContentList{ @Override public void load(){ - basicShard = new Loadout( - " ### ", - " #1# ", - " ### ", - " ^ ^ ", - " ## ## ", - " C# C# " - ); - - advancedShard = new Loadout( - " ### ", - " #1# ", - "#######", - "C#^ ^C#", - " ## ## ", - " C# C# " - ); - - basicFoundation = new Loadout( - " #### ", - " #### ", - " #2## ", - " #### ", - " ^^^^ ", - " ###### ", - " C#C#C# " - ); - - basicNucleus = new Loadout( - " ##### ", - " ##### ", - " ##3## ", - " ##### ", - " >#####< ", - " ^ ^ ^ ^ ", - "#### ####", - "C#C# C#C#" - ); + try{ + basicShard = Schematics.readBase64("bXNjaAB4nD2K2wqAIBiD5ymibnoRn6YnEP1BwUMoBL19FuJ2sbFvUFgYZDaJsLeQrkinN9UJHImsNzlYE7WrIUastuSbnlKx2VJJt+8IQGGKdfO/8J5yrGJSMegLg+YUIA=="); + advancedShard = Schematics.readBase64("bXNjaAB4nD2LjQqAIAyET7OMIOhFfJqeYMxBgSkYCL199gu33fFtB4tOwUTaBCP5QpHFzwtl32DahBeKK1NwPq8hoOcUixwpY+CUxe3XIwBbB/pa6tadVCUP02hgHvp5vZq/0b7pBHPYFOQ="); + basicFoundation = Schematics.readBase64("bXNjaAB4nD1OSQ6DMBBzFhVu8BG+0X8MQyoiJTNSukj8nlCi2Adbtg/GA4OBF8oB00rvyE/9ykafqOIw58A7SWRKy1ZiShhZ5RcOLZhYS1hefQ1gRIeptH9jq/qW2lvc1d2tgWsOfVX/tOwE86AYBA=="); + basicNucleus = Schematics.readBase64("bXNjaAB4nD2MUQqAIBBEJy0s6qOLdJXuYNtCgikYBd2+LNmdj308hkGHtkId7M4YFns4mk/yfB4a48602eDI+mlNznu0FMPFd0wYKCaewl8F0EOueqM+yKSLVfJrNKWnSw/FZGzEGXFG9sy/px4gEBW1"); + }catch(IOException e){ + throw new RuntimeException(e); + } } } diff --git a/core/src/io/anuke/mindustry/content/Mechs.java b/core/src/io/anuke/mindustry/content/Mechs.java index f738a1c083..8684dd268b 100644 --- a/core/src/io/anuke/mindustry/content/Mechs.java +++ b/core/src/io/anuke/mindustry/content/Mechs.java @@ -194,7 +194,7 @@ public class Mechs implements ContentList{ @Override public void updateAlt(Player player){ - float scl = 1f - player.shootHeat / 2f; + float scl = 1f - player.shootHeat / 2f*Time.delta(); player.velocity().scl(scl); } diff --git a/core/src/io/anuke/mindustry/content/TechTree.java b/core/src/io/anuke/mindustry/content/TechTree.java index 45723688dc..8058a4982b 100644 --- a/core/src/io/anuke/mindustry/content/TechTree.java +++ b/core/src/io/anuke/mindustry/content/TechTree.java @@ -199,6 +199,10 @@ public class TechTree implements ContentList{ node(phaseConduit, () -> { }); + + node(platedConduit, () -> { + + }); }); node(rotaryPump, () -> { @@ -215,8 +219,10 @@ public class TechTree implements ContentList{ node(combustionGenerator, () -> { node(powerNode, () -> { node(powerNodeLarge, () -> { - node(surgeTower, () -> { + node(diode, () -> { + node(surgeTower, () -> { + }); }); }); diff --git a/core/src/io/anuke/mindustry/content/Zones.java b/core/src/io/anuke/mindustry/content/Zones.java index 6c4932e814..ae6598f60c 100644 --- a/core/src/io/anuke/mindustry/content/Zones.java +++ b/core/src/io/anuke/mindustry/content/Zones.java @@ -189,7 +189,6 @@ public class Zones implements ContentList{ startingItems = list(copper, 250, lead, 100); conditionWave = 15; launchPeriod = 10; - requirements = with(new ZoneWave(ruinousShores, 20)); resources = with(copper, scrap, lead, coal, titanium, thorium, sand); requirements = with( new ZoneWave(ruinousShores, 20), diff --git a/core/src/io/anuke/mindustry/core/ContentLoader.java b/core/src/io/anuke/mindustry/core/ContentLoader.java index 99c50e111e..bc4d0dac81 100644 --- a/core/src/io/anuke/mindustry/core/ContentLoader.java +++ b/core/src/io/anuke/mindustry/core/ContentLoader.java @@ -1,7 +1,7 @@ package io.anuke.mindustry.core; import io.anuke.arc.collection.*; -import io.anuke.arc.function.*; +import io.anuke.arc.func.*; import io.anuke.arc.graphics.*; import io.anuke.arc.util.*; import io.anuke.mindustry.content.*; @@ -24,7 +24,7 @@ public class ContentLoader{ private ObjectMap[] contentNameMap = new ObjectMap[ContentType.values().length]; private Array[] contentMap = new Array[ContentType.values().length]; private MappableContent[][] temporaryMapper; - private ObjectSet> initialization = new ObjectSet<>(); + private ObjectSet> initialization = new ObjectSet<>(); private ContentList[] content = { new Fx(), new Items(), @@ -105,13 +105,13 @@ public class ContentLoader{ } /** Initializes all content with the specified function. */ - private void initialize(Consumer callable){ + private void initialize(Cons callable){ if(initialization.contains(callable)) return; for(ContentType type : ContentType.values()){ for(Content content : contentMap[type.ordinal()]){ try{ - callable.accept(content); + callable.get(content); }catch(Throwable e){ if(content.mod != null){ mods.handleError(new ModLoadException(content, e), content.mod); diff --git a/core/src/io/anuke/mindustry/core/Control.java b/core/src/io/anuke/mindustry/core/Control.java index e5d5b2b9ce..b38cc63297 100644 --- a/core/src/io/anuke/mindustry/core/Control.java +++ b/core/src/io/anuke/mindustry/core/Control.java @@ -254,7 +254,7 @@ public class Control implements ApplicationListener, Loadable{ logic.reset(); net.reset(); world.loadGenerator(zone.generator); - zone.rules.accept(state.rules); + zone.rules.get(state.rules); state.rules.zone = zone; for(Tile core : state.teams.get(defaultTeam).cores){ for(ItemStack stack : zone.getStartingItems()){ @@ -302,7 +302,7 @@ public class Control implements ApplicationListener, Loadable{ world.endMapLoad(); - zone.rules.accept(state.rules); + zone.rules.get(state.rules); state.rules.zone = zone; for(Tile core : state.teams.get(defaultTeam).cores){ for(ItemStack stack : zone.getStartingItems()){ diff --git a/core/src/io/anuke/mindustry/core/Logic.java b/core/src/io/anuke/mindustry/core/Logic.java index 959f90b01d..a3f87727de 100644 --- a/core/src/io/anuke/mindustry/core/Logic.java +++ b/core/src/io/anuke/mindustry/core/Logic.java @@ -18,6 +18,8 @@ import io.anuke.mindustry.world.blocks.*; import io.anuke.mindustry.world.blocks.BuildBlock.*; import io.anuke.mindustry.world.blocks.power.*; +import java.util.*; + import static io.anuke.mindustry.Vars.*; /** @@ -79,14 +81,12 @@ public class Logic implements ApplicationListener{ Events.on(BlockBuildEndEvent.class, event -> { if(!event.breaking){ TeamData data = state.teams.get(event.team); - - //painful O(n) iteration + copy - for(int i = 0; i < data.brokenBlocks.size; i++){ - BrokenBlock b = data.brokenBlocks.get(i); + Iterator it = data.brokenBlocks.iterator(); + while(it.hasNext()){ + BrokenBlock b = it.next(); Block block = content.block(b.block); if(event.tile.block().bounds(event.tile.x, event.tile.y, Tmp.r1).overlaps(block.bounds(b.x, b.y, Tmp.r2))){ - data.brokenBlocks.removeIndex(i); - break; + it.remove(); } } } diff --git a/core/src/io/anuke/mindustry/core/NetServer.java b/core/src/io/anuke/mindustry/core/NetServer.java index 437cb10d57..8de0e91fe4 100644 --- a/core/src/io/anuke/mindustry/core/NetServer.java +++ b/core/src/io/anuke/mindustry/core/NetServer.java @@ -292,7 +292,7 @@ public class NetServer implements ApplicationListener{ } //cooldown between votes - int voteTime = 60 * 5; + int voteTime = 60 * 3; Timekeeper vtime = new Timekeeper(voteTime); //current kick sessions VoteSession[] currentlyKicking = {null}; @@ -484,7 +484,7 @@ public class NetServer implements ApplicationListener{ for(BuildRequest req : requests){ if(req == null) continue; Tile tile = world.tile(req.x, req.y); - if(tile == null) continue; + if(tile == null || (!req.breaking && req.block == null)) continue; //auto-skip done requests if(req.breaking && tile.block() == Blocks.air){ continue; diff --git a/core/src/io/anuke/mindustry/core/Platform.java b/core/src/io/anuke/mindustry/core/Platform.java index 588e5081f1..50875d426d 100644 --- a/core/src/io/anuke/mindustry/core/Platform.java +++ b/core/src/io/anuke/mindustry/core/Platform.java @@ -4,7 +4,7 @@ import io.anuke.arc.*; import io.anuke.arc.Input.*; import io.anuke.arc.collection.*; import io.anuke.arc.files.*; -import io.anuke.arc.function.*; +import io.anuke.arc.func.*; import io.anuke.arc.math.*; import io.anuke.arc.scene.ui.*; import io.anuke.arc.util.serialization.*; @@ -96,12 +96,12 @@ public interface Platform{ * @param open Whether to open or save files * @param extension File extension to filter */ - default void showFileChooser(boolean open, String extension, Consumer cons){ + default void showFileChooser(boolean open, String extension, Cons cons){ new FileChooser(open ? "$open" : "$save", file -> file.extension().toLowerCase().equals(extension), open, file -> { if(!open){ - cons.accept(file.parent().child(file.nameWithoutExtension() + "." + extension)); + cons.get(file.parent().child(file.nameWithoutExtension() + "." + extension)); }else{ - cons.accept(file); + cons.get(file); } }).show(); } diff --git a/core/src/io/anuke/mindustry/core/Renderer.java b/core/src/io/anuke/mindustry/core/Renderer.java index fd9c577179..4a50b04275 100644 --- a/core/src/io/anuke/mindustry/core/Renderer.java +++ b/core/src/io/anuke/mindustry/core/Renderer.java @@ -2,7 +2,7 @@ package io.anuke.mindustry.core; import io.anuke.arc.*; import io.anuke.arc.files.*; -import io.anuke.arc.function.*; +import io.anuke.arc.func.*; import io.anuke.arc.graphics.*; import io.anuke.arc.graphics.g2d.*; import io.anuke.arc.graphics.glutils.*; @@ -32,6 +32,7 @@ public class Renderer implements ApplicationListener{ public final BlockRenderer blocks = new BlockRenderer(); public final MinimapRenderer minimap = new MinimapRenderer(); public final OverlayRenderer overlays = new OverlayRenderer(); + public final LightRenderer lights = new LightRenderer(); public final Pixelator pixelator = new Pixelator(); public FrameBuffer shieldBuffer = new FrameBuffer(2, 2); @@ -239,7 +240,7 @@ public class Renderer implements ApplicationListener{ blocks.drawBlocks(Layer.block); blocks.drawFog(); - blocks.drawBroken(); + blocks.drawDestroyed(); Draw.shader(Shaders.blockbuild, true); blocks.drawBlocks(Layer.placement); @@ -256,6 +257,7 @@ public class Renderer implements ApplicationListener{ drawFlyerShadows(); blocks.drawBlocks(Layer.power); + blocks.drawBlocks(Layer.lights); drawAllTeams(true); @@ -298,6 +300,10 @@ public class Renderer implements ApplicationListener{ playerGroup.draw(p -> !p.isDead(), Player::drawName); + if(state.rules.lighting){ + lights.draw(); + } + drawLanding(); Draw.color(); @@ -333,19 +339,19 @@ public class Renderer implements ApplicationListener{ Draw.color(0, 0, 0, 0.4f); float rad = 1.6f; - Consumer draw = u -> { + Cons draw = u -> { float size = Math.max(u.getIconRegion().getWidth(), u.getIconRegion().getHeight()) * Draw.scl; Draw.rect("circle-shadow", u.x, u.y, size * rad, size * rad); }; for(EntityGroup group : unitGroups){ if(!group.isEmpty()){ - group.draw(unit -> !unit.isDead(), draw::accept); + group.draw(unit -> !unit.isDead(), draw::get); } } if(!playerGroup.isEmpty()){ - playerGroup.draw(unit -> !unit.isDead(), draw::accept); + playerGroup.draw(unit -> !unit.isDead(), draw::get); } Draw.color(); diff --git a/core/src/io/anuke/mindustry/core/UI.java b/core/src/io/anuke/mindustry/core/UI.java index ffea7f4a4e..c15917ec51 100644 --- a/core/src/io/anuke/mindustry/core/UI.java +++ b/core/src/io/anuke/mindustry/core/UI.java @@ -12,7 +12,7 @@ import io.anuke.arc.files.*; import io.anuke.arc.freetype.*; import io.anuke.arc.freetype.FreeTypeFontGenerator.*; import io.anuke.arc.freetype.FreetypeFontLoader.*; -import io.anuke.arc.function.*; +import io.anuke.arc.func.*; import io.anuke.arc.graphics.*; import io.anuke.arc.graphics.Texture.*; import io.anuke.arc.graphics.g2d.*; @@ -70,6 +70,7 @@ public class UI implements ApplicationListener, Loadable{ public MinimapDialog minimap; public SchematicsDialog schematics; public ModsDialog mods; + public ColorPicker picker; public Cursor drillCursor, unloadCursor; @@ -211,6 +212,7 @@ public class UI implements ApplicationListener, Loadable{ listfrag = new PlayerListFragment(); loadfrag = new LoadingFragment(); + picker = new ColorPicker(); editor = new MapEditorDialog(); controls = new ControlsDialog(); restart = new GameOverDialog(); @@ -279,7 +281,7 @@ public class UI implements ApplicationListener, Loadable{ }); } - public void showTextInput(String titleText, String dtext, int textLength, String def, boolean inumeric, Consumer confirmed){ + public void showTextInput(String titleText, String dtext, int textLength, String def, boolean inumeric, Cons confirmed){ if(mobile){ Core.input.getTextInput(new TextInput(){{ this.title = (titleText.startsWith("$") ? Core.bundle.get(titleText.substring(1)) : titleText); @@ -296,7 +298,7 @@ public class UI implements ApplicationListener, Loadable{ field.setFilter((f, c) -> field.getText().length() < textLength && filter.acceptChar(f, c)); buttons.defaults().size(120, 54).pad(4); buttons.addButton("$ok", () -> { - confirmed.accept(field.getText()); + confirmed.get(field.getText()); hide(); }).disabled(b -> field.getText().isEmpty()); buttons.addButton("$cancel", this::hide); @@ -304,11 +306,11 @@ public class UI implements ApplicationListener, Loadable{ } } - public void showTextInput(String title, String text, String def, Consumer confirmed){ + public void showTextInput(String title, String text, String def, Cons confirmed){ showTextInput(title, text, 32, def, confirmed); } - public void showTextInput(String titleText, String text, int textLength, String def, Consumer confirmed){ + public void showTextInput(String titleText, String text, int textLength, String def, Cons confirmed){ showTextInput(titleText, text, textLength, def, false, confirmed); } @@ -404,7 +406,7 @@ public class UI implements ApplicationListener, Loadable{ showConfirm(title, text, null, confirmed); } - public void showConfirm(String title, String text, BooleanProvider hide, Runnable confirmed){ + public void showConfirm(String title, String text, Boolp hide, Runnable confirmed){ 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); diff --git a/core/src/io/anuke/mindustry/ctype/UnlockableContent.java b/core/src/io/anuke/mindustry/ctype/UnlockableContent.java index bc43a75d97..9c33b09fb6 100644 --- a/core/src/io/anuke/mindustry/ctype/UnlockableContent.java +++ b/core/src/io/anuke/mindustry/ctype/UnlockableContent.java @@ -67,6 +67,11 @@ public abstract class UnlockableContent extends MappableContent{ return Vars.data.isUnlocked(this); } + /** @return whether this content is unlocked, or the player is in a custom game. */ + public final boolean unlockedCur(){ + return Vars.data.isUnlocked(this) || !Vars.world.isZone(); + } + public final boolean locked(){ return !unlocked(); } diff --git a/core/src/io/anuke/mindustry/editor/EditorTile.java b/core/src/io/anuke/mindustry/editor/EditorTile.java index 6d627399df..91b76b2364 100644 --- a/core/src/io/anuke/mindustry/editor/EditorTile.java +++ b/core/src/io/anuke/mindustry/editor/EditorTile.java @@ -103,6 +103,7 @@ public class EditorTile extends Tile{ return; } + if(floor.isLiquid) return; if(overlayID() == overlay) return; op(OpType.overlay, this.overlay.id); super.setOverlayID(overlay); diff --git a/core/src/io/anuke/mindustry/editor/EditorTool.java b/core/src/io/anuke/mindustry/editor/EditorTool.java index 9da41ad7f2..c38d91b8ed 100644 --- a/core/src/io/anuke/mindustry/editor/EditorTool.java +++ b/core/src/io/anuke/mindustry/editor/EditorTool.java @@ -1,7 +1,7 @@ package io.anuke.mindustry.editor; import io.anuke.arc.collection.IntArray; -import io.anuke.arc.function.*; +import io.anuke.arc.func.*; import io.anuke.arc.math.Mathf; import io.anuke.arc.math.geom.Bresenham2; import io.anuke.arc.util.Structs; @@ -113,8 +113,8 @@ public enum EditorTool{ return; } - Predicate tester; - Consumer setter; + Boolf tester; + Cons setter; if(editor.drawBlock.isOverlay()){ Block dest = tile.overlay(); @@ -146,7 +146,7 @@ public enum EditorTool{ } } - void fill(MapEditor editor, int x, int y, boolean replace, Predicate tester, Consumer filler){ + void fill(MapEditor editor, int x, int y, boolean replace, Boolf tester, Cons filler){ int width = editor.width(), height = editor.height(); if(replace){ @@ -154,8 +154,8 @@ public enum EditorTool{ for(int cx = 0; cx < width; cx++){ for(int cy = 0; cy < height; cy++){ Tile tile = editor.tile(cx, cy); - if(tester.test(tile)){ - filler.accept(tile); + if(tester.get(tile)){ + filler.get(tile); } } } @@ -173,23 +173,23 @@ public enum EditorTool{ y = Pos.y(popped); x1 = x; - while(x1 >= 0 && tester.test(editor.tile(x1, y))) x1--; + while(x1 >= 0 && tester.get(editor.tile(x1, y))) x1--; x1++; boolean spanAbove = false, spanBelow = false; - while(x1 < width && tester.test(editor.tile(x1, y))){ - filler.accept(editor.tile(x1, y)); + while(x1 < width && tester.get(editor.tile(x1, y))){ + filler.get(editor.tile(x1, y)); - if(!spanAbove && y > 0 && tester.test(editor.tile(x1, y - 1))){ + if(!spanAbove && y > 0 && tester.get(editor.tile(x1, y - 1))){ stack.add(Pos.get(x1, y - 1)); spanAbove = true; - }else if(spanAbove && !tester.test(editor.tile(x1, y - 1))){ + }else if(spanAbove && !tester.get(editor.tile(x1, y - 1))){ spanAbove = false; } - if(!spanBelow && y < height - 1 && tester.test(editor.tile(x1, y + 1))){ + if(!spanBelow && y < height - 1 && tester.get(editor.tile(x1, y + 1))){ stack.add(Pos.get(x1, y + 1)); spanBelow = true; - }else if(spanBelow && y < height - 1 && !tester.test(editor.tile(x1, y + 1))){ + }else if(spanBelow && y < height - 1 && !tester.get(editor.tile(x1, y + 1))){ spanBelow = false; } x1++; diff --git a/core/src/io/anuke/mindustry/editor/MapEditor.java b/core/src/io/anuke/mindustry/editor/MapEditor.java index ec32a94594..d8e8d60206 100644 --- a/core/src/io/anuke/mindustry/editor/MapEditor.java +++ b/core/src/io/anuke/mindustry/editor/MapEditor.java @@ -2,8 +2,8 @@ package io.anuke.mindustry.editor; import io.anuke.arc.collection.StringMap; import io.anuke.arc.files.FileHandle; -import io.anuke.arc.function.Consumer; -import io.anuke.arc.function.Predicate; +import io.anuke.arc.func.Cons; +import io.anuke.arc.func.Boolf; import io.anuke.arc.graphics.Pixmap; import io.anuke.arc.math.Mathf; import io.anuke.arc.util.Structs; @@ -144,11 +144,11 @@ public class MapEditor{ drawBlocks(x, y, false, tile -> true); } - public void drawBlocks(int x, int y, Predicate tester){ + public void drawBlocks(int x, int y, Boolf tester){ drawBlocks(x, y, false, tester); } - public void drawBlocks(int x, int y, boolean square, Predicate tester){ + public void drawBlocks(int x, int y, boolean square, Boolf tester){ if(drawBlock.isMultiblock()){ x = Mathf.clamp(x, (drawBlock.size - 1) / 2, width() - drawBlock.size / 2 - 1); y = Mathf.clamp(y, (drawBlock.size - 1) / 2, height() - drawBlock.size / 2 - 1); @@ -180,8 +180,8 @@ public class MapEditor{ }else{ boolean isFloor = drawBlock.isFloor() && drawBlock != Blocks.air; - Consumer drawer = tile -> { - if(!tester.test(tile)) return; + Cons drawer = tile -> { + if(!tester.get(tile)) return; //remove linked tiles blocking the way if(!isFloor && (tile.isLinked() || tile.block().isMultiblock())){ @@ -209,7 +209,7 @@ public class MapEditor{ } } - public void drawCircle(int x, int y, Consumer drawer){ + public void drawCircle(int x, int y, Cons drawer){ for(int rx = -brushSize; rx <= brushSize; rx++){ for(int ry = -brushSize; ry <= brushSize; ry++){ if(Mathf.dst2(rx, ry) <= (brushSize - 0.5f) * (brushSize - 0.5f)){ @@ -219,13 +219,13 @@ public class MapEditor{ continue; } - drawer.accept(tile(wx, wy)); + drawer.get(tile(wx, wy)); } } } } - public void drawSquare(int x, int y, Consumer drawer){ + public void drawSquare(int x, int y, Cons drawer){ for(int rx = -brushSize; rx <= brushSize; rx++){ for(int ry = -brushSize; ry <= brushSize; ry++){ int wx = x + rx, wy = y + ry; @@ -234,7 +234,7 @@ public class MapEditor{ continue; } - drawer.accept(tile(wx, wy)); + drawer.get(tile(wx, wy)); } } } diff --git a/core/src/io/anuke/mindustry/editor/MapEditorDialog.java b/core/src/io/anuke/mindustry/editor/MapEditorDialog.java index 0bcd4fa80b..6c24f387a9 100644 --- a/core/src/io/anuke/mindustry/editor/MapEditorDialog.java +++ b/core/src/io/anuke/mindustry/editor/MapEditorDialog.java @@ -3,7 +3,7 @@ package io.anuke.mindustry.editor; import io.anuke.arc.*; import io.anuke.arc.collection.*; import io.anuke.arc.files.*; -import io.anuke.arc.function.*; +import io.anuke.arc.func.*; import io.anuke.arc.graphics.*; import io.anuke.arc.graphics.g2d.*; import io.anuke.arc.input.*; @@ -425,7 +425,7 @@ public class MapEditorDialog extends Dialog implements Disposable{ ButtonGroup group = new ButtonGroup<>(); Table[] lastTable = {null}; - Consumer addTool = tool -> { + Cons addTool = tool -> { ImageButton button = new ImageButton(Core.atlas.drawable("icon-" + tool.name() + "-small"), Styles.clearTogglei); button.clicked(() -> { @@ -507,14 +507,14 @@ public class MapEditorDialog extends Dialog implements Disposable{ ImageButton grid = tools.addImageButton(Icon.gridSmall, Styles.clearTogglei, () -> view.setGrid(!view.isGrid())).get(); - addTool.accept(EditorTool.zoom); + addTool.get(EditorTool.zoom); tools.row(); ImageButton undo = tools.addImageButton(Icon.undoSmall, Styles.cleari, editor::undo).get(); ImageButton redo = tools.addImageButton(Icon.redoSmall, Styles.cleari, editor::redo).get(); - addTool.accept(EditorTool.pick); + addTool.get(EditorTool.pick); tools.row(); @@ -525,14 +525,14 @@ public class MapEditorDialog extends Dialog implements Disposable{ redo.update(() -> redo.getImage().setColor(redo.isDisabled() ? Color.gray : Color.white)); grid.update(() -> grid.setChecked(view.isGrid())); - addTool.accept(EditorTool.line); - addTool.accept(EditorTool.pencil); - addTool.accept(EditorTool.eraser); + addTool.get(EditorTool.line); + addTool.get(EditorTool.pencil); + addTool.get(EditorTool.eraser); tools.row(); - addTool.accept(EditorTool.fill); - addTool.accept(EditorTool.spray); + addTool.get(EditorTool.fill); + addTool.get(EditorTool.spray); ImageButton rotate = tools.addImageButton(Icon.arrow16Small, Styles.cleari, () -> editor.rotation = (editor.rotation + 1) % 4).get(); rotate.getImage().update(() -> { diff --git a/core/src/io/anuke/mindustry/editor/MapGenerateDialog.java b/core/src/io/anuke/mindustry/editor/MapGenerateDialog.java index dd1f77811e..5195d746b4 100644 --- a/core/src/io/anuke/mindustry/editor/MapGenerateDialog.java +++ b/core/src/io/anuke/mindustry/editor/MapGenerateDialog.java @@ -2,7 +2,7 @@ package io.anuke.mindustry.editor; import io.anuke.arc.*; import io.anuke.arc.collection.*; -import io.anuke.arc.function.*; +import io.anuke.arc.func.*; import io.anuke.arc.graphics.*; import io.anuke.arc.graphics.Pixmap.*; import io.anuke.arc.math.*; @@ -27,7 +27,7 @@ import static io.anuke.mindustry.Vars.*; @SuppressWarnings("unchecked") public class MapGenerateDialog extends FloatingDialog{ - private final Supplier[] filterTypes = new Supplier[]{ + private final Prov[] filterTypes = new Prov[]{ NoiseFilter::new, ScatterFilter::new, TerrainFilter::new, DistortFilter::new, RiverNoiseFilter::new, OreFilter::new, OreMedianFilter::new, MedianFilter::new, BlendFilter::new, MirrorFilter::new, ClearFilter::new @@ -48,7 +48,7 @@ public class MapGenerateDialog extends FloatingDialog{ private GenTile returnTile = new GenTile(); private GenTile[][] buffer1, buffer2; - private Consumer> applier; + private Cons> applier; private CachedTile ctile = new CachedTile(){ //nothing. @Override @@ -95,13 +95,13 @@ public class MapGenerateDialog extends FloatingDialog{ onResize(this::rebuildFilters); } - public void show(Array filters, Consumer> applier){ + public void show(Array filters, Cons> applier){ this.filters = filters; this.applier = applier; show(); } - public void show(Consumer> applier){ + public void show(Cons> applier){ show(this.filters, applier); } @@ -289,7 +289,7 @@ public class MapGenerateDialog extends FloatingDialog{ selection.setFillParent(false); selection.cont.defaults().size(210f, 60f); int i = 0; - for(Supplier gen : filterTypes){ + for(Prov gen : filterTypes){ GenerateFilter filter = gen.get(); if(!applied && filter.buffered) continue; @@ -334,7 +334,7 @@ public class MapGenerateDialog extends FloatingDialog{ texture = null; } - applier.accept(filters); + applier.get(filters); } void update(){ diff --git a/core/src/io/anuke/mindustry/editor/MapLoadDialog.java b/core/src/io/anuke/mindustry/editor/MapLoadDialog.java index c0567a724c..5fb9ffa982 100644 --- a/core/src/io/anuke/mindustry/editor/MapLoadDialog.java +++ b/core/src/io/anuke/mindustry/editor/MapLoadDialog.java @@ -1,6 +1,6 @@ package io.anuke.mindustry.editor; -import io.anuke.arc.function.*; +import io.anuke.arc.func.*; import io.anuke.arc.scene.ui.*; import io.anuke.arc.scene.ui.layout.*; import io.anuke.arc.util.*; @@ -13,7 +13,7 @@ import static io.anuke.mindustry.Vars.maps; public class MapLoadDialog extends FloatingDialog{ private Map selected = null; - public MapLoadDialog(Consumer loader){ + public MapLoadDialog(Cons loader){ super("$editor.loadmap"); shown(this::rebuild); @@ -22,7 +22,7 @@ public class MapLoadDialog extends FloatingDialog{ button.setDisabled(() -> selected == null); button.clicked(() -> { if(selected != null){ - loader.accept(selected); + loader.get(selected); hide(); } }); diff --git a/core/src/io/anuke/mindustry/editor/MapResizeDialog.java b/core/src/io/anuke/mindustry/editor/MapResizeDialog.java index 3284feda19..525adcefde 100644 --- a/core/src/io/anuke/mindustry/editor/MapResizeDialog.java +++ b/core/src/io/anuke/mindustry/editor/MapResizeDialog.java @@ -1,6 +1,6 @@ package io.anuke.mindustry.editor; -import io.anuke.arc.function.*; +import io.anuke.arc.func.*; import io.anuke.arc.math.*; import io.anuke.arc.scene.ui.layout.*; import io.anuke.mindustry.gen.*; @@ -10,7 +10,7 @@ public class MapResizeDialog extends FloatingDialog{ private static final int minSize = 50, maxSize = 500, increment = 50; int width, height; - public MapResizeDialog(MapEditor editor, IntPositionConsumer cons){ + public MapResizeDialog(MapEditor editor, Intc2 cons){ super("$editor.resizemap"); shown(() -> { cont.clear(); @@ -47,7 +47,7 @@ public class MapResizeDialog extends FloatingDialog{ buttons.defaults().size(200f, 50f); buttons.addButton("$cancel", this::hide); buttons.addButton("$ok", () -> { - cons.accept(width, height); + cons.get(width, height); hide(); }); } diff --git a/core/src/io/anuke/mindustry/editor/MapSaveDialog.java b/core/src/io/anuke/mindustry/editor/MapSaveDialog.java index d0f8ce77ae..93b189349f 100644 --- a/core/src/io/anuke/mindustry/editor/MapSaveDialog.java +++ b/core/src/io/anuke/mindustry/editor/MapSaveDialog.java @@ -1,6 +1,6 @@ package io.anuke.mindustry.editor; -import io.anuke.arc.function.*; +import io.anuke.arc.func.*; import io.anuke.arc.scene.ui.*; import io.anuke.mindustry.*; import io.anuke.mindustry.maps.*; @@ -10,9 +10,9 @@ import static io.anuke.mindustry.Vars.ui; public class MapSaveDialog extends FloatingDialog{ private TextField field; - private Consumer listener; + private Cons listener; - public MapSaveDialog(Consumer cons){ + public MapSaveDialog(Cons cons){ super("$editor.savemap"); field = new TextField(); listener = cons; @@ -43,7 +43,7 @@ public class MapSaveDialog extends FloatingDialog{ TextButton button = new TextButton("$save"); button.clicked(() -> { if(!invalid()){ - cons.accept(field.getText()); + cons.get(field.getText()); hide(); } }); @@ -53,7 +53,7 @@ public class MapSaveDialog extends FloatingDialog{ public void save(){ if(!invalid()){ - listener.accept(field.getText()); + listener.get(field.getText()); }else{ ui.showErrorMessage("$editor.failoverwrite"); } diff --git a/core/src/io/anuke/mindustry/editor/WaveInfoDialog.java b/core/src/io/anuke/mindustry/editor/WaveInfoDialog.java index fa94b6b2f2..37f55cb775 100644 --- a/core/src/io/anuke/mindustry/editor/WaveInfoDialog.java +++ b/core/src/io/anuke/mindustry/editor/WaveInfoDialog.java @@ -186,7 +186,7 @@ public class WaveInfoDialog extends FloatingDialog{ }).width(80f); a.add(" + "); - a.addField(Strings.fixed(Math.max((Mathf.isZero(group.unitScaling) ? 0 : 1f / group.unitScaling), 0), 2), TextFieldFilter.floatsOnly, text -> { + a.addField(Strings.fixed(Math.max((Mathf.zero(group.unitScaling) ? 0 : 1f / group.unitScaling), 0), 2), TextFieldFilter.floatsOnly, text -> { if(Strings.canParsePositiveFloat(text)){ group.unitScaling = 1f / Strings.parseFloat(text); updateWaves(); @@ -217,21 +217,23 @@ public class WaveInfoDialog extends FloatingDialog{ void showUpdate(SpawnGroup group){ FloatingDialog dialog = new FloatingDialog(""); - dialog.setFillParent(false); - int i = 0; - for(UnitType type : content.units()){ - dialog.cont.addButton(t -> { - t.left(); - t.addImage(type.icon(io.anuke.mindustry.ui.Cicon.medium)).size(40f).padRight(2f); - t.add(type.localizedName); - }, () -> { - lastType = type; - group.type = type; - dialog.hide(); - buildGroups(); - }).pad(2).margin(12f).fillX(); - if(++i % 3 == 0) dialog.cont.row(); - } + dialog.setFillParent(true); + dialog.cont.pane(p -> { + int i = 0; + for(UnitType type : content.units()){ + p.addButton(t -> { + t.left(); + t.addImage(type.icon(io.anuke.mindustry.ui.Cicon.medium)).size(40f).padRight(2f); + t.add(type.localizedName); + }, () -> { + lastType = type; + group.type = type; + dialog.hide(); + buildGroups(); + }).pad(2).margin(12f).fillX(); + if(++i % 3 == 0) p.row(); + } + }); dialog.show(); } diff --git a/core/src/io/anuke/mindustry/entities/Damage.java b/core/src/io/anuke/mindustry/entities/Damage.java index dfe339bb44..149bb9b4d8 100644 --- a/core/src/io/anuke/mindustry/entities/Damage.java +++ b/core/src/io/anuke/mindustry/entities/Damage.java @@ -1,26 +1,22 @@ package io.anuke.mindustry.entities; -import io.anuke.annotations.Annotations.Struct; +import io.anuke.annotations.Annotations.*; import io.anuke.arc.*; import io.anuke.arc.collection.*; -import io.anuke.arc.function.*; -import io.anuke.arc.graphics.Color; -import io.anuke.arc.math.Mathf; +import io.anuke.arc.func.*; +import io.anuke.arc.graphics.*; +import io.anuke.arc.math.*; import io.anuke.arc.math.geom.*; import io.anuke.arc.util.*; -import io.anuke.mindustry.content.Bullets; -import io.anuke.mindustry.content.Fx; -import io.anuke.mindustry.entities.Effects.Effect; -import io.anuke.mindustry.entities.type.Bullet; -import io.anuke.mindustry.entities.effect.Fire; -import io.anuke.mindustry.entities.effect.Lightning; -import io.anuke.mindustry.entities.type.Unit; +import io.anuke.mindustry.content.*; +import io.anuke.mindustry.entities.Effects.*; +import io.anuke.mindustry.entities.effect.*; +import io.anuke.mindustry.entities.type.*; import io.anuke.mindustry.game.EventType.*; -import io.anuke.mindustry.game.Team; -import io.anuke.mindustry.gen.Call; -import io.anuke.mindustry.gen.PropCell; -import io.anuke.mindustry.graphics.Pal; -import io.anuke.mindustry.world.Tile; +import io.anuke.mindustry.game.*; +import io.anuke.mindustry.gen.*; +import io.anuke.mindustry.graphics.*; +import io.anuke.mindustry.world.*; import static io.anuke.mindustry.Vars.*; @@ -90,7 +86,7 @@ public class Damage{ public static void collideLine(Bullet hitter, Team team, Effect effect, float x, float y, float angle, float length, boolean large){ collidedBlocks.clear(); tr.trns(angle, length); - IntPositionConsumer collider = (cx, cy) -> { + Intc2 collider = (cx, cy) -> { Tile tile = world.ltile(cx, cy); if(tile != null && !collidedBlocks.contains(tile.pos()) && tile.entity != null && tile.getTeamID() != team.ordinal() && tile.entity.collide(hitter)){ tile.entity.collision(hitter); @@ -100,10 +96,10 @@ public class Damage{ }; world.raycastEachWorld(x, y, x + tr.x, y + tr.y, (cx, cy) -> { - collider.accept(cx, cy); + collider.get(cx, cy); if(large){ for(Point2 p : Geometry.d4){ - collider.accept(cx + p.x, cy + p.y); + collider.get(cx + p.x, cy + p.y); } } return false; @@ -129,7 +125,7 @@ public class Damage{ rect.width += expand * 2; rect.height += expand * 2; - Consumer cons = e -> { + Cons cons = e -> { e.hitbox(hitrect); Rectangle other = hitrect; other.y -= expand; @@ -150,16 +146,16 @@ public class Damage{ } /** Damages all entities and blocks in a radius that are enemies of the team. */ - public static void damageUnits(Team team, float x, float y, float size, float damage, Predicate predicate, Consumer acceptor){ - Consumer cons = entity -> { - if(!predicate.test(entity)) return; + public static void damageUnits(Team team, float x, float y, float size, float damage, Boolf predicate, Cons acceptor){ + Cons cons = entity -> { + if(!predicate.get(entity)) return; entity.hitbox(hitrect); if(!hitrect.overlaps(rect)){ return; } entity.damage(damage); - acceptor.accept(entity); + acceptor.get(entity); }; rect.setSize(size * 2).setCenter(x, y); @@ -182,7 +178,7 @@ public class Damage{ /** Damages all entities and blocks in a radius that are enemies of the team. */ public static void damage(Team team, float x, float y, float radius, float damage, boolean complete){ - Consumer cons = entity -> { + Cons cons = entity -> { if(entity.getTeam() == team || entity.dst(x, y) > radius){ return; } diff --git a/core/src/io/anuke/mindustry/entities/Effects.java b/core/src/io/anuke/mindustry/entities/Effects.java index 62bcd9a3ce..2647fc2427 100644 --- a/core/src/io/anuke/mindustry/entities/Effects.java +++ b/core/src/io/anuke/mindustry/entities/Effects.java @@ -2,7 +2,7 @@ package io.anuke.mindustry.entities; import io.anuke.arc.Core; import io.anuke.arc.collection.Array; -import io.anuke.arc.function.Consumer; +import io.anuke.arc.func.Cons; import io.anuke.arc.graphics.Color; import io.anuke.arc.math.Mathf; import io.anuke.arc.math.geom.Position; @@ -142,11 +142,11 @@ public class Effects{ this.data = data; } - public void scaled(float lifetime, Consumer cons){ + public void scaled(float lifetime, Cons cons){ if(innerContainer == null) innerContainer = new EffectContainer(); if(time <= lifetime){ innerContainer.set(id, color, time, lifetime, rotation, x, y, data); - cons.accept(innerContainer); + cons.get(innerContainer); } } diff --git a/core/src/io/anuke/mindustry/entities/EntityGroup.java b/core/src/io/anuke/mindustry/entities/EntityGroup.java index 07057d0436..588bca2709 100644 --- a/core/src/io/anuke/mindustry/entities/EntityGroup.java +++ b/core/src/io/anuke/mindustry/entities/EntityGroup.java @@ -2,7 +2,7 @@ package io.anuke.mindustry.entities; import io.anuke.arc.*; import io.anuke.arc.collection.*; -import io.anuke.arc.function.*; +import io.anuke.arc.func.*; import io.anuke.arc.graphics.*; import io.anuke.arc.math.geom.*; import io.anuke.mindustry.entities.traits.*; @@ -22,8 +22,8 @@ public class EntityGroup{ private final Rectangle intersectRect = new Rectangle(); private IntMap map; private QuadTree tree; - private Consumer removeListener; - private Consumer addListener; + private Cons removeListener; + private Cons addListener; private final Rectangle viewport = new Rectangle(); private int count = 0; @@ -60,20 +60,20 @@ public class EntityGroup{ draw(e -> true); } - public void draw(Predicate toDraw){ + public void draw(Boolf toDraw){ draw(toDraw, t -> ((DrawTrait)t).draw()); } - public void draw(Predicate toDraw, Consumer cons){ + public void draw(Boolf toDraw, Cons cons){ Camera cam = Core.camera; viewport.set(cam.position.x - cam.width / 2, cam.position.y - cam.height / 2, cam.width, cam.height); for(Entity e : all()){ - if(!(e instanceof DrawTrait) || !toDraw.test((T)e) || !e.isAdded()) continue; + if(!(e instanceof DrawTrait) || !toDraw.get((T)e) || !e.isAdded()) continue; DrawTrait draw = (DrawTrait)e; if(viewport.overlaps(draw.getX() - draw.drawSize()/2f, draw.getY() - draw.drawSize()/2f, draw.drawSize(), draw.drawSize())){ - cons.accept((T)e); + cons.get((T)e); } } } @@ -82,11 +82,11 @@ public class EntityGroup{ return useTree; } - public void setRemoveListener(Consumer removeListener){ + public void setRemoveListener(Cons removeListener){ this.removeListener = removeListener; } - public void setAddListener(Consumer addListener){ + public void setAddListener(Cons addListener){ this.addListener = addListener; } @@ -148,7 +148,7 @@ public class EntityGroup{ if(check.getID() == id){ //if it is indeed queued, remove it entitiesToAdd.removeValue(check, true); if(removeListener != null){ - removeListener.accept(check); + removeListener.get(check); } break; } @@ -157,7 +157,7 @@ public class EntityGroup{ } @SuppressWarnings("unchecked") - public void intersect(float x, float y, float width, float height, Consumer out){ + public void intersect(float x, float y, float width, float height, Cons out){ //don't waste time for empty groups if(isEmpty()) return; tree().getIntersect(out, x, y, width, height); @@ -192,10 +192,10 @@ public class EntityGroup{ return entityArray.size; } - public int count(Predicate pred){ + public int count(Boolf pred){ int count = 0; for(int i = 0; i < entityArray.size; i++){ - if(pred.test(entityArray.get(i))) count++; + if(pred.get(entityArray.get(i))) count++; } return count; } @@ -211,7 +211,7 @@ public class EntityGroup{ } if(addListener != null){ - addListener.accept(type); + addListener.get(type); } } @@ -221,7 +221,7 @@ public class EntityGroup{ entitiesToRemove.add(type); if(removeListener != null){ - removeListener.accept(type); + removeListener.get(type); } } @@ -244,10 +244,10 @@ public class EntityGroup{ map.clear(); } - public T find(Predicate pred){ + public T find(Boolf pred){ for(int i = 0; i < entityArray.size; i++){ - if(pred.test(entityArray.get(i))) return entityArray.get(i); + if(pred.get(entityArray.get(i))) return entityArray.get(i); } return null; diff --git a/core/src/io/anuke/mindustry/entities/Units.java b/core/src/io/anuke/mindustry/entities/Units.java index c9d0073998..df4ba980df 100644 --- a/core/src/io/anuke/mindustry/entities/Units.java +++ b/core/src/io/anuke/mindustry/entities/Units.java @@ -1,8 +1,8 @@ package io.anuke.mindustry.entities; import io.anuke.arc.collection.EnumSet; -import io.anuke.arc.function.Consumer; -import io.anuke.arc.function.Predicate; +import io.anuke.arc.func.Cons; +import io.anuke.arc.func.Boolf; import io.anuke.arc.math.Mathf; import io.anuke.arc.math.geom.Geometry; import io.anuke.arc.math.geom.Rectangle; @@ -78,12 +78,12 @@ public class Units{ } /** Returns the neareset ally tile in a range. */ - public static TileEntity findAllyTile(Team team, float x, float y, float range, Predicate pred){ + public static TileEntity findAllyTile(Team team, float x, float y, float range, Boolf pred){ return indexer.findTile(team, x, y, range, pred); } /** Returns the neareset enemy tile in a range. */ - public static TileEntity findEnemyTile(Team team, float x, float y, float range, Predicate pred){ + public static TileEntity findEnemyTile(Team team, float x, float y, float range, Boolf pred){ if(team == Team.derelict) return null; for(Team enemy : state.teams.enemiesOf(team)){ @@ -101,12 +101,12 @@ public class Units{ } /** Returns the closest target enemy. First, units are checked, then tile entities. */ - public static TargetTrait closestTarget(Team team, float x, float y, float range, Predicate unitPred){ + public static TargetTrait closestTarget(Team team, float x, float y, float range, Boolf unitPred){ return closestTarget(team, x, y, range, unitPred, t -> true); } /** Returns the closest target enemy. First, units are checked, then tile entities. */ - public static TargetTrait closestTarget(Team team, float x, float y, float range, Predicate unitPred, Predicate tilePred){ + public static TargetTrait closestTarget(Team team, float x, float y, float range, Boolf unitPred, Boolf tilePred){ if(team == Team.derelict) return null; Unit unit = closestEnemy(team, x, y, range, unitPred); @@ -118,14 +118,14 @@ public class Units{ } /** Returns the closest enemy of this team. Filter by predicate. */ - public static Unit closestEnemy(Team team, float x, float y, float range, Predicate predicate){ + public static Unit closestEnemy(Team team, float x, float y, float range, Boolf predicate){ if(team == Team.derelict) return null; result = null; cdist = 0f; nearbyEnemies(team, x - range, y - range, range*2f, range*2f, e -> { - if(e.isDead() || !predicate.test(e)) return; + if(e.isDead() || !predicate.get(e)) return; float dst2 = Mathf.dst2(e.x, e.y, x, y); if(dst2 < range*range && (result == null || dst2 < cdist)){ @@ -138,12 +138,12 @@ public class Units{ } /** Returns the closest ally of this team. Filter by predicate. */ - public static Unit closest(Team team, float x, float y, float range, Predicate predicate){ + public static Unit closest(Team team, float x, float y, float range, Boolf predicate){ result = null; cdist = 0f; nearby(team, x, y, range, e -> { - if(!predicate.test(e)) return; + if(!predicate.get(e)) return; float dist = Mathf.dst2(e.x, e.y, x, y); if(result == null || dist < cdist){ @@ -156,32 +156,32 @@ public class Units{ } /** Iterates over all units in a rectangle. */ - public static void nearby(Team team, float x, float y, float width, float height, Consumer cons){ + public static void nearby(Team team, float x, float y, float width, float height, Cons cons){ unitGroups[team.ordinal()].intersect(x, y, width, height, cons); playerGroup.intersect(x, y, width, height, player -> { if(player.getTeam() == team){ - cons.accept(player); + cons.get(player); } }); } /** Iterates over all units in a circle around this position. */ - public static void nearby(Team team, float x, float y, float radius, Consumer cons){ + public static void nearby(Team team, float x, float y, float radius, Cons cons){ unitGroups[team.ordinal()].intersect(x - radius, y - radius, radius*2f, radius*2f, unit -> { if(unit.withinDst(x, y, radius)){ - cons.accept(unit); + cons.get(unit); } }); playerGroup.intersect(x - radius, y - radius, radius*2f, radius*2f, unit -> { if(unit.getTeam() == team && unit.withinDst(x, y, radius)){ - cons.accept(unit); + cons.get(unit); } }); } /** Iterates over all units in a rectangle. */ - public static void nearby(float x, float y, float width, float height, Consumer cons){ + public static void nearby(float x, float y, float width, float height, Cons cons){ for(Team team : Team.all){ unitGroups[team.ordinal()].intersect(x, y, width, height, cons); } @@ -190,12 +190,12 @@ public class Units{ } /** Iterates over all units in a rectangle. */ - public static void nearby(Rectangle rect, Consumer cons){ + public static void nearby(Rectangle rect, Cons cons){ nearby(rect.x, rect.y, rect.width, rect.height, cons); } /** Iterates over all units that are enemies of this team. */ - public static void nearbyEnemies(Team team, float x, float y, float width, float height, Consumer cons){ + public static void nearbyEnemies(Team team, float x, float y, float width, float height, Cons cons){ EnumSet targets = state.teams.enemiesOf(team); for(Team other : targets){ @@ -204,18 +204,18 @@ public class Units{ playerGroup.intersect(x, y, width, height, player -> { if(targets.contains(player.getTeam())){ - cons.accept(player); + cons.get(player); } }); } /** Iterates over all units that are enemies of this team. */ - public static void nearbyEnemies(Team team, Rectangle rect, Consumer cons){ + public static void nearbyEnemies(Team team, Rectangle rect, Cons cons){ nearbyEnemies(team, rect.x, rect.y, rect.width, rect.height, cons); } /** Iterates over all units. */ - public static void all(Consumer cons){ + public static void all(Cons cons){ for(Team team : Team.all){ unitGroups[team.ordinal()].all().each(cons); } diff --git a/core/src/io/anuke/mindustry/entities/bullet/FlakBulletType.java b/core/src/io/anuke/mindustry/entities/bullet/FlakBulletType.java index c6e2928b28..e53be5fcf2 100644 --- a/core/src/io/anuke/mindustry/entities/bullet/FlakBulletType.java +++ b/core/src/io/anuke/mindustry/entities/bullet/FlakBulletType.java @@ -6,7 +6,7 @@ import io.anuke.mindustry.content.Fx; import io.anuke.mindustry.entities.Units; import io.anuke.mindustry.entities.type.Bullet; -public abstract class FlakBulletType extends BasicBulletType{ +public class FlakBulletType extends BasicBulletType{ protected static Rectangle rect = new Rectangle(); protected float explodeRange = 30f; diff --git a/core/src/io/anuke/mindustry/entities/bullet/MissileBulletType.java b/core/src/io/anuke/mindustry/entities/bullet/MissileBulletType.java index aee06f9e31..6bea5404cb 100644 --- a/core/src/io/anuke/mindustry/entities/bullet/MissileBulletType.java +++ b/core/src/io/anuke/mindustry/entities/bullet/MissileBulletType.java @@ -36,7 +36,7 @@ public class MissileBulletType extends BasicBulletType{ } if(weaveMag > 0){ - b.velocity().rotate(Mathf.sin(Time.time() + b.id * 4422, weaveScale, weaveMag)); + b.velocity().rotate(Mathf.sin(Time.time() + b.id * 4422, weaveScale, weaveMag) * Time.delta()); } } } diff --git a/core/src/io/anuke/mindustry/entities/effect/Puddle.java b/core/src/io/anuke/mindustry/entities/effect/Puddle.java index 56d326c41b..e7f1330a10 100644 --- a/core/src/io/anuke/mindustry/entities/effect/Puddle.java +++ b/core/src/io/anuke/mindustry/entities/effect/Puddle.java @@ -237,6 +237,12 @@ public class Puddle extends SolidEntity implements SaveTrait, Poolable, DrawTrai seeds++; }); Draw.color(); + + if(liquid.lightColor.a > 0.001f && f > 0){ + Color color = liquid.lightColor; + float opacity = color.a * f; + renderer.lights.add(tile.drawx(), tile.drawy(), 30f * f, color, opacity * 0.8f); + } } @Override diff --git a/core/src/io/anuke/mindustry/entities/traits/BuilderTrait.java b/core/src/io/anuke/mindustry/entities/traits/BuilderTrait.java index 35205daa42..8cde4852c7 100644 --- a/core/src/io/anuke/mindustry/entities/traits/BuilderTrait.java +++ b/core/src/io/anuke/mindustry/entities/traits/BuilderTrait.java @@ -34,39 +34,38 @@ public interface BuilderTrait extends Entity, TeamTrait{ default void updateBuilding(){ float finalPlaceDst = state.rules.infiniteResources ? Float.MAX_VALUE : placeDistance; Unit unit = (Unit)this; + //remove already completed build requests removal.clear(); - for(BuildRequest req : buildQueue()){ - removal.add(req); - } + removal.addAll(buildQueue()); - buildQueue().clear(); + Structs.filter(buildQueue(), req -> { + 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); + }); - for(BuildRequest request : removal){ - Tile tile = world.tile(request.x, request.y); + TileEntity core = unit.getClosestCore(); - if(!(tile == null || (request.breaking && tile.block() == Blocks.air) || - (!request.breaking && (tile.rotation() == request.rotation || !request.block.rotate) && tile.block() == request.block))){ - buildQueue().addLast(request); + //nothing to build. + if(buildRequest() == null) return; + + //find the next build request + if(buildQueue().size > 1){ + int total = 0; + BuildRequest req; + while((dst((req = buildRequest()).tile()) > finalPlaceDst || shouldSkip(req, core)) && total < buildQueue().size){ + buildQueue().removeFirst(); + buildQueue().addLast(req); + total++; } } BuildRequest current = buildRequest(); - if(current == null){ - return; - } + if(dst(current.tile()) > finalPlaceDst) return; Tile tile = world.tile(current.x, current.y); - if(dst(tile) > finalPlaceDst){ - if(buildQueue().size > 1){ - buildQueue().removeFirst(); - buildQueue().addLast(current); - } - return; - } - if(!(tile.block() instanceof BuildBlock)){ if(!current.initialized && canCreateBlocks() && !current.breaking && Build.validPlace(getTeam(), current.x, current.y, current.block, current.rotation)){ Call.beginPlace(getTeam(), current.x, current.y, current.block, current.rotation); @@ -78,8 +77,6 @@ public interface BuilderTrait extends Entity, TeamTrait{ } } - TileEntity core = unit.getClosestCore(); - if(tile.entity instanceof BuildEntity && !current.initialized){ Core.app.post(() -> Events.fire(new BuildSelectEvent(tile, unit.getTeam(), this, current.breaking))); current.initialized = true; @@ -111,9 +108,17 @@ public interface BuilderTrait extends Entity, TeamTrait{ } } + current.stuck = Mathf.equal(current.progress, entity.progress); current.progress = entity.progress; } + /** @return whether this request should be skipped, in favor of the next one. */ + default boolean shouldSkip(BuildRequest request, @Nullable TileEntity core){ + //requests that you have at least *started* are considered + if(state.rules.infiniteResources || request.breaking || !request.initialized || core == null) return false; + return request.stuck && !core.items.has(request.block.requirements); + } + /** Returns the queue for storing build requests. */ Queue buildQueue(); @@ -287,8 +292,8 @@ public interface BuilderTrait extends Entity, TeamTrait{ /** Last progress.*/ public float progress; - /** Whether construction has started for this request.*/ - public boolean initialized, worldContext = true; + /** Whether construction has started for this request, and other special variables.*/ + public boolean initialized, worldContext = true, stuck; /** Visual scale. Used only for rendering.*/ public float animScale = 0f; diff --git a/core/src/io/anuke/mindustry/entities/type/Bullet.java b/core/src/io/anuke/mindustry/entities/type/Bullet.java index a1f4831f66..a5c3d21697 100644 --- a/core/src/io/anuke/mindustry/entities/type/Bullet.java +++ b/core/src/io/anuke/mindustry/entities/type/Bullet.java @@ -11,6 +11,7 @@ import io.anuke.mindustry.entities.bullet.*; import io.anuke.mindustry.entities.effect.*; import io.anuke.mindustry.entities.traits.*; import io.anuke.mindustry.game.*; +import io.anuke.mindustry.graphics.*; import io.anuke.mindustry.world.*; import static io.anuke.mindustry.Vars.*; @@ -294,6 +295,7 @@ public class Bullet extends SolidEntity implements DamageTrait, ScaleTrait, Pool @Override public void draw(){ type.draw(this); + renderer.lights.add(x, y, 16f, Pal.powerLight, 0.3f); } @Override diff --git a/core/src/io/anuke/mindustry/entities/type/Player.java b/core/src/io/anuke/mindustry/entities/type/Player.java index 80c9cded3a..4e83cd1091 100644 --- a/core/src/io/anuke/mindustry/entities/type/Player.java +++ b/core/src/io/anuke/mindustry/entities/type/Player.java @@ -24,9 +24,7 @@ import io.anuke.mindustry.io.*; import io.anuke.mindustry.net.Administration.*; import io.anuke.mindustry.net.*; import io.anuke.mindustry.type.*; -import io.anuke.mindustry.type.TypeID; import io.anuke.mindustry.ui.*; -import io.anuke.mindustry.ui.Cicon; import io.anuke.mindustry.world.*; import io.anuke.mindustry.world.blocks.*; @@ -52,6 +50,7 @@ public class Player extends Unit implements BuilderMinerTrait, ShooterTrait{ public @Nullable String uuid, usid; public boolean isAdmin, isTransferring, isShooting, isBoosting, isMobile, isTyping, isBuilding = true; + public boolean buildWasAutoPaused = false; public float boostHeat, shootHeat, destructTime; public boolean achievedFlight; public Color color = new Color(); @@ -351,6 +350,7 @@ public class Player extends Unit implements BuilderMinerTrait, ShooterTrait{ Draw.rect(getPowerCellRegion(), x + Angles.trnsx(rotation, mech.cellTrnsY, 0f), y + Angles.trnsy(rotation, mech.cellTrnsY, 0f), rotation - 90); Draw.reset(); drawBackItems(itemtime, isLocal); + drawLight(); } @Override @@ -592,6 +592,11 @@ public class Player extends Unit implements BuilderMinerTrait, ShooterTrait{ movement.x += xa * speed; } + if(Core.input.keyDown(Binding.mouse_move)){ + movement.x += Mathf.clamp((Core.input.mouseX() - Core.graphics.getWidth() / 2) * 0.005f, -1, 1) * speed; + movement.y += Mathf.clamp((Core.input.mouseY() - Core.graphics.getHeight() / 2) * 0.005f, -1, 1) * speed; + } + Vector2 vec = Core.input.mouseWorld(control.input.getMouseX(), control.input.getMouseY()); pointerX = vec.x; pointerY = vec.y; diff --git a/core/src/io/anuke/mindustry/entities/type/TileEntity.java b/core/src/io/anuke/mindustry/entities/type/TileEntity.java index 5fa2ea9aae..96d124f99b 100644 --- a/core/src/io/anuke/mindustry/entities/type/TileEntity.java +++ b/core/src/io/anuke/mindustry/entities/type/TileEntity.java @@ -87,6 +87,11 @@ public class TileEntity extends BaseEntity implements TargetTrait, HealthTrait{ return Time.delta() * timeScale; } + /** 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; + } + /** Call when nothing is happening to the entity. This increments the internal sleep timer. */ public void sleep(){ sleepTime += Time.delta(); @@ -306,13 +311,17 @@ public class TileEntity extends BaseEntity implements TargetTrait, HealthTrait{ loops.play(block.idleSound, this, block.idleSoundVolume); } - Block previous = block; block.update(tile); - if(block == previous && cons != null){ + + if(liquids != null){ + liquids.update(); + } + + if(cons != null){ cons.update(); } - if(block == previous && power != null){ + if(power != null){ power.graph.update(); } } diff --git a/core/src/io/anuke/mindustry/entities/type/Unit.java b/core/src/io/anuke/mindustry/entities/type/Unit.java index 8211476cef..73dec77656 100644 --- a/core/src/io/anuke/mindustry/entities/type/Unit.java +++ b/core/src/io/anuke/mindustry/entities/type/Unit.java @@ -167,6 +167,8 @@ public abstract class Unit extends DestructibleEntity implements SaveTrait, Targ } public void writeSave(DataOutput stream, boolean net) throws IOException{ + if(item.item == null) item.item = Items.copper; + stream.writeByte(team.ordinal()); stream.writeBoolean(isDead()); stream.writeFloat(net ? interpolator.target.x : x); @@ -399,6 +401,12 @@ public abstract class Unit extends DestructibleEntity implements SaveTrait, Targ Draw.color(); drawBackItems(item.amount > 0 ? 1f : 0f, false); + + drawLight(); + } + + public void drawLight(){ + renderer.lights.add(x, y, 50f, Pal.powerLight, 0.6f); } public void drawBackItems(float itemtime, boolean number){ diff --git a/core/src/io/anuke/mindustry/game/EventType.java b/core/src/io/anuke/mindustry/game/EventType.java index fef2556d35..ac56c86b6e 100644 --- a/core/src/io/anuke/mindustry/game/EventType.java +++ b/core/src/io/anuke/mindustry/game/EventType.java @@ -27,7 +27,8 @@ public class EventType{ drown, exclusionDeath, suicideBomb, - openWiki + openWiki, + teamCoreDamage } public static class WinEvent{} @@ -135,10 +136,38 @@ public class EventType{ public static class DepositEvent{ public final Tile tile; public final Player player; + public final Item item; + public final int amount; - public DepositEvent(Tile tile, Player player){ + public DepositEvent(Tile tile, Player player, Item item, int amount){ this.tile = tile; this.player = player; + this.item = item; + this.amount = amount; + } + } + + /** Called when the player taps a block. */ + public static class TapEvent{ + public final Tile tile; + public final Player player; + + public TapEvent(Tile tile, Player player){ + this.tile = tile; + this.player = player; + } + } + + /** Called when the player sets a specific block. */ + public static class TapConfigEvent{ + public final Tile tile; + public final Player player; + public final int value; + + public TapConfigEvent(Tile tile, Player player, int value){ + this.tile = tile; + this.player = player; + this.value = value; } } diff --git a/core/src/io/anuke/mindustry/game/Gamemode.java b/core/src/io/anuke/mindustry/game/Gamemode.java index 79fa228305..f448bb637f 100644 --- a/core/src/io/anuke/mindustry/game/Gamemode.java +++ b/core/src/io/anuke/mindustry/game/Gamemode.java @@ -1,7 +1,7 @@ package io.anuke.mindustry.game; import io.anuke.arc.*; -import io.anuke.arc.function.*; +import io.anuke.arc.func.*; import io.anuke.mindustry.maps.*; import static io.anuke.mindustry.Vars.waveTeam; @@ -44,25 +44,25 @@ public enum Gamemode{ rules.respawnTime = 0f; }); - private final Consumer rules; - private final Predicate validator; + private final Cons rules; + private final Boolf validator; public final boolean hidden; public final static Gamemode[] all = values(); - Gamemode(Consumer rules){ + Gamemode(Cons rules){ this(false, rules); } - Gamemode(boolean hidden, Consumer rules){ + Gamemode(boolean hidden, Cons rules){ this(hidden, rules, m -> true); } - Gamemode(Consumer rules, Predicate validator){ + Gamemode(Cons rules, Boolf validator){ this(false, rules, validator); } - Gamemode(boolean hidden, Consumer rules, Predicate validator){ + Gamemode(boolean hidden, Cons rules, Boolf validator){ this.rules = rules; this.hidden = hidden; this.validator = validator; @@ -84,13 +84,13 @@ public enum Gamemode{ /** Applies this preset to this ruleset. */ public Rules apply(Rules in){ - rules.accept(in); + rules.get(in); return in; } /** @return whether this mode can be played on the specified map. */ public boolean valid(Map map){ - return validator.test(map); + return validator.get(map); } public String description(){ diff --git a/core/src/io/anuke/mindustry/game/LoopControl.java b/core/src/io/anuke/mindustry/game/LoopControl.java index 3924a1c28c..e69d3bd260 100644 --- a/core/src/io/anuke/mindustry/game/LoopControl.java +++ b/core/src/io/anuke/mindustry/game/LoopControl.java @@ -30,14 +30,14 @@ public class LoopControl{ data.curVolume = Mathf.lerpDelta(data.curVolume, data.volume * avol, 0.2f); boolean play = data.curVolume > 0.01f; - float pan = Mathf.isZero(data.total, 0.0001f) ? 0f : sound.calcPan(data.sum.x / data.total, data.sum.y / data.total); + float pan = Mathf.zero(data.total, 0.0001f) ? 0f : sound.calcPan(data.sum.x / data.total, data.sum.y / data.total); if(data.soundID <= 0){ if(play){ data.soundID = sound.loop(data.curVolume, 1f, pan); } }else{ if(data.curVolume <= 0.01f){ - sound.stop(data.soundID); + sound.stop(); data.soundID = -1; return; } diff --git a/core/src/io/anuke/mindustry/game/Rules.java b/core/src/io/anuke/mindustry/game/Rules.java index 94cf4225ad..dbafda9579 100644 --- a/core/src/io/anuke/mindustry/game/Rules.java +++ b/core/src/io/anuke/mindustry/game/Rules.java @@ -2,6 +2,7 @@ package io.anuke.mindustry.game; import io.anuke.annotations.Annotations.*; import io.anuke.arc.collection.*; +import io.anuke.arc.graphics.*; import io.anuke.mindustry.content.*; import io.anuke.mindustry.io.*; import io.anuke.mindustry.type.*; @@ -25,6 +26,8 @@ public class Rules{ public boolean pvp; /** Whether enemy units drop random items on death. */ public boolean unitDrops = true; + /** Whether reactors can explode and damage other blocks. */ + public boolean reactorExplosions = true; /** How fast unit pads build units. */ public float unitBuildSpeedMultiplier = 1f; /** How much health units start with. */ @@ -65,12 +68,16 @@ public class Rules{ public boolean attackMode = false; /** Whether this is the editor gamemode. */ public boolean editor = false; - /** Whether the tutorial is enabled. False by default.*/ + /** Whether the tutorial is enabled. False by default. */ public boolean tutorial = false; /** Starting items put in cores */ public Array loadout = Array.with(ItemStack.with(Items.copper, 100)); /** Blocks that cannot be placed. */ public ObjectSet bannedBlocks = new ObjectSet<>(); + /** Whether everything is dark. Enables lights. Experimental. */ + public boolean lighting = false; + /** Ambient light color, used when lighting is enabled. */ + public Color ambientLight = new Color(0.01f, 0.01f, 0.04f, 0.99f); /** Copies this ruleset exactly. Not very efficient at all, do not use often. */ public Rules copy(){ diff --git a/core/src/io/anuke/mindustry/game/Schematic.java b/core/src/io/anuke/mindustry/game/Schematic.java index cfa4d25d19..1ff6efd77c 100644 --- a/core/src/io/anuke/mindustry/game/Schematic.java +++ b/core/src/io/anuke/mindustry/game/Schematic.java @@ -7,6 +7,7 @@ import io.anuke.arc.util.ArcAnnotate.*; import io.anuke.mindustry.*; import io.anuke.mindustry.type.*; import io.anuke.mindustry.world.*; +import io.anuke.mindustry.world.blocks.storage.*; import static io.anuke.mindustry.Vars.*; @@ -39,6 +40,16 @@ public class Schematic implements Publishable, Comparable{ return stacks; } + public boolean hasCore(){ + return tiles.contains(s -> s.block instanceof CoreBlock); + } + + public @NonNull CoreBlock findCore(){ + CoreBlock block = (CoreBlock)tiles.find(s -> s.block instanceof CoreBlock).block; + if(block == null) throw new IllegalArgumentException("Schematic is missing a core!"); + return block; + } + public String name(){ return tags.get("name", "unknown"); } diff --git a/core/src/io/anuke/mindustry/game/Schematics.java b/core/src/io/anuke/mindustry/game/Schematics.java index f55432e800..f6086b8b2e 100644 --- a/core/src/io/anuke/mindustry/game/Schematics.java +++ b/core/src/io/anuke/mindustry/game/Schematics.java @@ -16,10 +16,12 @@ import io.anuke.mindustry.entities.traits.BuilderTrait.*; import io.anuke.mindustry.game.EventType.*; import io.anuke.mindustry.game.Schematic.*; import io.anuke.mindustry.input.*; -import io.anuke.mindustry.input.PlaceUtils.*; +import io.anuke.mindustry.input.Placement.*; import io.anuke.mindustry.type.*; import io.anuke.mindustry.world.*; import io.anuke.mindustry.world.blocks.*; +import io.anuke.mindustry.world.blocks.production.*; +import io.anuke.mindustry.world.blocks.storage.*; import java.io.*; import java.util.zip.*; @@ -28,16 +30,20 @@ import static io.anuke.mindustry.Vars.*; /** Handles schematics.*/ public class Schematics implements Loadable{ + public static final String base64Header = "bXNjaAB"; + private static final byte[] header = {'m', 's', 'c', 'h'}; private static final byte version = 0; private static final int padding = 2; + private static final int maxPreviewsMobile = 32; private static final int resolution = 32; private OptimizedByteArrayOutputStream out = new OptimizedByteArrayOutputStream(1024); private Array all = new Array<>(); private OrderedMap previews = new OrderedMap<>(); private FrameBuffer shadowBuffer; + private long lastClearTime; public Schematics(){ Events.on(DisposeEvent.class, e -> { @@ -144,6 +150,19 @@ public class Schematics implements Loadable{ } public FrameBuffer getBuffer(Schematic schematic){ + //dispose unneeded previews to prevent memory outage errors. + //only runs every 2 seconds + if(mobile && Time.timeSinceMillis(lastClearTime) > 1000 * 2 && previews.size > maxPreviewsMobile){ + Array keys = previews.orderedKeys().copy(); + for(int i = 0; i < previews.size - maxPreviewsMobile; i++){ + //dispose and remove unneeded previews + previews.get(keys.get(i)).dispose(); + previews.remove(keys.get(i)); + } + //update last clear time + lastClearTime = Time.millis(); + } + if(!previews.containsKey(schematic)){ Draw.blend(); Draw.reset(); @@ -213,7 +232,28 @@ public class Schematics implements Loadable{ /** Creates an array of build requests from a schematic's data, centered on the provided x+y coordinates. */ public Array toRequests(Schematic schem, int x, int y){ return schem.tiles.map(t -> new BuildRequest(t.x + x - schem.width/2, t.y + y - schem.height/2, t.rotation, t.block).original(t.x, t.y, schem.width, schem.height).configure(t.config)) - .removeAll(s -> !s.block.isVisible() || (!s.block.unlocked() && world.isZone())); + .removeAll(s -> !s.block.isVisible() || !s.block.unlockedCur()); + } + + public void placeLoadout(Schematic schem, int x, int y){ + Stile coreTile = schem.tiles.find(s -> s.block instanceof CoreBlock); + int ox = x - coreTile.x, oy = y - coreTile.y; + schem.tiles.each(st -> { + Tile tile = world.tile(st.x + ox, st.y + oy); + if(tile == null) return; + + world.setBlock(tile, st.block, defaultTeam); + tile.rotation(st.rotation); + if(st.block.posConfig){ + tile.configureAny(Pos.get(tile.x - st.x + Pos.x(st.config), tile.y - st.y + Pos.y(st.config))); + }else{ + tile.configureAny(st.config); + } + + if(st.block instanceof Drill){ + tile.getLinkedTiles(t -> t.setOverlay(Blocks.oreCopper)); + } + }); } /** Adds a schematic to the list, also copying it into the files.*/ @@ -243,7 +283,7 @@ public class Schematics implements Loadable{ /** Creates a schematic from a world selection. */ public Schematic create(int x, int y, int x2, int y2){ - NormalizeResult result = PlaceUtils.normalizeArea(x, y, x2, y2, 0, false, maxSchematicSize); + NormalizeResult result = Placement.normalizeArea(x, y, x2, y2, 0, false, maxSchematicSize); x = result.x; y = result.y; x2 = result.x2; @@ -313,13 +353,13 @@ public class Schematics implements Loadable{ } } + //region IO methods + /** Loads a schematic from base64. May throw an exception. */ - public Schematic readBase64(String schematic) throws IOException{ + public static Schematic readBase64(String schematic) throws IOException{ return read(new ByteArrayInputStream(Base64Coder.decode(schematic))); } - //region IO methods - public static Schematic read(FileHandle file) throws IOException{ Schematic s = read(new DataInputStream(file.read(1024))); if(!s.tags.containsKey("name")){ diff --git a/core/src/io/anuke/mindustry/game/Stats.java b/core/src/io/anuke/mindustry/game/Stats.java index afdd5c0706..aa152d377c 100644 --- a/core/src/io/anuke/mindustry/game/Stats.java +++ b/core/src/io/anuke/mindustry/game/Stats.java @@ -33,7 +33,7 @@ public class Stats{ score += (float)((wavesLasted - zone.conditionWave) / zone.launchPeriod + 1) * 1.2f; } - int capacity = zone.loadout.core().itemCapacity; + int capacity = zone.loadout.findCore().itemCapacity; //weigh used fractions float frac = 0f; diff --git a/core/src/io/anuke/mindustry/game/Tutorial.java b/core/src/io/anuke/mindustry/game/Tutorial.java index 3048561693..99d45d3c2f 100644 --- a/core/src/io/anuke/mindustry/game/Tutorial.java +++ b/core/src/io/anuke/mindustry/game/Tutorial.java @@ -2,7 +2,7 @@ package io.anuke.mindustry.game; import io.anuke.arc.*; import io.anuke.arc.collection.*; -import io.anuke.arc.function.*; +import io.anuke.arc.func.*; import io.anuke.arc.graphics.g2d.*; import io.anuke.arc.math.*; import io.anuke.arc.scene.*; @@ -194,16 +194,16 @@ public class Tutorial{ },; protected String line = ""; - protected final Function text; + protected final Func text; protected Array sentences; - protected final BooleanProvider done; + protected final Boolp done; - TutorialStage(Function text, BooleanProvider done){ + TutorialStage(Func text, Boolp done){ this.text = text; this.done = done; } - TutorialStage(BooleanProvider done){ + TutorialStage(Boolp done){ this(line -> line, done); } diff --git a/core/src/io/anuke/mindustry/graphics/BlockRenderer.java b/core/src/io/anuke/mindustry/graphics/BlockRenderer.java index 009c88966f..1e7fa36982 100644 --- a/core/src/io/anuke/mindustry/graphics/BlockRenderer.java +++ b/core/src/io/anuke/mindustry/graphics/BlockRenderer.java @@ -9,11 +9,11 @@ import io.anuke.arc.graphics.glutils.*; import io.anuke.arc.math.*; import io.anuke.arc.util.*; import io.anuke.mindustry.content.*; -import io.anuke.mindustry.game.*; import io.anuke.mindustry.game.EventType.*; import io.anuke.mindustry.game.Teams.*; -import io.anuke.mindustry.ui.Cicon; +import io.anuke.mindustry.ui.*; import io.anuke.mindustry.world.*; +import io.anuke.mindustry.world.blocks.*; import static io.anuke.arc.Core.camera; import static io.anuke.mindustry.Vars.*; @@ -124,7 +124,9 @@ public class BlockRenderer implements Disposable{ Draw.shader(); } - public void drawBroken(){ + public void drawDestroyed(){ + if(!Core.settings.getBool("destroyedblocks")) return; + if(control.input.isPlacing() || control.input.isBreaking()){ brokenFade = Mathf.lerpDelta(brokenFade, 1f, 0.1f); }else{ @@ -217,6 +219,10 @@ public class BlockRenderer implements Disposable{ addRequest(tile, Layer.block); } + if(state.rules.lighting && tile.block().synthetic() && !(tile.block() instanceof BlockPart)){ + addRequest(tile, Layer.lights); + } + if(block.expanded || !expanded){ if(block.layer != null){ @@ -272,6 +278,9 @@ public class BlockRenderer implements Disposable{ if(block.synthetic() && request.tile.getTeam() != player.getTeam()){ block.drawTeam(request.tile); } + + }else if(request.layer == Layer.lights){ + block.drawLight(request.tile); }else if(request.layer == block.layer){ block.drawLayer(request.tile); }else if(request.layer == block.layer2){ @@ -280,39 +289,6 @@ public class BlockRenderer implements Disposable{ } } - public void drawTeamBlocks(Layer layer, Team team){ - int index = this.iterateidx; - - for(; index < requestidx; index++){ - - if(index < requests.size && requests.get(index).layer.ordinal() > layer.ordinal()){ - break; - } - - BlockRequest req = requests.get(index); - if(req.tile.getTeam() != team) continue; - - Block block = req.tile.block(); - - if(req.layer == Layer.block){ - block.draw(req.tile); - }else if(req.layer == block.layer){ - block.drawLayer(req.tile); - }else if(req.layer == block.layer2){ - block.drawLayer2(req.tile); - } - - } - } - - public void skipLayer(Layer stopAt){ - for(; iterateidx < requestidx; iterateidx++){ - if(iterateidx < requests.size && requests.get(iterateidx).layer.ordinal() > stopAt.ordinal()){ - break; - } - } - } - private void addRequest(Tile tile, Layer layer){ if(requestidx >= requests.size){ requests.add(new BlockRequest()); diff --git a/core/src/io/anuke/mindustry/graphics/Drawf.java b/core/src/io/anuke/mindustry/graphics/Drawf.java index ecbd7eec09..036db1eca0 100644 --- a/core/src/io/anuke/mindustry/graphics/Drawf.java +++ b/core/src/io/anuke/mindustry/graphics/Drawf.java @@ -6,6 +6,8 @@ import io.anuke.arc.graphics.g2d.*; import io.anuke.arc.math.*; import io.anuke.arc.util.*; +import static io.anuke.mindustry.Vars.renderer; + public class Drawf{ public static void dashCircle(float x, float y, float rad, Color color){ @@ -40,15 +42,6 @@ public class Drawf{ square(x, y, radius, Pal.accent); } - /* - public static void square(float x, float y, float radius){ - Lines.stroke(1f, Pal.gray); - Lines.square(x, y - 1f, radius + 1f, 45); - Lines.stroke(1f, Pal.accent); - Lines.square(x, y, radius + 1f, 45); - Draw.reset(); - }*/ - public static void arrow(float x, float y, float x2, float y2, float length, float radius){ float angle = Angles.angle(x, y, x2, y2); float space = 2f; @@ -81,6 +74,8 @@ public class Drawf{ Lines.line(line, x + Tmp.v1.x, y + Tmp.v1.y, x2 - Tmp.v1.x, y2 - Tmp.v1.y, CapStyle.none, 0f); Lines.precise(false); Lines.stroke(1f); + + renderer.lights.line(x, y, x2, y2); } public static void tri(float x, float y, float width, float length, float rotation){ diff --git a/core/src/io/anuke/mindustry/graphics/Layer.java b/core/src/io/anuke/mindustry/graphics/Layer.java index 206da3d6e0..1ba9c76ec6 100644 --- a/core/src/io/anuke/mindustry/graphics/Layer.java +++ b/core/src/io/anuke/mindustry/graphics/Layer.java @@ -10,5 +10,7 @@ public enum Layer{ /** "High" blocks, like turrets. */ turret, /** Power lasers. */ - power + power, + /** Extra layer that's always on top.*/ + lights } diff --git a/core/src/io/anuke/mindustry/graphics/LightRenderer.java b/core/src/io/anuke/mindustry/graphics/LightRenderer.java new file mode 100644 index 0000000000..19ab2ff016 --- /dev/null +++ b/core/src/io/anuke/mindustry/graphics/LightRenderer.java @@ -0,0 +1,199 @@ +package io.anuke.mindustry.graphics; + +import io.anuke.arc.*; +import io.anuke.arc.collection.*; +import io.anuke.arc.graphics.*; +import io.anuke.arc.graphics.g2d.*; +import io.anuke.arc.graphics.glutils.*; +import io.anuke.arc.math.*; +import io.anuke.arc.math.geom.*; +import io.anuke.arc.util.*; + +import static io.anuke.mindustry.Vars.state; + +/** Renders overlay lights. Client only. */ +public class LightRenderer{ + private static final int scaling = 4; + private float[] vertices = new float[24]; + private FrameBuffer buffer = new FrameBuffer(2, 2); + private Array lights = new Array<>(); + + public void add(Runnable run){ + if(!enabled()) return; + + lights.add(run); + } + + public void add(float x, float y, float radius, Color color, float opacity){ + if(!enabled()) return; + + float res = color.toFloatBits(); + add(() -> { + Draw.color(res); + Draw.alpha(opacity); + Draw.rect("circle-shadow", x, y, radius * 2, radius * 2); + }); + } + + public void add(float x, float y, TextureRegion region, Color color, float opacity){ + if(!enabled()) return; + + float res = color.toFloatBits(); + add(() -> { + Draw.color(res); + Draw.alpha(opacity); + Draw.rect(region, x, y); + }); + } + + public void line(float x, float y, float x2, float y2){ + if(!enabled()) return; + + add(() -> { + Draw.color(Color.orange, 0.3f); + + float stroke = 30f; + float rot = Mathf.angleExact(x2 - x, y2 - y); + TextureRegion ledge = Core.atlas.find("circle-end"), lmid = Core.atlas.find("circle-mid"); + + float color = Draw.getColor().toFloatBits(); + float u = lmid.getU(); + float v = lmid.getV2(); + float u2 = lmid.getU2(); + float v2 = lmid.getV(); + + + Vector2 v1 = Tmp.v1.trnsExact(rot + 90f, stroke); + float lx1 = x - v1.x, ly1 = y - v1.y, + lx2 = x + v1.x, ly2 = y + v1.y, + lx3 = x2 + v1.x, ly3 = y2 + v1.y, + lx4 = x2 - v1.x, ly4 = y2 - v1.y; + + vertices[0] = lx1; + vertices[1] = ly1; + vertices[2] = color; + vertices[3] = u; + vertices[4] = v; + vertices[5] = 0; + + vertices[6] = lx2; + vertices[7] = ly2; + vertices[8] = color; + vertices[9] = u; + vertices[10] = v2; + vertices[11] = 0; + + vertices[12] = lx3; + vertices[13] = ly3; + vertices[14] = color; + vertices[15] = u2; + vertices[16] = v2; + vertices[17] = 0; + + vertices[18] = lx4; + vertices[19] = ly4; + vertices[20] = color; + vertices[21] = u2; + vertices[22] = v; + vertices[23] = 0; + + Draw.vert(ledge.getTexture(), vertices, 0, vertices.length); + + + Vector2 v3 = Tmp.v2.trnsExact(rot, stroke); + + u = ledge.getU(); + v = ledge.getV2(); + u2 = ledge.getU2(); + v2 = ledge.getV(); + + vertices[0] = lx4; + vertices[1] = ly4; + vertices[2] = color; + vertices[3] = u; + vertices[4] = v; + vertices[5] = 0; + + vertices[6] = lx3; + vertices[7] = ly3; + vertices[8] = color; + vertices[9] = u; + vertices[10] = v2; + vertices[11] = 0; + + vertices[12] = lx3 + v3.x; + vertices[13] = ly3 + v3.y; + vertices[14] = color; + vertices[15] = u2; + vertices[16] = v2; + vertices[17] = 0; + + vertices[18] = lx4 + v3.x; + vertices[19] = ly4 + v3.y; + vertices[20] = color; + vertices[21] = u2; + vertices[22] = v; + vertices[23] = 0; + + Draw.vert(ledge.getTexture(), vertices, 0, vertices.length); + + vertices[0] = lx2; + vertices[1] = ly2; + vertices[2] = color; + vertices[3] = u; + vertices[4] = v; + vertices[5] = 0; + + vertices[6] = lx1; + vertices[7] = ly1; + vertices[8] = color; + vertices[9] = u; + vertices[10] = v2; + vertices[11] = 0; + + vertices[12] = lx1 - v3.x; + vertices[13] = ly1 - v3.y; + vertices[14] = color; + vertices[15] = u2; + vertices[16] = v2; + vertices[17] = 0; + + vertices[18] = lx2 - v3.x; + vertices[19] = ly2 - v3.y; + vertices[20] = color; + vertices[21] = u2; + vertices[22] = v; + vertices[23] = 0; + + Draw.vert(ledge.getTexture(), vertices, 0, vertices.length); + }); + } + + public boolean enabled(){ + return state.rules.lighting; + } + + public void draw(){ + if(buffer.getWidth() != Core.graphics.getWidth()/scaling || buffer.getHeight() != Core.graphics.getHeight()/scaling){ + buffer.resize(Core.graphics.getWidth()/scaling, Core.graphics.getHeight()/scaling); + } + + Draw.color(); + buffer.beginDraw(Color.clear); + Draw.blend(Blending.normal); + for(Runnable run : lights){ + run.run(); + } + Draw.reset(); + Draw.blend(); + buffer.endDraw(); + + Draw.color(); + Shaders.light.ambient.set(state.rules.ambientLight); + Draw.shader(Shaders.light); + Draw.rect(Draw.wrap(buffer.getTexture()), Core.camera.position.x, Core.camera.position.y, Core.camera.width, -Core.camera.height); + Draw.shader(); + + lights.clear(); + } +} diff --git a/core/src/io/anuke/mindustry/graphics/MenuRenderer.java b/core/src/io/anuke/mindustry/graphics/MenuRenderer.java index 3efe543625..89078c92e9 100644 --- a/core/src/io/anuke/mindustry/graphics/MenuRenderer.java +++ b/core/src/io/anuke/mindustry/graphics/MenuRenderer.java @@ -2,7 +2,7 @@ package io.anuke.mindustry.graphics; import io.anuke.arc.Core; import io.anuke.arc.collection.Array; -import io.anuke.arc.function.PositionConsumer; +import io.anuke.arc.func.Floatc2; import io.anuke.arc.graphics.Camera; import io.anuke.arc.graphics.Color; import io.anuke.arc.graphics.g2d.*; @@ -282,7 +282,7 @@ public class MenuRenderer implements Disposable{ }); } - private void flyers(PositionConsumer cons){ + private void flyers(Floatc2 cons){ float tw = width * tilesize * 1f + tilesize; float th = height * tilesize * 1f + tilesize; float range = 500f; @@ -291,7 +291,7 @@ public class MenuRenderer implements Disposable{ for(int i = 0; i < flyers; i++){ Tmp.v1.trns(flyerRot, time * (2f + flyerType.speed)); - cons.accept((Mathf.randomSeedRange(i, range) + Tmp.v1.x + Mathf.absin(time + Mathf.randomSeedRange(i + 2, 500), 10f, 3.4f) + offset) % (tw + Mathf.randomSeed(i + 5, 0, 500)), + cons.get((Mathf.randomSeedRange(i, range) + Tmp.v1.x + Mathf.absin(time + Mathf.randomSeedRange(i + 2, 500), 10f, 3.4f) + offset) % (tw + Mathf.randomSeed(i + 5, 0, 500)), (Mathf.randomSeedRange(i + 1, range) + Tmp.v1.y + Mathf.absin(time + Mathf.randomSeedRange(i + 3, 500), 10f, 3.4f) + offset) % th); } } diff --git a/core/src/io/anuke/mindustry/graphics/MinimapRenderer.java b/core/src/io/anuke/mindustry/graphics/MinimapRenderer.java index c997caae80..568884d609 100644 --- a/core/src/io/anuke/mindustry/graphics/MinimapRenderer.java +++ b/core/src/io/anuke/mindustry/graphics/MinimapRenderer.java @@ -10,13 +10,11 @@ import io.anuke.arc.math.geom.*; import io.anuke.arc.scene.ui.layout.*; import io.anuke.arc.util.*; import io.anuke.arc.util.pooling.*; -import io.anuke.mindustry.content.TypeIDs; import io.anuke.mindustry.entities.*; import io.anuke.mindustry.entities.type.*; import io.anuke.mindustry.game.EventType.*; import io.anuke.mindustry.io.*; import io.anuke.mindustry.ui.*; -import io.anuke.mindustry.ui.dialogs.*; import io.anuke.mindustry.world.*; import static io.anuke.mindustry.Vars.*; @@ -151,6 +149,10 @@ public class MinimapRenderer implements Disposable{ private int colorFor(Tile tile){ if(tile == null) return 0; tile = tile.link(); + int bc = tile.block().minimapColor(tile); + if(bc != 0){ + return bc; + } return Tmp.c1.set(MapIO.colorFor(tile.floor(), tile.block(), tile.overlay(), tile.getTeam())).mul(tile.block().cacheLayer == CacheLayer.walls ? 1f - tile.rotation() / 4f : 1f).rgba(); } diff --git a/core/src/io/anuke/mindustry/graphics/OverlayRenderer.java b/core/src/io/anuke/mindustry/graphics/OverlayRenderer.java index c9297a26a1..a3884d6ba8 100644 --- a/core/src/io/anuke/mindustry/graphics/OverlayRenderer.java +++ b/core/src/io/anuke/mindustry/graphics/OverlayRenderer.java @@ -12,8 +12,11 @@ import io.anuke.mindustry.entities.*; import io.anuke.mindustry.entities.type.*; import io.anuke.mindustry.game.*; import io.anuke.mindustry.input.*; +import io.anuke.mindustry.type.Category; import io.anuke.mindustry.ui.Cicon; import io.anuke.mindustry.world.*; +import io.anuke.mindustry.world.blocks.units.MechPad; +import io.anuke.mindustry.world.meta.BlockFlag; import static io.anuke.mindustry.Vars.*; @@ -57,6 +60,21 @@ public class OverlayRenderer{ Draw.reset(); } }); + + if(ui.hudfrag.blockfrag.currentCategory == Category.upgrade){ + for(Tile mechpad : indexer.getAllied(player.getTeam(), BlockFlag.mechPad)){ + if(!(mechpad.block() instanceof MechPad)) continue; + if(!rect.setSize(Core.camera.width * 0.9f, Core.camera.height * 0.9f) + .setCenter(Core.camera.position.x, Core.camera.position.y).contains(mechpad.x, mechpad.y)){ + + Tmp.v1.set(mechpad.drawx(), mechpad.drawy()).sub(Core.camera.position.x, Core.camera.position.y).setLength(indicatorLength); + + Lines.stroke(2f, ((MechPad) mechpad.block()).mech.engineColor); + Lines.lineAngle(Core.camera.position.x + Tmp.v1.x, Core.camera.position.y + Tmp.v1.y, Tmp.v1.angle(), 0.5f); + Draw.reset(); + } + } + } } if(player.isDead()) return; //dead players don't draw diff --git a/core/src/io/anuke/mindustry/graphics/Shaders.java b/core/src/io/anuke/mindustry/graphics/Shaders.java index 04c887caa9..008d7da637 100644 --- a/core/src/io/anuke/mindustry/graphics/Shaders.java +++ b/core/src/io/anuke/mindustry/graphics/Shaders.java @@ -16,6 +16,7 @@ public class Shaders{ public static UnitBuild build; public static FogShader fog; public static MenuShader menu; + public static LightShader light; public static SurfaceShader water, tar; public static void init(){ @@ -31,10 +32,25 @@ public class Shaders{ build = new UnitBuild(); fog = new FogShader(); menu = new MenuShader(); + light = new LightShader(); water = new SurfaceShader("water"); tar = new SurfaceShader("tar"); } + public static class LightShader extends LoadShader{ + public Color ambient = new Color(0.01f, 0.01f, 0.04f, 0.99f); + + public LightShader(){ + super("light", "default"); + } + + @Override + public void apply(){ + setUniformf("u_ambient", ambient); + } + + } + public static class MenuShader extends LoadShader{ float time = 0f; diff --git a/core/src/io/anuke/mindustry/input/Binding.java b/core/src/io/anuke/mindustry/input/Binding.java index 24421b26cd..45383cb6ef 100644 --- a/core/src/io/anuke/mindustry/input/Binding.java +++ b/core/src/io/anuke/mindustry/input/Binding.java @@ -9,6 +9,8 @@ import io.anuke.arc.input.KeyCode; public enum Binding implements KeyBind{ move_x(new Axis(KeyCode.A, KeyCode.D), "general"), move_y(new Axis(KeyCode.S, KeyCode.W)), + mouse_move(KeyCode.MOUSE_BACK), + dash(KeyCode.SHIFT_LEFT), select(KeyCode.MOUSE_LEFT), deselect(KeyCode.MOUSE_RIGHT), break_block(KeyCode.MOUSE_RIGHT), @@ -22,7 +24,22 @@ public enum Binding implements KeyBind{ schematic_flip_x(KeyCode.Z), schematic_flip_y(KeyCode.X), schematic_menu(KeyCode.T), - dash(KeyCode.SHIFT_LEFT), + category_prev(KeyCode.COMMA), + category_next(KeyCode.PERIOD), + block_select_left(KeyCode.LEFT), + block_select_right(KeyCode.RIGHT), + block_select_up(KeyCode.UP), + block_select_down(KeyCode.DOWN), + block_select_01(KeyCode.NUM_1), + block_select_02(KeyCode.NUM_2), + block_select_03(KeyCode.NUM_3), + block_select_04(KeyCode.NUM_4), + block_select_05(KeyCode.NUM_5), + block_select_06(KeyCode.NUM_6), + block_select_07(KeyCode.NUM_7), + block_select_08(KeyCode.NUM_8), + block_select_09(KeyCode.NUM_9), + block_select_10(KeyCode.NUM_0), zoom_hold(KeyCode.CONTROL_LEFT, "view"), zoom(new Axis(KeyCode.SCROLL)), menu(Core.app.getType() == ApplicationType.Android ? KeyCode.BACK : KeyCode.ESCAPE), @@ -31,12 +48,12 @@ public enum Binding implements KeyBind{ minimap(KeyCode.M), toggle_menus(KeyCode.C), screenshot(KeyCode.P), + toggle_power_lines(KeyCode.F7), player_list(KeyCode.TAB, "multiplayer"), chat(KeyCode.ENTER), chat_history_prev(KeyCode.UP), chat_history_next(KeyCode.DOWN), chat_scroll(new Axis(KeyCode.SCROLL)), - ; 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 f41cea2e93..7b015600ce 100644 --- a/core/src/io/anuke/mindustry/input/DesktopInput.java +++ b/core/src/io/anuke/mindustry/input/DesktopInput.java @@ -48,11 +48,11 @@ public class DesktopInput extends InputHandler{ t.touchable(() -> t.getColor().a < 0.1f ? Touchable.disabled : Touchable.childrenOnly); t.table(Styles.black6, b -> { b.defaults().left(); - b.label(() -> Core.bundle.format(!player.isBuilding ? "resumebuilding" : "pausebuilding", Core.keybinds.get(Binding.pause_building).key.name())).style(Styles.outlineLabel); + b.label(() -> Core.bundle.format(!player.isBuilding ? "resumebuilding" : "pausebuilding", Core.keybinds.get(Binding.pause_building).key.toString())).style(Styles.outlineLabel); b.row(); - b.add(Core.bundle.format("cancelbuilding", Core.keybinds.get(Binding.clear_building).key.name())).style(Styles.outlineLabel); + b.label(() -> Core.bundle.format("cancelbuilding", Core.keybinds.get(Binding.clear_building).key.toString())).style(Styles.outlineLabel); b.row(); - b.add(Core.bundle.format("selectschematic", Core.keybinds.get(Binding.schematic_select).key.name())).style(Styles.outlineLabel); + b.label(() -> Core.bundle.format("selectschematic", Core.keybinds.get(Binding.schematic_select).key.toString())).style(Styles.outlineLabel); }).margin(10f); }); @@ -61,28 +61,12 @@ public class DesktopInput extends InputHandler{ t.bottom(); t.table(Styles.black6, b -> { b.defaults().left(); - b.add(Core.bundle.format("schematic.flip", - Core.keybinds.get(Binding.schematic_flip_x).key.name(), - Core.keybinds.get(Binding.schematic_flip_y).key.name())).style(Styles.outlineLabel); + b.label( () -> Core.bundle.format("schematic.flip", + Core.keybinds.get(Binding.schematic_flip_x).key.toString(), + Core.keybinds.get(Binding.schematic_flip_y).key.toString())).style(Styles.outlineLabel); b.row(); b.table(a -> { - a.addImageTextButton("$schematic.add", Icon.saveSmall, () -> { - ui.showTextInput("$schematic.add", "$name", "", text -> { - Schematic replacement = schematics.all().find(s -> s.name().equals(text)); - if(replacement != null){ - ui.showConfirm("$confirm", "$schematic.replace", () -> { - schematics.overwrite(replacement, lastSchematic); - ui.showInfoFade("$schematic.saved"); - ui.schematics.showInfo(replacement); - }); - }else{ - lastSchematic.tags.put("name", text); - schematics.add(lastSchematic); - ui.showInfoFade("$schematic.saved"); - ui.schematics.showInfo(lastSchematic); - } - }); - }).colspan(2).size(250f, 50f).disabled(f -> lastSchematic == null || lastSchematic.file != null); + a.addImageTextButton("$schematic.add", Icon.saveSmall, this::showSchematicSave).colspan(2).size(250f, 50f).disabled(f -> lastSchematic == null || lastSchematic.file != null); }); }).margin(6f); }); @@ -138,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)){ + if(Core.input.keyDown(Binding.schematic_select) && !ui.chatfrag.chatOpen()){ drawSelection(schemX, schemY, cursorX, cursorY, Vars.maxSchematicSize); } @@ -182,7 +166,7 @@ public class DesktopInput extends InputHandler{ mode = none; } - if(mode == placing || isPlacing()){ + if(mode != none || isPlacing()){ selectRequests.clear(); lastSchematic = null; } @@ -198,13 +182,14 @@ public class DesktopInput extends InputHandler{ selectScale = 0f; } - rotation = Mathf.mod(rotation + (int)Core.input.axisTap(Binding.rotate), 4); - - if(sreq != null){ - sreq.rotation = Mathf.mod(sreq.rotation + (int)Core.input.axisTap(Binding.rotate), 4); - } - if(!Core.input.keyDown(Binding.zoom_hold) && Math.abs((int)Core.input.axisTap(Binding.rotate)) > 0){ + + rotation = Mathf.mod(rotation + (int)Core.input.axisTap(Binding.rotate), 4); + + if(sreq != null){ + sreq.rotation = Mathf.mod(sreq.rotation + (int)Core.input.axisTap(Binding.rotate), 4); + } + if(isPlacing() && mode == placing){ updateLine(selectX, selectY); }else if(!selectRequests.isEmpty()){ @@ -269,7 +254,7 @@ public class DesktopInput extends InputHandler{ table.row(); table.left().margin(0f).defaults().size(48f).left(); - table.addImageButton(Icon.wikiSmall, Styles.clearPartiali, () -> { + table.addImageButton(Icon.pasteSmall, Styles.clearPartiali, () -> { ui.schematics.show(); }); } @@ -282,6 +267,12 @@ public class DesktopInput extends InputHandler{ int cursorY = tileY(Core.input.mouseY()); int rawCursorX = world.toTile(Core.input.mouseWorld().x), rawCursorY = world.toTile(Core.input.mouseWorld().y); + // automatically pause building if the current build queue is empty + if(Core.settings.getBool("buildautopause") && player.isBuilding && !player.isBuilding()){ + player.isBuilding = false; + player.buildWasAutoPaused = true; + } + if(!selectRequests.isEmpty()){ int shiftX = rawCursorX - schematicX, shiftY = rawCursorY - schematicY; @@ -320,7 +311,7 @@ public class DesktopInput extends InputHandler{ selectRequests.clear(); } - if(Core.input.keyRelease(Binding.schematic_select)){ + if(Core.input.keyRelease(Binding.schematic_select) && !ui.chatfrag.chatOpen()){ lastSchematic = schematics.create(schemX, schemY, rawCursorX, rawCursorY); useSchematic(lastSchematic); if(selectRequests.isEmpty()){ @@ -352,6 +343,7 @@ public class DesktopInput extends InputHandler{ if(Core.input.keyTap(Binding.pause_building)){ player.isBuilding = !player.isBuilding; + player.buildWasAutoPaused = false; } if((cursorX != lastLineX || cursorY != lastLineY) && isPlacing() && mode == placing){ @@ -365,7 +357,6 @@ public class DesktopInput extends InputHandler{ if(!selectRequests.isEmpty()){ flushRequests(selectRequests); - //selectRequests.clear(); }else if(isPlacing()){ selectX = cursorX; selectY = cursorY; @@ -438,6 +429,15 @@ public class DesktopInput extends InputHandler{ mode = none; } + + if(Core.input.keyTap(Binding.toggle_power_lines)){ + if(Core.settings.getInt("lasersopacity") == 0){ + Core.settings.put("lasersopacity", Core.settings.getInt("preferredlaseropacity", 100)); + }else{ + Core.settings.put("preferredlaseropacity", Core.settings.getInt("lasersopacity")); + Core.settings.put("lasersopacity", 0); + } + } } @Override diff --git a/core/src/io/anuke/mindustry/input/InputHandler.java b/core/src/io/anuke/mindustry/input/InputHandler.java index fef5509f7d..f95f7a2b04 100644 --- a/core/src/io/anuke/mindustry/input/InputHandler.java +++ b/core/src/io/anuke/mindustry/input/InputHandler.java @@ -3,7 +3,7 @@ package io.anuke.mindustry.input; import io.anuke.annotations.Annotations.*; import io.anuke.arc.*; import io.anuke.arc.collection.*; -import io.anuke.arc.function.*; +import io.anuke.arc.func.*; import io.anuke.arc.graphics.*; import io.anuke.arc.graphics.g2d.*; import io.anuke.arc.input.*; @@ -13,8 +13,8 @@ import io.anuke.arc.math.geom.*; import io.anuke.arc.scene.*; import io.anuke.arc.scene.event.*; import io.anuke.arc.scene.ui.layout.*; -import io.anuke.arc.util.*; import io.anuke.arc.util.ArcAnnotate.*; +import io.anuke.arc.util.*; import io.anuke.mindustry.content.*; import io.anuke.mindustry.entities.*; import io.anuke.mindustry.entities.effect.*; @@ -25,13 +25,14 @@ import io.anuke.mindustry.game.*; import io.anuke.mindustry.game.Teams.*; import io.anuke.mindustry.gen.*; import io.anuke.mindustry.graphics.*; -import io.anuke.mindustry.input.PlaceUtils.*; +import io.anuke.mindustry.input.Placement.*; import io.anuke.mindustry.net.*; import io.anuke.mindustry.type.*; import io.anuke.mindustry.ui.fragments.*; import io.anuke.mindustry.world.*; import io.anuke.mindustry.world.blocks.*; import io.anuke.mindustry.world.blocks.BuildBlock.*; +import io.anuke.mindustry.world.blocks.power.PowerNode; import java.util.*; @@ -110,7 +111,7 @@ public abstract class InputHandler implements InputProcessor, GestureListener{ int[] remaining = {accepted, accepted}; Block block = tile.block(); - Core.app.post(() -> Events.fire(new DepositEvent(tile, player))); + Core.app.post(() -> Events.fire(new DepositEvent(tile, player, item, accepted))); for(int i = 0; i < sent; i++){ boolean end = i == sent - 1; @@ -144,19 +145,21 @@ public abstract class InputHandler implements InputProcessor, GestureListener{ if(tile == null || player == null) return; if(!Units.canInteract(player, tile)) return; tile.block().tapped(tile, player); + Core.app.post(() -> Events.fire(new TapEvent(tile, player))); } @Remote(targets = Loc.both, called = Loc.both, forward = true) public static void onTileConfig(Player player, Tile tile, int value){ if(tile == null || !Units.canInteract(player, tile)) return; tile.block().configured(tile, player, value); + Core.app.post(() -> Events.fire(new TapConfigEvent(tile, player, value))); } public Eachable allRequests(){ return cons -> { - for(BuildRequest request : player.buildQueue()) cons.accept(request); - for(BuildRequest request : selectRequests) cons.accept(request); - for(BuildRequest request : lineRequests) cons.accept(request); + for(BuildRequest request : player.buildQueue()) cons.get(request); + for(BuildRequest request : selectRequests) cons.get(request); + for(BuildRequest request : lineRequests) cons.get(request); }; } @@ -233,8 +236,28 @@ public abstract class InputHandler implements InputProcessor, GestureListener{ selectRequests.addAll(schematics.toRequests(schem, world.toTile(player.x), world.toTile(player.y))); } + protected void showSchematicSave(){ + if(lastSchematic == null) return; + + ui.showTextInput("$schematic.add", "$name", "", text -> { + Schematic replacement = schematics.all().find(s -> s.name().equals(text)); + if(replacement != null){ + ui.showConfirm("$confirm", "$schematic.replace", () -> { + schematics.overwrite(replacement, lastSchematic); + ui.showInfoFade("$schematic.saved"); + ui.schematics.showInfo(replacement); + }); + }else{ + lastSchematic.tags.put("name", text); + schematics.add(lastSchematic); + ui.showInfoFade("$schematic.saved"); + ui.schematics.showInfo(lastSchematic); + } + }); + } + public void rotateRequests(Array requests, int direction){ - int ox = rawTileX(), oy = rawTileY(); + int ox = schemOriginX(), oy = schemOriginY(); requests.each(req -> { //rotate config position @@ -269,7 +292,7 @@ public abstract class InputHandler implements InputProcessor, GestureListener{ } public void flipRequests(Array requests, boolean x){ - int origin = (x ? rawTileX() : rawTileY()) * tilesize; + int origin = (x ? schemOriginX() : schemOriginY()) * tilesize; requests.each(req -> { float value = -((x ? req.x : req.y) * tilesize - origin + req.block.offset()) + origin; @@ -299,6 +322,14 @@ public abstract class InputHandler implements InputProcessor, GestureListener{ }); } + protected int schemOriginX(){ + return rawTileX(); + } + + protected int schemOriginY(){ + return rawTileY(); + } + /** Returns the selection request that overlaps this position, or null. */ protected BuildRequest getRequest(int x, int y){ return getRequest(x, y, 1, null); @@ -311,7 +342,7 @@ public abstract class InputHandler implements InputProcessor, GestureListener{ r2.setCenter(x * tilesize + offset, y * tilesize + offset); resultreq = null; - Predicate test = req -> { + Boolf test = req -> { if(req == skip) return false; Tile other = req.tile(); @@ -329,19 +360,19 @@ public abstract class InputHandler implements InputProcessor, GestureListener{ }; for(BuildRequest req : player.buildQueue()){ - if(test.test(req)) return req; + if(test.get(req)) return req; } for(BuildRequest req : selectRequests){ - if(test.test(req)) return req; + if(test.get(req)) return req; } return null; } protected void drawBreakSelection(int x1, int y1, int x2, int y2){ - NormalizeDrawResult result = PlaceUtils.normalizeDrawArea(Blocks.air, x1, y1, x2, y2, false, maxLength, 1f); - NormalizeResult dresult = PlaceUtils.normalizeArea(x1, y1, x2, y2, rotation, false, maxLength); + NormalizeDrawResult result = Placement.normalizeDrawArea(Blocks.air, x1, y1, x2, y2, false, maxLength, 1f); + NormalizeResult dresult = Placement.normalizeArea(x1, y1, x2, y2, rotation, false, maxLength); for(int x = dresult.x; x <= dresult.x2; x++){ for(int y = dresult.y; y <= dresult.y2; y++){ @@ -364,13 +395,12 @@ public abstract class InputHandler implements InputProcessor, GestureListener{ } } - /* for(BuildRequest req : selectRequests){ if(req.breaking) continue; if(req.bounds(Tmp.r2).overlaps(Tmp.r1)){ drawBreaking(req); } - }*/ + } for(BrokenBlock req : state.teams.get(player.getTeam()).brokenBlocks){ Block block = content.block(req.block); @@ -388,7 +418,7 @@ public abstract class InputHandler implements InputProcessor, GestureListener{ } protected void drawSelection(int x1, int y1, int x2, int y2, int maxLength){ - NormalizeDrawResult result = PlaceUtils.normalizeDrawArea(Blocks.air, x1, y1, x2, y2, false, maxLength, 1f); + NormalizeDrawResult result = Placement.normalizeDrawArea(Blocks.air, x1, y1, x2, y2, false, maxLength, 1f); Lines.stroke(2f); @@ -401,12 +431,13 @@ public abstract class InputHandler implements InputProcessor, GestureListener{ protected void flushSelectRequests(Array requests){ for(BuildRequest req : requests){ if(req.block != null && validPlace(req.x, req.y, req.block, req.rotation)){ - BuildRequest other = getRequest(req.x, req.y); - if(other != null){ + BuildRequest other = getRequest(req.x, req.y, req.block.size, null); + if(other == null){ + selectRequests.add(req.copy()); + }else if(!other.breaking && other.x == req.x && other.y == req.y && other.block.size == req.block.size){ selectRequests.remove(other); + selectRequests.add(req.copy()); } - - selectRequests.add(req.copy()); } } } @@ -424,7 +455,7 @@ public abstract class InputHandler implements InputProcessor, GestureListener{ } protected void drawRequest(BuildRequest request){ - drawRequest(request.x, request.y, request.block, request.rotation); + request.block.drawRequest(request, allRequests(), validPlace(request.x, request.y, request.block, request.rotation)); } /** Draws a placement icon for a specific block. */ @@ -441,7 +472,7 @@ public abstract class InputHandler implements InputProcessor, GestureListener{ /** Remove everything from the queue in a selection. */ protected void removeSelection(int x1, int y1, int x2, int y2, boolean flush){ - NormalizeResult result = PlaceUtils.normalizeArea(x1, y1, x2, y2, rotation, false, maxLength); + NormalizeResult result = Placement.normalizeArea(x1, y1, x2, y2, rotation, false, maxLength); for(int x = 0; x <= Math.abs(result.x2 - result.x); x++){ for(int y = 0; y <= Math.abs(result.y2 - result.y); y++){ int wx = x1 + x * Mathf.sign(x2 - x1); @@ -470,14 +501,13 @@ public abstract class InputHandler implements InputProcessor, GestureListener{ } } - /* it = selectRequests.iterator(); while(it.hasNext()){ BuildRequest req = it.next(); if(!req.breaking && req.bounds(Tmp.r2).overlaps(Tmp.r1)){ it.remove(); } - }*/ + } //remove blocks to rebuild Iterator broken = state.teams.get(player.getTeam()).brokenBlocks.iterator(); @@ -498,6 +528,15 @@ public abstract class InputHandler implements InputProcessor, GestureListener{ req.animScale = 1f; lineRequests.add(req); }); + + if(Core.settings.getBool("blockreplace")){ + lineRequests.each(req -> { + Block replace = req.block.getReplacement(req, lineRequests); + if(replace.unlockedCur()){ + req.block = replace; + } + }); + } } protected void updateLine(int x1, int y1){ @@ -723,8 +762,7 @@ public abstract class InputHandler implements InputProcessor, GestureListener{ if(req != ignore && !req.breaking && req.block.bounds(req.x, req.y, Tmp.r1).overlaps(type.bounds(x, y, Tmp.r2)) - && !(type.canReplace(req.block) && Tmp.r1.equals(Tmp.r2)) - ){ + && !(type.canReplace(req.block) && Tmp.r1.equals(Tmp.r2))){ return false; } } @@ -768,17 +806,45 @@ public abstract class InputHandler implements InputProcessor, GestureListener{ Core.atlas.find("place-arrow").getHeight() * Draw.scl, rotation * 90 - 90); } - void iterateLine(int startX, int startY, int endX, int endY, Consumer cons){ + void iterateLine(int startX, int startY, int endX, int endY, Cons cons){ Array points; boolean diagonal = Core.input.keyDown(Binding.diagonal_placement); - if(Core.settings.getBool("swapdiagonal")){ + + if(Core.settings.getBool("swapdiagonal") && mobile){ + diagonal = !diagonal; + } + + if(block instanceof PowerNode){ diagonal = !diagonal; } if(diagonal){ - points = PlaceUtils.normalizeDiagonal(startX, startY, endX, endY); + points = Placement.pathfindLine(block != null && block.conveyorPlacement, startX, startY, endX, endY); }else{ - points = PlaceUtils.normalizeLine(startX, startY, endX, endY); + points = Placement.normalizeLine(startX, startY, endX, endY); + } + + if(block instanceof PowerNode){ + Array skip = new Array<>(); + + for(int i = 1; i < points.size; i++){ + int overlaps = 0; + Point2 point = points.get(i); + + //check with how many powernodes the *next* tile will overlap + for(int j = 0; j < i; j++){ + if(!skip.contains(points.get(j)) && ((PowerNode)block).overlaps(world.ltile(point.x, point.y), world.ltile(points.get(j).x, points.get(j).y))){ + overlaps++; + } + } + + //if it's more than one, it can bridge the gap + if(overlaps > 1){ + skip.add(points.get(i-1)); + } + } + //remove skipped points + points.removeAll(skip); } float angle = Angles.angle(startX, startY, endX, endY); @@ -805,7 +871,7 @@ public abstract class InputHandler implements InputProcessor, GestureListener{ line.rotation = rotation; } line.last = next == null; - cons.accept(line); + cons.get(line); Tmp.r3.setSize(block.size * tilesize).setCenter(point.x * tilesize + block.offset(), point.y * tilesize + block.offset()); } diff --git a/core/src/io/anuke/mindustry/input/MobileInput.java b/core/src/io/anuke/mindustry/input/MobileInput.java index b5461fc88f..717fb68c95 100644 --- a/core/src/io/anuke/mindustry/input/MobileInput.java +++ b/core/src/io/anuke/mindustry/input/MobileInput.java @@ -2,14 +2,17 @@ package io.anuke.mindustry.input; import io.anuke.arc.*; import io.anuke.arc.collection.*; +import io.anuke.arc.func.*; import io.anuke.arc.graphics.g2d.*; import io.anuke.arc.input.GestureDetector.*; import io.anuke.arc.input.*; import io.anuke.arc.math.*; import io.anuke.arc.math.geom.*; import io.anuke.arc.scene.*; +import io.anuke.arc.scene.ui.ImageButton.*; import io.anuke.arc.scene.ui.layout.*; import io.anuke.arc.util.*; +import io.anuke.mindustry.*; import io.anuke.mindustry.content.*; import io.anuke.mindustry.core.GameState.*; import io.anuke.mindustry.entities.*; @@ -17,6 +20,7 @@ import io.anuke.mindustry.entities.traits.BuilderTrait.*; import io.anuke.mindustry.entities.traits.*; import io.anuke.mindustry.entities.type.*; import io.anuke.mindustry.game.EventType.*; +import io.anuke.mindustry.game.*; import io.anuke.mindustry.gen.*; import io.anuke.mindustry.graphics.*; import io.anuke.mindustry.ui.*; @@ -51,7 +55,7 @@ public class MobileInput extends InputHandler implements GestureListener{ /** Whether or not the player is currently shifting all placed tiles. */ private boolean selecting; /** Whether the player is currently in line-place mode. */ - private boolean lineMode; + private boolean lineMode, schematicMode; /** Current place mode. */ private PlaceMode mode = none; /** Whether no recipe was available when switching to break mode. */ @@ -187,8 +191,23 @@ public class MobileInput extends InputHandler implements GestureListener{ }).update(l -> l.setChecked(Core.settings.getBool("swapdiagonal"))); //rotate button - table.addImageButton(Icon.arrowSmall, Styles.clearPartiali,() -> rotation = Mathf.mod(rotation + 1, 4)) - .update(i -> i.getImage().setRotationOrigin(rotation * 90, Align.center)).visible(() -> block != null && block.rotate); + table.addImageButton(Icon.arrowSmall, Styles.clearTogglePartiali, () -> { + if(block != null && block.rotate){ + rotation = Mathf.mod(rotation + 1, 4); + }else{ + schematicMode = !schematicMode; + if(schematicMode){ + block = null; + mode = none; + } + } + }).update(i -> { + boolean arrow = block != null && block.rotate; + + i.getImage().setRotationOrigin(!arrow ? 0 : rotation * 90, Align.center); + i.getStyle().imageUp = arrow ? Icon.arrowSmall : Icon.pasteSmall; + i.setChecked(!arrow && schematicMode); + }); //confirm button table.addImageButton(Icon.checkSmall, Styles.clearPartiali, () -> { @@ -198,11 +217,23 @@ public class MobileInput extends InputHandler implements GestureListener{ //actually place/break all selected blocks if(tile != null){ if(!request.breaking){ + if(validPlace(request.x, request.y, request.block, request.rotation)){ + BuildRequest other = getRequest(request.x, request.y, request.block.size, null); + BuildRequest copy = request.copy(); + + if(copy.hasConfig && copy.block.posConfig){ + copy.config = Pos.get(Pos.x(copy.config) + copy.x - copy.originalX, Pos.y(copy.config) + copy.y - copy.originalY); + } + + if(other == null){ + player.addBuildRequest(copy); + }else if(!other.breaking && other.x == request.x && other.y == request.y && other.block.size == request.block.size){ + player.buildQueue().remove(other); + player.addBuildRequest(copy); + } + } + rotation = request.rotation; - Block before = block; - block = request.block; - tryPlaceBlock(tile.x, tile.y); - block = before; }else{ tryBreakBlock(tile.x, tile.y); } @@ -218,8 +249,10 @@ public class MobileInput extends InputHandler implements GestureListener{ @Override public void buildUI(Group group){ + Boolp schem = () -> lastSchematic != null && !selectRequests.isEmpty(); + group.fill(t -> { - t.bottom().left().visible(() -> (player.isBuilding() || block != null || mode == breaking || !selectRequests.isEmpty()) && !state.is(State.menu)); + t.bottom().left().visible(() -> (player.isBuilding() || block != null || mode == breaking || !selectRequests.isEmpty()) && !schem.get()); t.addImageTextButton("$cancel", Icon.cancelSmall, () -> { player.clearBuilding(); selectRequests.clear(); @@ -227,6 +260,41 @@ public class MobileInput extends InputHandler implements GestureListener{ block = null; }).width(155f); }); + + group.fill(t -> { + t.visible(schem); + t.bottom().left(); + t.table(Tex.pane, b -> { + b.defaults().size(50f); + + ImageButtonStyle style = Styles.clearPartiali; + + b.addImageButton(Icon.floppySmall, style, this::showSchematicSave).disabled(f -> lastSchematic == null || lastSchematic.file != null); + b.addImageButton(Icon.cancelSmall, style, () -> { + selectRequests.clear(); + }); + b.row(); + b.addImageButton(Icon.flipSmall, style, () -> flipRequests(selectRequests, true)); + b.addImageButton(Icon.flipSmall, style, () -> flipRequests(selectRequests, false)).update(i -> i.getImage().setRotationOrigin(90f, Align.center)); + b.row(); + b.addImageButton(Icon.rotateSmall, style, () -> rotateRequests(selectRequests, 1)); + + }).margin(4f); + }); + } + + @Override + protected int schemOriginX(){ + Tmp.v1.setZero(); + selectRequests.each(r -> Tmp.v1.add(r.drawx(), r.drawy())); + return world.toTile(Tmp.v1.scl(1f / selectRequests.size).x); + } + + @Override + protected int schemOriginY(){ + Tmp.v1.setZero(); + selectRequests.each(r -> Tmp.v1.add(r.drawx(), r.drawy())); + return world.toTile(Tmp.v1.scl(1f / selectRequests.size).y); } @Override @@ -251,8 +319,6 @@ public class MobileInput extends InputHandler implements GestureListener{ }else{ request.block.drawRequest(request, allRequests(), true); } - //TODO - //drawRequest(request); } //draw list of requests @@ -301,7 +367,10 @@ public class MobileInput extends InputHandler implements GestureListener{ if(i == lineRequests.size - 1 && req.block.rotate){ drawArrow(block, req.x, req.y, req.rotation); } - drawRequest(lineRequests.get(i)); + + BuildRequest request = lineRequests.get(i); + request.block.drawRequest(request, allRequests(), validPlace(request.x, request.y, request.block, request.rotation) && getRequest(req.x, request.y, request.block.size, null) == null); + drawSelected(request.x, request.y, request.block, Pal.accent); } }else if(mode == breaking){ drawBreakSelection(lineStartX, lineStartY, tileX, tileY); @@ -331,6 +400,15 @@ public class MobileInput extends InputHandler implements GestureListener{ Draw.reset(); } + @Override + public void drawTop(){ + + //draw schematic selection + if(mode == schematicSelect){ + drawSelection(lineStartX, lineStartY, lastLineX, lastLineY, Vars.maxSchematicSize); + } + } + @Override protected void drawRequest(BuildRequest request){ if(request.tile() == null) return; @@ -352,6 +430,13 @@ public class MobileInput extends InputHandler implements GestureListener{ return mode == breaking; } + @Override + public void useSchematic(Schematic schem){ + selectRequests.clear(); + selectRequests.addAll(schematics.toRequests(schem, world.toTile(player.x), world.toTile(player.y))); + lastSchematic = schem; + } + @Override public boolean touchDown(int screenX, int screenY, int pointer, KeyCode button){ if(state.is(State.menu) || player.isDead()) return false; @@ -367,11 +452,20 @@ public class MobileInput extends InputHandler implements GestureListener{ if(cursor == null || Core.scene.hasMouse(screenX, screenY)) return false; //only begin selecting if the tapped block is a request - selecting = hasRequest(cursor) && isPlacing() && mode == placing; + selecting = hasRequest(cursor); //call tap events if(pointer == 0 && !selecting){ - if(!tryTapPlayer(worldx, worldy) && Core.settings.getBool("keyboard")){ + if(schematicMode && block == null){ + mode = schematicSelect; + //engage schematic selection mode + int tileX = tileX(screenX); + int tileY = tileY(screenY); + lineStartX = tileX; + lineStartY = tileY; + lastLineX = tileX; + lastLineY = tileY; + }else if(!tryTapPlayer(worldx, worldy) && Core.settings.getBool("keyboard")){ //shoot on touch down when in keyboard mode player.isShooting = true; } @@ -388,6 +482,8 @@ public class MobileInput extends InputHandler implements GestureListener{ down = false; } + selecting = false; + //place down a line if in line mode if(lineMode){ int tileX = tileX(screenX); @@ -401,6 +497,15 @@ public class MobileInput extends InputHandler implements GestureListener{ } lineMode = false; + }else if(mode == schematicSelect){ + selectRequests.clear(); + lastSchematic = schematics.create(lineStartX, lineStartY, lastLineX, lastLineY); + useSchematic(lastSchematic); + if(selectRequests.isEmpty()){ + lastSchematic = null; + } + schematicMode = false; + mode = none; }else{ Tile tile = tileAt(screenX, screenY); @@ -419,7 +524,7 @@ public class MobileInput extends InputHandler implements GestureListener{ Tile cursor = tileAt(x, y); //ignore off-screen taps - if(cursor == null || Core.scene.hasMouse(x, y)) return false; + if(cursor == null || Core.scene.hasMouse(x, y) || schematicMode) return false; //remove request if it's there //long pressing enables line mode otherwise @@ -505,7 +610,6 @@ public class MobileInput extends InputHandler implements GestureListener{ //reset state when not placing if(mode == none){ - selecting = false; lineMode = false; } @@ -522,6 +626,22 @@ public class MobileInput extends InputHandler implements GestureListener{ mode = none; } + //stop schematic when in block mode + if(block != null){ + schematicMode = false; + } + + //stop select when not in schematic mode + if(!schematicMode && mode == schematicSelect){ + mode = none; + } + + if(mode == schematicSelect){ + lastLineX = rawTileX(); + lastLineY = rawTileY(); + autoPan(); + } + //automatically switch to placing after a new recipe is selected if(lastBlock != block && mode == breaking && block != null){ mode = placing; @@ -533,32 +653,7 @@ public class MobileInput extends InputHandler implements GestureListener{ //When in line mode, pan when near screen edges automatically if(Core.input.isTouched(0)){ - float screenX = Core.input.mouseX(), screenY = Core.input.mouseY(); - - float panX = 0, panY = 0; - - if(screenX <= edgePan){ - panX = -(edgePan - screenX); - } - - if(screenX >= Core.graphics.getWidth() - edgePan){ - panX = (screenX - Core.graphics.getWidth()) + edgePan; - } - - if(screenY <= edgePan){ - panY = -(edgePan - screenY); - } - - if(screenY >= Core.graphics.getHeight() - edgePan){ - panY = (screenY - Core.graphics.getHeight()) + edgePan; - } - - vector.set(panX, panY).scl((Core.camera.width) / Core.graphics.getWidth()); - vector.limit(maxPanSpeed); - - //pan view - Core.camera.position.x += vector.x; - Core.camera.position.y += vector.y; + autoPan(); } int lx = tileX(Core.input.mouseX()), ly = tileY(Core.input.mouseY()); @@ -584,6 +679,35 @@ public class MobileInput extends InputHandler implements GestureListener{ } } + protected void autoPan(){ + float screenX = Core.input.mouseX(), screenY = Core.input.mouseY(); + + float panX = 0, panY = 0; + + if(screenX <= edgePan){ + panX = -(edgePan - screenX); + } + + if(screenX >= Core.graphics.getWidth() - edgePan){ + panX = (screenX - Core.graphics.getWidth()) + edgePan; + } + + if(screenY <= edgePan){ + panY = -(edgePan - screenY); + } + + if(screenY >= Core.graphics.getHeight() - edgePan){ + panY = (screenY - Core.graphics.getHeight()) + edgePan; + } + + vector.set(panX, panY).scl((Core.camera.width) / Core.graphics.getWidth()); + vector.limit(maxPanSpeed); + + //pan view + Core.camera.position.x += vector.x; + Core.camera.position.y += vector.y; + } + @Override public boolean pan(float x, float y, float deltaX, float deltaY){ if(Core.scene.hasDialog() || Core.settings.getBool("keyboard")) return false; @@ -593,7 +717,7 @@ public class MobileInput extends InputHandler implements GestureListener{ deltaY *= scale; //can't pan in line mode with one finger or while dropping items! - if((lineMode && !Core.input.isTouched(1)) || droppingItem){ + if((lineMode && !Core.input.isTouched(1)) || droppingItem || schematicMode){ return false; } diff --git a/core/src/io/anuke/mindustry/input/PlaceUtils.java b/core/src/io/anuke/mindustry/input/Placement.java similarity index 55% rename from core/src/io/anuke/mindustry/input/PlaceUtils.java rename to core/src/io/anuke/mindustry/input/Placement.java index 79a358e286..35b078b8fe 100644 --- a/core/src/io/anuke/mindustry/input/PlaceUtils.java +++ b/core/src/io/anuke/mindustry/input/Placement.java @@ -1,25 +1,41 @@ package io.anuke.mindustry.input; -import io.anuke.arc.collection.Array; -import io.anuke.arc.math.Mathf; -import io.anuke.arc.math.geom.Bresenham2; -import io.anuke.arc.math.geom.Point2; -import io.anuke.arc.util.pooling.Pools; -import io.anuke.mindustry.world.Block; +import io.anuke.arc.*; +import io.anuke.arc.collection.*; +import io.anuke.arc.math.*; +import io.anuke.arc.math.geom.*; +import io.anuke.arc.util.pooling.*; +import io.anuke.mindustry.world.*; -import static io.anuke.mindustry.Vars.tilesize; +import java.util.*; -public class PlaceUtils{ +import static io.anuke.mindustry.Vars.*; + +public class Placement{ private static final NormalizeResult result = new NormalizeResult(); private static final NormalizeDrawResult drawResult = new NormalizeDrawResult(); private static Bresenham2 bres = new Bresenham2(); private static Array points = new Array<>(); + //for pathfinding + private static IntFloatMap costs = new IntFloatMap(); + private static IntIntMap parents = new IntIntMap(); + private static IntSet closed = new IntSet(); + /** Normalize a diagonal line into points. */ - public static Array normalizeDiagonal(int startX, int startY, int endX, int endY){ + public static Array pathfindLine(boolean conveyors, int startX, int startY, int endX, int endY){ Pools.freeAll(points); + points.clear(); - return bres.lineNoDiagonal(startX, startY, endX, endY, Pools.get(Point2.class, Point2::new), points); + if(conveyors && Core.settings.getBool("conveyorpathfinding")){ + if(astar(startX, startY, endX, endY)){ + return points; + }else{ + return normalizeLine(startX, startY, endX, endY); + } + }else{ + return bres.lineNoDiagonal(startX, startY, endX, endY, Pools.get(Point2.class, Point2::new), points); + } } /** Normalize two points into one straight line, no diagonals. */ @@ -40,6 +56,92 @@ public class PlaceUtils{ return points; } + private static float tileHeuristic(Tile tile, Tile other){ + Block block = control.input.block; + + if((!other.block().alwaysReplace && !(block != null && block.canReplace(other.block()))) || other.floor().isDeep()){ + return 20; + }else{ + if(parents.containsKey(tile.pos())){ + Tile prev = world.tile(parents.get(tile.pos(), 0)); + if(tile.relativeTo(prev) != other.relativeTo(tile)){ + return 8; + } + } + } + return 1; + } + + private static float distanceHeuristic(int x1, int y1, int x2, int y2){ + return Math.abs(x1 - x2) + Math.abs(y1 - y2); + } + + private static boolean validNode(Tile tile, Tile other){ + Block block = control.input.block; + if(block != null && block.canReplace(other.block())){ + return true; + }else{ + return other.block().alwaysReplace; + } + } + + private static boolean astar(int startX, int startY, int endX, int endY){ + Tile start = world.tile(startX, startY); + Tile end = world.tile(endX, endY); + if(start == end || start == null || end == null) return false; + + costs.clear(); + closed.clear(); + parents.clear(); + + int nodeLimit = 1000; + int totalNodes = 0; + + PriorityQueue queue = new PriorityQueue<>(10, (a, b) -> Float.compare(costs.get(a.pos(), 0f) + distanceHeuristic(a.x, a.y, end.x, end.y), costs.get(b.pos(), 0f) + distanceHeuristic(b.x, b.y, end.x, end.y))); + queue.add(start); + boolean found = false; + while(!queue.isEmpty() && totalNodes++ < nodeLimit){ + Tile next = queue.poll(); + float baseCost = costs.get(next.pos(), 0f); + if(next == end){ + found = true; + break; + } + closed.add(Pos.get(next.x, next.y)); + for(Point2 point : Geometry.d4){ + int newx = next.x + point.x, newy = next.y + point.y; + Tile child = world.tile(newx, newy); + if(child != null && validNode(next, child)){ + if(closed.add(child.pos())){ + parents.put(child.pos(), next.pos()); + costs.put(child.pos(), tileHeuristic(next, child) + baseCost); + queue.add(child); + } + } + } + } + + if(!found) return false; + int total = 0; + + points.add(Pools.obtain(Point2.class, Point2::new).set(endX, endY)); + + Tile current = end; + while(current != start && total++ < nodeLimit){ + if(current == null) return false; + int newPos = parents.get(current.pos(), Pos.invalid); + + if(newPos == Pos.invalid) return false; + + points.add(Pools.obtain(Point2.class, Point2::new).set(Pos.x(newPos), Pos.y(newPos))); + current = world.tile(newPos); + } + + points.reverse(); + + return true; + } + /** * Normalizes a placement area and returns the result, ready to be used for drawing a rectangle. * Returned x2 and y2 will always be greater than x and y. @@ -173,4 +275,12 @@ public class PlaceUtils{ return y + (x2 - x > y2 - y ? 0 : i); } } + + public interface DistanceHeuristic{ + float cost(int x1, int y1, int x2, int y2); + } + + public interface TileHueristic{ + float cost(Tile tile, Tile other); + } } diff --git a/core/src/io/anuke/mindustry/io/JsonIO.java b/core/src/io/anuke/mindustry/io/JsonIO.java index 4dc253672b..1edc718c6a 100644 --- a/core/src/io/anuke/mindustry/io/JsonIO.java +++ b/core/src/io/anuke/mindustry/io/JsonIO.java @@ -4,7 +4,7 @@ import io.anuke.arc.util.serialization.*; import io.anuke.arc.util.serialization.Json.*; import io.anuke.mindustry.*; import io.anuke.mindustry.content.*; -import io.anuke.mindustry.ctype.MappableContent; +import io.anuke.mindustry.ctype.*; import io.anuke.mindustry.game.*; import io.anuke.mindustry.type.*; import io.anuke.mindustry.world.*; @@ -31,6 +31,10 @@ public class JsonIO{ } }; + public static Json json(){ + return json; + } + public static String write(Object object){ return json.toJson(object, object.getClass()); } diff --git a/core/src/io/anuke/mindustry/io/TypeIO.java b/core/src/io/anuke/mindustry/io/TypeIO.java index d499d71cfd..b5864b5e5b 100644 --- a/core/src/io/anuke/mindustry/io/TypeIO.java +++ b/core/src/io/anuke/mindustry/io/TypeIO.java @@ -180,15 +180,13 @@ public class TypeIO{ byte[] bytes = string.getBytes(charset); buffer.putInt(bytes.length); buffer.put(bytes); - - writeString(buffer, JsonIO.write(rules)); } @ReadClass(Rules.class) public static Rules readRules(ByteBuffer buffer){ int length = buffer.getInt(); byte[] bytes = new byte[length]; - buffer.get(length); + buffer.get(bytes); String string = new String(bytes, charset); return JsonIO.read(Rules.class, string); } diff --git a/core/src/io/anuke/mindustry/io/versions/LegacyTypeTable.java b/core/src/io/anuke/mindustry/io/versions/LegacyTypeTable.java index 19168c9802..419d91e7ed 100644 --- a/core/src/io/anuke/mindustry/io/versions/LegacyTypeTable.java +++ b/core/src/io/anuke/mindustry/io/versions/LegacyTypeTable.java @@ -1,6 +1,6 @@ package io.anuke.mindustry.io.versions; -import io.anuke.arc.function.Supplier; +import io.anuke.arc.func.Prov; import io.anuke.mindustry.entities.type.Bullet; import io.anuke.mindustry.entities.effect.*; import io.anuke.mindustry.entities.type.Player; @@ -62,7 +62,7 @@ Before addition of new units: [build 79 and below] 14 = Revenant */ public class LegacyTypeTable{ - private static final Supplier[] build81Table = { + private static final Prov[] build81Table = { Player::new, Fire::new, Puddle::new, @@ -79,7 +79,7 @@ public class LegacyTypeTable{ Revenant::new }; - private static final Supplier[] build80Table = { + private static final Prov[] build80Table = { Player::new, Fire::new, Puddle::new, @@ -98,7 +98,7 @@ public class LegacyTypeTable{ Revenant::new }; - private static final Supplier[] build79Table = { + private static final Prov[] build79Table = { Player::new, Fire::new, Puddle::new, @@ -116,7 +116,7 @@ public class LegacyTypeTable{ Revenant::new }; - public static Supplier[] getTable(int build){ + public static Prov[] getTable(int build){ if(build == -1 || build == 81){ //return most recent one since that's probably it; not guaranteed return build81Table; diff --git a/core/src/io/anuke/mindustry/io/versions/Save1.java b/core/src/io/anuke/mindustry/io/versions/Save1.java index 554bf7c94a..471c2c2f3f 100644 --- a/core/src/io/anuke/mindustry/io/versions/Save1.java +++ b/core/src/io/anuke/mindustry/io/versions/Save1.java @@ -1,6 +1,6 @@ package io.anuke.mindustry.io.versions; -import io.anuke.arc.function.*; +import io.anuke.arc.func.*; import io.anuke.mindustry.entities.traits.*; import java.io.*; @@ -13,7 +13,7 @@ public class Save1 extends Save2{ @Override public void readEntities(DataInput stream) throws IOException{ - Supplier[] table = LegacyTypeTable.getTable(lastReadBuild); + Prov[] table = LegacyTypeTable.getTable(lastReadBuild); byte groups = stream.readByte(); diff --git a/core/src/io/anuke/mindustry/maps/Map.java b/core/src/io/anuke/mindustry/maps/Map.java index 8d9f63a04c..4fb42f0a33 100644 --- a/core/src/io/anuke/mindustry/maps/Map.java +++ b/core/src/io/anuke/mindustry/maps/Map.java @@ -71,7 +71,7 @@ public class Map implements Comparable, Publishable{ } public FileHandle cacheFile(){ - return Vars.mapPreviewDirectory.child(file.nameWithoutExtension() + "-cache.dat"); + return Vars.mapPreviewDirectory.child(workshop ? file.parent().name() + "-workshop-cache.dat" : file.nameWithoutExtension() + "-cache.dat"); } public void setHighScore(int score){ diff --git a/core/src/io/anuke/mindustry/maps/Maps.java b/core/src/io/anuke/mindustry/maps/Maps.java index 6c16abfa1e..077cd71f1a 100644 --- a/core/src/io/anuke/mindustry/maps/Maps.java +++ b/core/src/io/anuke/mindustry/maps/Maps.java @@ -6,16 +6,18 @@ import io.anuke.arc.assets.loaders.*; import io.anuke.arc.collection.*; import io.anuke.arc.collection.IntSet.*; import io.anuke.arc.files.*; -import io.anuke.arc.function.*; +import io.anuke.arc.func.*; import io.anuke.arc.graphics.*; +import io.anuke.arc.util.ArcAnnotate.*; import io.anuke.arc.util.*; import io.anuke.arc.util.async.*; import io.anuke.arc.util.io.*; import io.anuke.arc.util.serialization.*; +import io.anuke.mindustry.*; import io.anuke.mindustry.content.*; -import io.anuke.mindustry.ctype.Content; -import io.anuke.mindustry.game.*; +import io.anuke.mindustry.ctype.*; import io.anuke.mindustry.game.EventType.*; +import io.anuke.mindustry.game.*; import io.anuke.mindustry.io.*; import io.anuke.mindustry.maps.MapPreviewLoader.*; import io.anuke.mindustry.maps.filters.*; @@ -34,9 +36,30 @@ public class Maps{ /** Serializer for meta. */ private Json json = new Json(); + private ShuffleMode shuffleMode = ShuffleMode.all; + private @Nullable MapProvider shuffler; + private AsyncExecutor executor = new AsyncExecutor(2); private ObjectSet previewList = new ObjectSet<>(); + public ShuffleMode getShuffleMode(){ + return shuffleMode; + } + + public void setShuffleMode(ShuffleMode mode){ + this.shuffleMode = mode; + } + + /** Set the provider for the map(s) to be played on. Will override the default shuffle mode setting.*/ + public void setMapProvider(MapProvider provider){ + this.shuffler = provider; + } + + /** @return the next map to shuffle to. May be null, in which case the server should be stopped. */ + public @Nullable Map getNextMap(@Nullable Map previous){ + return shuffler != null ? shuffler.next(previous) : shuffleMode.next(previous); + } + /** Returns a list of all maps, including custom ones. */ public Array all(){ return maps; @@ -223,10 +246,10 @@ public class Maps{ /** Attempts to run the following code; * catches any errors and attempts to display them in a readable way.*/ - public void tryCatchMapError(ExceptionRunnable run){ + public void tryCatchMapError(UnsafeRunnable run){ try{ run.run(); - }catch(Exception e){ + }catch(Throwable e){ Log.err(e); if("Outdated legacy map format".equals(e.getMessage())){ @@ -357,7 +380,7 @@ public class Maps{ Core.app.post(() -> previewList.add(map)); } - private void createNewPreview(Map map, Consumer failed){ + private void createNewPreview(Map map, Cons failed){ try{ //if it's here, then the preview failed to load or doesn't exist, make it //this has to be done synchronously! @@ -372,7 +395,7 @@ public class Maps{ } }); }catch(Exception e){ - failed.accept(e); + failed.get(e); Log.err("Failed to generate preview!", e); } } @@ -422,4 +445,37 @@ public class Maps{ return map; } + public interface MapProvider{ + @Nullable Map next(@Nullable Map previous); + } + + public enum ShuffleMode implements MapProvider{ + none(map -> null), + all(prev -> { + Array maps = Array.withArrays(Vars.maps.defaultMaps(), Vars.maps.customMaps()); + maps.shuffle(); + return maps.find(m -> m != prev || maps.size == 1); + }), + custom(prev -> { + Array maps = Array.withArrays(Vars.maps.customMaps()); + maps.shuffle(); + return maps.find(m -> m != prev || maps.size == 1); + }), + builtin(prev -> { + Array maps = Array.withArrays(Vars.maps.defaultMaps()); + maps.shuffle(); + return maps.find(m -> m != prev || maps.size == 1); + }); + + private final MapProvider provider; + + ShuffleMode(MapProvider provider){ + this.provider = provider; + } + + @Override + public Map next(@Nullable Map previous){ + return provider.next(previous); + } + } } \ No newline at end of file diff --git a/core/src/io/anuke/mindustry/maps/filters/FilterOption.java b/core/src/io/anuke/mindustry/maps/filters/FilterOption.java index b66d972465..f1a63c0a37 100644 --- a/core/src/io/anuke/mindustry/maps/filters/FilterOption.java +++ b/core/src/io/anuke/mindustry/maps/filters/FilterOption.java @@ -2,7 +2,7 @@ package io.anuke.mindustry.maps.filters; import io.anuke.arc.*; -import io.anuke.arc.function.*; +import io.anuke.arc.func.*; import io.anuke.arc.scene.style.*; import io.anuke.arc.scene.ui.*; import io.anuke.arc.scene.ui.layout.*; @@ -16,13 +16,13 @@ import io.anuke.mindustry.world.blocks.*; import static io.anuke.mindustry.Vars.updateEditorOnChange; public abstract class FilterOption{ - public static final Predicate floorsOnly = b -> (b instanceof Floor && !(b instanceof OverlayFloor)) && Core.atlas.isFound(b.icon(io.anuke.mindustry.ui.Cicon.full)); - public static final Predicate wallsOnly = b -> (!b.synthetic() && !(b instanceof Floor)) && Core.atlas.isFound(b.icon(io.anuke.mindustry.ui.Cicon.full)); - public static final Predicate floorsOptional = b -> b == Blocks.air || ((b instanceof Floor && !(b instanceof OverlayFloor)) && Core.atlas.isFound(b.icon(io.anuke.mindustry.ui.Cicon.full))); - public static final Predicate wallsOptional = b -> b == Blocks.air || ((!b.synthetic() && !(b instanceof Floor)) && Core.atlas.isFound(b.icon(io.anuke.mindustry.ui.Cicon.full))); - public static final Predicate wallsOresOptional = b -> b == Blocks.air || (((!b.synthetic() && !(b instanceof Floor)) || (b instanceof OverlayFloor)) && Core.atlas.isFound(b.icon(io.anuke.mindustry.ui.Cicon.full))); - public static final Predicate oresOnly = b -> b instanceof OverlayFloor && Core.atlas.isFound(b.icon(io.anuke.mindustry.ui.Cicon.full)); - public static final Predicate anyOptional = b -> floorsOnly.test(b) || wallsOnly.test(b) || oresOnly.test(b) || b == Blocks.air; + public static final Boolf floorsOnly = b -> (b instanceof Floor && !(b instanceof OverlayFloor)) && Core.atlas.isFound(b.icon(io.anuke.mindustry.ui.Cicon.full)); + public static final Boolf wallsOnly = b -> (!b.synthetic() && !(b instanceof Floor)) && Core.atlas.isFound(b.icon(io.anuke.mindustry.ui.Cicon.full)); + public static final Boolf floorsOptional = b -> b == Blocks.air || ((b instanceof Floor && !(b instanceof OverlayFloor)) && Core.atlas.isFound(b.icon(io.anuke.mindustry.ui.Cicon.full))); + public static final Boolf wallsOptional = b -> b == Blocks.air || ((!b.synthetic() && !(b instanceof Floor)) && Core.atlas.isFound(b.icon(io.anuke.mindustry.ui.Cicon.full))); + public static final Boolf wallsOresOptional = b -> b == Blocks.air || (((!b.synthetic() && !(b instanceof Floor)) || (b instanceof OverlayFloor)) && Core.atlas.isFound(b.icon(io.anuke.mindustry.ui.Cicon.full))); + public static final Boolf oresOnly = b -> b instanceof OverlayFloor && Core.atlas.isFound(b.icon(io.anuke.mindustry.ui.Cicon.full)); + public static final Boolf anyOptional = b -> floorsOnly.get(b) || wallsOnly.get(b) || oresOnly.get(b) || b == Blocks.air; public abstract void build(Table table); @@ -30,15 +30,15 @@ public abstract class FilterOption{ static class SliderOption extends FilterOption{ final String name; - final FloatProvider getter; - final FloatConsumer setter; + final Floatp getter; + final Floatc setter; final float min, max, step; - SliderOption(String name, FloatProvider getter, FloatConsumer setter, float min, float max){ + SliderOption(String name, Floatp getter, Floatc setter, float min, float max){ this(name, getter, setter, min, max, (max - min) / 200); } - SliderOption(String name, FloatProvider getter, FloatConsumer setter, float min, float max, float step){ + SliderOption(String name, Floatp getter, Floatc setter, float min, float max, float step){ this.name = name; this.getter = getter; this.setter = setter; @@ -63,11 +63,11 @@ public abstract class FilterOption{ static class BlockOption extends FilterOption{ final String name; - final Supplier supplier; - final Consumer consumer; - final Predicate filter; + final Prov supplier; + final Cons consumer; + final Boolf filter; - BlockOption(String name, Supplier supplier, Consumer consumer, Predicate filter){ + BlockOption(String name, Prov supplier, Cons consumer, Boolf filter){ this.name = name; this.supplier = supplier; this.consumer = consumer; @@ -82,10 +82,10 @@ public abstract class FilterOption{ dialog.setFillParent(false); int i = 0; for(Block block : Vars.content.blocks()){ - if(!filter.test(block)) continue; + if(!filter.get(block)) continue; dialog.cont.addImage(block == Blocks.air ? Core.atlas.find("icon-none-small") : block.icon(Cicon.medium)).size(8 * 4).pad(3).get().clicked(() -> { - consumer.accept(block); + consumer.get(block); dialog.hide(); changed.run(); }); diff --git a/core/src/io/anuke/mindustry/maps/filters/MirrorFilter.java b/core/src/io/anuke/mindustry/maps/filters/MirrorFilter.java index f46673676e..673d825cc0 100644 --- a/core/src/io/anuke/mindustry/maps/filters/MirrorFilter.java +++ b/core/src/io/anuke/mindustry/maps/filters/MirrorFilter.java @@ -1,6 +1,6 @@ package io.anuke.mindustry.maps.filters; -import io.anuke.arc.function.*; +import io.anuke.arc.func.*; import io.anuke.arc.graphics.g2d.*; import io.anuke.arc.math.geom.*; import io.anuke.arc.scene.ui.*; @@ -49,15 +49,15 @@ public class MirrorFilter extends GenerateFilter{ float imageHeight = Math.max(vsize.y, vsize.x); float size = Math.max(image.getWidth() *2, image.getHeight()*2); - Consumer clamper = v -> + Cons clamper = v -> v.clamp( image.getX() + image.getWidth()/2f - imageWidth/2f, image.getX() + image.getWidth()/2f + imageWidth/2f, image.getY() + image.getHeight()/2f - imageHeight/2f, image.getY() + image.getHeight()/2f + imageHeight/2f); - clamper.accept(Tmp.v1.trns(angle - 90, size).add(image.getWidth()/2f + image.getX(), image.getHeight()/2f + image.getY())); - clamper.accept(Tmp.v2.set(Tmp.v1).sub(image.getWidth()/2f + image.getX(), image.getHeight()/2f + image.getY()).rotate(180f).add(image.getWidth()/2f + image.getX(), image.getHeight()/2f + image.getY())); + clamper.get(Tmp.v1.trns(angle - 90, size).add(image.getWidth()/2f + image.getX(), image.getHeight()/2f + image.getY())); + clamper.get(Tmp.v2.set(Tmp.v1).sub(image.getWidth()/2f + image.getX(), image.getHeight()/2f + image.getY()).rotate(180f).add(image.getWidth()/2f + image.getX(), image.getHeight()/2f + image.getY())); Lines.stroke(Scl.scl(3f), Pal.accent); Lines.line(Tmp.v1.x, Tmp.v1.y, Tmp.v2.x, Tmp.v2.y); diff --git a/core/src/io/anuke/mindustry/maps/filters/NoiseFilter.java b/core/src/io/anuke/mindustry/maps/filters/NoiseFilter.java index 90c60afc39..25aaeae3b1 100644 --- a/core/src/io/anuke/mindustry/maps/filters/NoiseFilter.java +++ b/core/src/io/anuke/mindustry/maps/filters/NoiseFilter.java @@ -29,7 +29,7 @@ public class NoiseFilter extends GenerateFilter{ if(noise > threshold){ in.floor = floor; - if(wallsOnly.test(in.block)) in.block = block; + if(wallsOnly.get(in.block)) in.block = block; } } } diff --git a/core/src/io/anuke/mindustry/maps/generators/BasicGenerator.java b/core/src/io/anuke/mindustry/maps/generators/BasicGenerator.java index a3229e5906..40911d31f6 100644 --- a/core/src/io/anuke/mindustry/maps/generators/BasicGenerator.java +++ b/core/src/io/anuke/mindustry/maps/generators/BasicGenerator.java @@ -1,7 +1,7 @@ package io.anuke.mindustry.maps.generators; import io.anuke.arc.collection.*; -import io.anuke.arc.function.IntPositionConsumer; +import io.anuke.arc.func.Intc2; import io.anuke.arc.math.Mathf; import io.anuke.arc.math.geom.Geometry; import io.anuke.arc.math.geom.Point2; @@ -137,10 +137,10 @@ public abstract class BasicGenerator extends RandomGenerator{ }); } - public void each(IntPositionConsumer r){ + public void each(Intc2 r){ for(int x = 0; x < width; x++){ for(int y = 0; y < height; y++){ - r.accept(x, y); + r.get(x, y); } } } @@ -149,13 +149,13 @@ public abstract class BasicGenerator extends RandomGenerator{ return (float)sim2.octaveNoise2D(1f, 0f, 1f / scl, x + 0x361266f, y + 0x251259f) * mag; } - public void pass(Tile[][] tiles, IntPositionConsumer r){ + public void pass(Tile[][] tiles, Intc2 r){ for(int x = 0; x < width; x++){ for(int y = 0; y < height; y++){ floor = tiles[x][y].floor(); block = tiles[x][y].block(); ore = tiles[x][y].overlay(); - r.accept(x, y); + r.get(x, y); tiles[x][y] = new Tile(x, y, floor.id, ore.id, block.id); } } diff --git a/core/src/io/anuke/mindustry/maps/generators/Generator.java b/core/src/io/anuke/mindustry/maps/generators/Generator.java index 965c6cf0e7..0b64a067de 100644 --- a/core/src/io/anuke/mindustry/maps/generators/Generator.java +++ b/core/src/io/anuke/mindustry/maps/generators/Generator.java @@ -1,11 +1,11 @@ package io.anuke.mindustry.maps.generators; -import io.anuke.mindustry.type.Loadout; -import io.anuke.mindustry.world.Tile; +import io.anuke.mindustry.game.*; +import io.anuke.mindustry.world.*; public abstract class Generator{ public int width, height; - protected Loadout loadout; + protected Schematic loadout; public Generator(int width, int height){ this.width = width; @@ -15,7 +15,7 @@ public abstract class Generator{ public Generator(){ } - public void init(Loadout loadout){ + public void init(Schematic loadout){ this.loadout = loadout; } diff --git a/core/src/io/anuke/mindustry/maps/generators/MapGenerator.java b/core/src/io/anuke/mindustry/maps/generators/MapGenerator.java index 8c7da50621..0f819e8d16 100644 --- a/core/src/io/anuke/mindustry/maps/generators/MapGenerator.java +++ b/core/src/io/anuke/mindustry/maps/generators/MapGenerator.java @@ -5,6 +5,7 @@ import io.anuke.arc.math.*; import io.anuke.arc.math.geom.*; import io.anuke.arc.util.*; import io.anuke.mindustry.content.*; +import io.anuke.mindustry.game.*; import io.anuke.mindustry.io.*; import io.anuke.mindustry.maps.*; import io.anuke.mindustry.type.*; @@ -52,7 +53,7 @@ public class MapGenerator extends Generator{ } @Override - public void init(Loadout loadout){ + public void init(Schematic loadout){ this.loadout = loadout; map = maps.loadInternalMap(mapName); width = map.width; @@ -149,7 +150,7 @@ public class MapGenerator extends Generator{ throw new IllegalArgumentException("All zone maps must have a core."); } - loadout.setup(core.x, core.y); + schematics.placeLoadout(loadout, core.x, core.y); world.prepareTiles(tiles); world.setMap(map); diff --git a/core/src/io/anuke/mindustry/maps/zonegen/DesertWastesGenerator.java b/core/src/io/anuke/mindustry/maps/zonegen/DesertWastesGenerator.java index 31ed7981dd..a82b121c31 100644 --- a/core/src/io/anuke/mindustry/maps/zonegen/DesertWastesGenerator.java +++ b/core/src/io/anuke/mindustry/maps/zonegen/DesertWastesGenerator.java @@ -5,6 +5,8 @@ import io.anuke.mindustry.content.Blocks; import io.anuke.mindustry.maps.generators.BasicGenerator; import io.anuke.mindustry.world.Tile; +import static io.anuke.mindustry.Vars.schematics; + public class DesertWastesGenerator extends BasicGenerator{ public DesertWastesGenerator(int width, int height){ @@ -42,6 +44,6 @@ public class DesertWastesGenerator extends BasicGenerator{ //scatter(tiles, Blocks.sandRocks, Blocks.creeptree, 1f); tiles[endX][endY].setOverlay(Blocks.spawn); - loadout.setup(spawnX, spawnY); + schematics.placeLoadout(loadout, spawnX, spawnY); } } diff --git a/core/src/io/anuke/mindustry/maps/zonegen/OvergrowthGenerator.java b/core/src/io/anuke/mindustry/maps/zonegen/OvergrowthGenerator.java index 0fec4b4879..527eab7d0d 100644 --- a/core/src/io/anuke/mindustry/maps/zonegen/OvergrowthGenerator.java +++ b/core/src/io/anuke/mindustry/maps/zonegen/OvergrowthGenerator.java @@ -5,6 +5,8 @@ import io.anuke.mindustry.content.Blocks; import io.anuke.mindustry.maps.generators.BasicGenerator; import io.anuke.mindustry.world.Tile; +import static io.anuke.mindustry.Vars.schematics; + public class OvergrowthGenerator extends BasicGenerator{ public OvergrowthGenerator(int width, int height){ @@ -38,6 +40,6 @@ public class OvergrowthGenerator extends BasicGenerator{ //scatter(tiles, Blocks.sporePine, Blocks.whiteTreeDead, 1f); tiles[endX][endY].setOverlay(Blocks.spawn); - loadout.setup(spawnX, spawnY); + schematics.placeLoadout(loadout, spawnX, spawnY); } } diff --git a/core/src/io/anuke/mindustry/mod/ContentParser.java b/core/src/io/anuke/mindustry/mod/ContentParser.java index dee6e8b32c..008ae39b63 100644 --- a/core/src/io/anuke/mindustry/mod/ContentParser.java +++ b/core/src/io/anuke/mindustry/mod/ContentParser.java @@ -6,14 +6,13 @@ import io.anuke.arc.audio.mock.*; import io.anuke.arc.collection.Array; import io.anuke.arc.collection.*; import io.anuke.arc.files.*; -import io.anuke.arc.function.*; +import io.anuke.arc.func.*; import io.anuke.arc.graphics.*; import io.anuke.arc.util.ArcAnnotate.*; import io.anuke.arc.util.*; -import io.anuke.arc.util.reflect.Field; -import io.anuke.arc.util.reflect.*; import io.anuke.arc.util.serialization.*; import io.anuke.arc.util.serialization.Json.*; +import io.anuke.arc.util.serialization.Jval.*; import io.anuke.mindustry.*; import io.anuke.mindustry.content.*; import io.anuke.mindustry.content.TechTree.*; @@ -39,7 +38,19 @@ public class ContentParser{ 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)); - put(Loadout.class, (type, data) -> field(Loadouts.class, data)); + put(Schematic.class, (type, data) -> { + Object result = fieldOpt(Loadouts.class, data); + if(result != null){ + return result; + }else{ + String str = data.asString(); + if(str.startsWith(Schematics.base64Header)){ + return Schematics.readBase64(str); + }else{ + return Schematics.read(Vars.tree.get("schematics/" + str + "." + Vars.schematicExtension)); + } + } + }); put(Color.class, (type, data) -> Color.valueOf(data.asString())); put(BulletType.class, (type, data) -> { if(data.isString()){ @@ -139,6 +150,7 @@ public class ContentParser{ "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", @@ -170,7 +182,7 @@ public class ContentParser{ }else if(child.name.equals("liquid")){ block.consumes.add((Consume)parser.readValue(ConsumeLiquid.class, child)); }else if(child.name.equals("power")){ - if(child.isDouble()){ + if(child.isNumber()){ block.consumes.power(child.asFloat()); }else{ block.consumes.add((Consume)parser.readValue(ConsumePower.class, child)); @@ -242,7 +254,7 @@ public class ContentParser{ return (T)c; } - private TypeParser parser(ContentType type, Function constructor){ + private TypeParser parser(ContentType type, Func constructor){ return (mod, name, value) -> { T item; if(Vars.content.getByName(type, name) != null){ @@ -330,7 +342,7 @@ public class ContentParser{ init(); } - JsonValue value = parser.fromJson(null, json); + JsonValue value = parser.fromJson(null, Jval.read(json).toString(Jformat.plain)); if(!parsers.containsKey(type)){ throw new SerializationException("No parsers for content type '" + type + "'"); } @@ -348,7 +360,7 @@ public class ContentParser{ private T make(Class type){ try{ - java.lang.reflect.Constructor cons = type.getDeclaredConstructor(); + Constructor cons = type.getDeclaredConstructor(); cons.setAccessible(true); return cons.newInstance(); }catch(Exception e){ @@ -358,7 +370,7 @@ public class ContentParser{ private T make(Class type, String name){ try{ - java.lang.reflect.Constructor cons = type.getDeclaredConstructor(String.class); + Constructor cons = type.getDeclaredConstructor(String.class); cons.setAccessible(true); return cons.newInstance(name); }catch(Exception e){ @@ -366,9 +378,9 @@ public class ContentParser{ } } - private Supplier supply(Class type){ + private Prov supply(Class type){ try{ - java.lang.reflect.Constructor cons = type.getDeclaredConstructor(); + Constructor cons = type.getDeclaredConstructor(); return () -> { try{ return cons.newInstance(); @@ -444,7 +456,7 @@ public class ContentParser{ Field field = metadata.field; try{ field.set(object, parser.readValue(field.getType(), metadata.elementType, child, metadata.keyType)); - }catch(ReflectionException ex){ + }catch(IllegalAccessException ex){ throw new SerializationException("Error accessing field: " + field.getName() + " (" + type.getName() + ")", ex); }catch(SerializationException ex){ ex.addTrace(field.getName() + " (" + type.getName() + ")"); diff --git a/core/src/io/anuke/mindustry/mod/ModCrashHandler.java b/core/src/io/anuke/mindustry/mod/ModCrashHandler.java index 3cbf3a656a..77f3c68aba 100644 --- a/core/src/io/anuke/mindustry/mod/ModCrashHandler.java +++ b/core/src/io/anuke/mindustry/mod/ModCrashHandler.java @@ -16,6 +16,7 @@ public class ModCrashHandler{ public static void handle(Throwable t){ Array list = Strings.getCauses(t); Throwable modCause = list.find(e -> e instanceof ModLoadException); + if(modCause != null && Fonts.outline != null){ String text = "[scarlet][[A fatal crash has occured while loading a mod!][]\n\nReason:[accent] " + modCause.getMessage(); String bottom = "[scarlet]The associated mod has been disabled. Swipe out of the app and launch it again."; diff --git a/core/src/io/anuke/mindustry/mod/Mods.java b/core/src/io/anuke/mindustry/mod/Mods.java index e035edeb9d..59347e01ab 100644 --- a/core/src/io/anuke/mindustry/mod/Mods.java +++ b/core/src/io/anuke/mindustry/mod/Mods.java @@ -4,7 +4,7 @@ import io.anuke.arc.*; import io.anuke.arc.assets.*; import io.anuke.arc.collection.*; import io.anuke.arc.files.*; -import io.anuke.arc.function.*; +import io.anuke.arc.func.*; import io.anuke.arc.graphics.*; import io.anuke.arc.graphics.Pixmap.*; import io.anuke.arc.graphics.Texture.*; @@ -150,10 +150,15 @@ public class Mods implements Loadable{ /** Removes a mod file and marks it for requiring a restart. */ public void removeMod(LoadedMod mod){ - if(mod.file.isDirectory()){ - mod.file.deleteDirectory(); - }else{ - mod.file.delete(); + if(mod.root instanceof ZipFileHandle){ + mod.root.delete(); + } + + boolean deleted = mod.file.isDirectory() ? mod.file.deleteDirectory() : mod.file.delete(); + + if(!deleted){ + ui.showErrorMessage("$mod.delete.error"); + return; } loaded.remove(mod); disabled.remove(mod); @@ -193,7 +198,7 @@ public class Mods implements Loadable{ }else{ disabled.add(mod); } - mod.addSteamID(file.parent().name()); + mod.addSteamID(file.name()); }catch(Exception e){ Log.err("Failed to load mod workshop file {0}. Skipping.", file); Log.err(e); @@ -321,31 +326,56 @@ public class Mods implements Loadable{ /** Creates all the content found in mod files. */ public void loadContent(){ + class LoadRun implements Comparable{ + final ContentType type; + final FileHandle file; + final LoadedMod mod; + + public LoadRun(ContentType type, FileHandle file, LoadedMod mod){ + this.type = type; + this.file = file; + this.mod = mod; + } + + @Override + public int compareTo(LoadRun l){ + int mod = this.mod.name.compareTo(l.mod.name); + if(mod != 0) return mod; + return this.file.name().compareTo(l.file.name()); + } + } + + Array runs = new Array<>(); + for(LoadedMod mod : orderedMods()){ - safeRun(mod, () -> { - if(mod.root.child("content").exists()){ - FileHandle contentRoot = mod.root.child("content"); - for(ContentType type : ContentType.all){ - FileHandle folder = contentRoot.child(type.name().toLowerCase() + "s"); - if(folder.exists()){ - for(FileHandle file : folder.list()){ - if(file.extension().equals("json")){ - try{ - //this binds the content but does not load it entirely - Content loaded = parser.parse(mod, file.nameWithoutExtension(), file.readString("UTF-8"), file, type); - Log.debug("[{0}] Loaded '{1}'.", mod.meta.name, - (loaded instanceof UnlockableContent ? ((UnlockableContent)loaded).localizedName : loaded)); - }catch(Exception e){ - throw new RuntimeException("Failed to parse content file '" + file + "' for mod '" + mod.meta.name + "'.", e); - } - } + if(mod.root.child("content").exists()){ + FileHandle contentRoot = mod.root.child("content"); + for(ContentType type : ContentType.all){ + FileHandle folder = contentRoot.child(type.name().toLowerCase() + "s"); + if(folder.exists()){ + for(FileHandle file : folder.list()){ + if(file.extension().equals("json") || file.extension().equals("hjson") || file.extension().equals("js")){ + runs.add(new LoadRun(type, file, mod)); } } } } - }); + } } + //make sure mod content is in proper order + runs.sort(); + runs.each(l -> safeRun(l.mod, () -> { + try{ + //this binds the content but does not load it entirely + Content loaded = parser.parse(l.mod, l.file.nameWithoutExtension(), l.file.readString("UTF-8"), l.file, l.type); + Log.debug("[{0}] Loaded '{1}'.", l.mod.meta.name, + (loaded instanceof UnlockableContent ? ((UnlockableContent)loaded).localizedName : loaded)); + }catch(Exception e){ + throw new RuntimeException("Failed to parse content file '" + l.file + "' for mod '" + l.mod.meta.name + "'.", e); + } + })); + //this finishes parsing content fields parser.finishParsing(); @@ -405,8 +435,8 @@ public class Mods implements Loadable{ } /** Iterates through each mod with a main class.*/ - public void each(Consumer cons){ - loaded.each(p -> p.mod != null, p -> safeRun(p, () -> cons.accept(p.mod))); + public void each(Cons cons){ + loaded.each(p -> p.mod != null, p -> safeRun(p, () -> cons.get(p.mod))); } public void handleError(Throwable t, LoadedMod mod){ @@ -430,7 +460,7 @@ public class Mods implements Loadable{ if(content != null){ throw new ModLoadException(Strings.format("Error loading '{0}' from mod '{1}' ({2}):\n{3}", - content, mod.meta.name, content.sourceFile.name(), realCause), content, t); + content, mod.meta.name, content.sourceFile == null ? "" : content.sourceFile.name(), realCause), content, t); }else{ throw new ModLoadException("Error loading mod " + mod.meta.name, t); } diff --git a/core/src/io/anuke/mindustry/net/ArcNetImpl.java b/core/src/io/anuke/mindustry/net/ArcNetImpl.java index 1c924b60c6..e2a5b3d6b2 100644 --- a/core/src/io/anuke/mindustry/net/ArcNetImpl.java +++ b/core/src/io/anuke/mindustry/net/ArcNetImpl.java @@ -2,7 +2,7 @@ package io.anuke.mindustry.net; import io.anuke.arc.*; import io.anuke.arc.collection.*; -import io.anuke.arc.function.*; +import io.anuke.arc.func.*; import io.anuke.arc.net.*; import io.anuke.arc.net.FrameworkMessage.*; import io.anuke.arc.util.*; @@ -21,7 +21,7 @@ import static io.anuke.mindustry.Vars.*; public class ArcNetImpl implements NetProvider{ final Client client; - final Supplier packetSupplier = () -> new DatagramPacket(new byte[256], 256); + final Prov packetSupplier = () -> new DatagramPacket(new byte[256], 256); final Server server; final CopyOnWriteArrayList connections = new CopyOnWriteArrayList<>(); @@ -183,7 +183,7 @@ public class ArcNetImpl implements NetProvider{ } @Override - public void pingHost(String address, int port, Consumer valid, Consumer invalid){ + public void pingHost(String address, int port, Cons valid, Cons invalid){ Threads.daemon(() -> { try{ DatagramSocket socket = new DatagramSocket(); @@ -196,15 +196,15 @@ public class ArcNetImpl implements NetProvider{ ByteBuffer buffer = ByteBuffer.wrap(packet.getData()); Host host = NetworkIO.readServerData(packet.getAddress().getHostAddress(), buffer); - Core.app.post(() -> valid.accept(host)); + Core.app.post(() -> valid.get(host)); }catch(Exception e){ - Core.app.post(() -> invalid.accept(e)); + Core.app.post(() -> invalid.get(e)); } }); } @Override - public void discoverServers(Consumer callback, Runnable done){ + public void discoverServers(Cons callback, Runnable done){ Array foundAddresses = new Array<>(); client.discoverHosts(port, multicastGroup, multicastPort, 3000, packet -> { Core.app.post(() -> { @@ -214,7 +214,7 @@ public class ArcNetImpl implements NetProvider{ } ByteBuffer buffer = ByteBuffer.wrap(packet.getData()); Host host = NetworkIO.readServerData(packet.getAddress().getHostAddress(), buffer); - callback.accept(host); + callback.get(host); foundAddresses.add(packet.getAddress()); }catch(Exception e){ //don't crash when there's an error pinging a a server or parsing data @@ -369,7 +369,7 @@ public class ArcNetImpl implements NetProvider{ if(id == -2){ return readFramework(byteBuffer); }else{ - Packet packet = Pools.obtain((Class)Registrator.getByID(id).type, (Supplier)Registrator.getByID(id).constructor); + Packet packet = Pools.obtain((Class)Registrator.getByID(id).type, (Prov)Registrator.getByID(id).constructor); packet.read(byteBuffer); return packet; } diff --git a/core/src/io/anuke/mindustry/net/CrashSender.java b/core/src/io/anuke/mindustry/net/CrashSender.java index 1240c22160..21b12bf3d8 100644 --- a/core/src/io/anuke/mindustry/net/CrashSender.java +++ b/core/src/io/anuke/mindustry/net/CrashSender.java @@ -4,7 +4,7 @@ import io.anuke.arc.*; import io.anuke.arc.Net.*; import io.anuke.arc.collection.*; import io.anuke.arc.files.*; -import io.anuke.arc.function.*; +import io.anuke.arc.func.*; import io.anuke.arc.util.*; import io.anuke.arc.util.io.*; import io.anuke.arc.util.serialization.*; @@ -21,7 +21,7 @@ import static io.anuke.mindustry.Vars.net; public class CrashSender{ - public static void send(Throwable exception, Consumer writeListener){ + public static void send(Throwable exception, Cons writeListener){ try{ exception.printStackTrace(); @@ -54,7 +54,7 @@ public class CrashSender{ File file = new File(OS.getAppDataDirectoryString(Vars.appName), "crashes/crash-report-" + new SimpleDateFormat("MM_dd_yyyy_HH_mm_ss").format(new Date()) + ".txt"); new FileHandle(OS.getAppDataDirectoryString(Vars.appName)).child("crashes").mkdirs(); new FileHandle(file).writeString(parseException(exception)); - writeListener.accept(file); + writeListener.get(file); }catch(Throwable e){ e.printStackTrace(); Log.err("Failed to save local crash report."); @@ -130,7 +130,7 @@ public class CrashSender{ } } - private static void httpPost(String url, String content, Consumer success, Consumer failure){ + private static void httpPost(String url, String content, Cons success, Cons failure){ new NetJavaImpl().http(new HttpRequest().method(HttpMethod.POST).content(content).url(url), success, failure); } diff --git a/core/src/io/anuke/mindustry/net/Host.java b/core/src/io/anuke/mindustry/net/Host.java index 44b6c6a665..498e40802e 100644 --- a/core/src/io/anuke/mindustry/net/Host.java +++ b/core/src/io/anuke/mindustry/net/Host.java @@ -11,6 +11,7 @@ public class Host{ public final int version; public final String versionType; public final Gamemode mode; + public int ping; public Host(String name, String address, String mapname, int wave, int players, int version, String versionType, Gamemode mode, int playerLimit){ this.name = name; diff --git a/core/src/io/anuke/mindustry/net/Net.java b/core/src/io/anuke/mindustry/net/Net.java index 6cb22a7794..a11a9c4089 100644 --- a/core/src/io/anuke/mindustry/net/Net.java +++ b/core/src/io/anuke/mindustry/net/Net.java @@ -2,7 +2,7 @@ package io.anuke.mindustry.net; import io.anuke.arc.*; import io.anuke.arc.collection.*; -import io.anuke.arc.function.*; +import io.anuke.arc.func.*; import io.anuke.arc.util.*; import io.anuke.arc.util.ArcAnnotate.*; import io.anuke.arc.util.pooling.*; @@ -25,8 +25,8 @@ public class Net{ StreamBuilder currentStream; private final Array packetQueue = new Array<>(); - private final ObjectMap, Consumer> clientListeners = new ObjectMap<>(); - private final ObjectMap, BiConsumer> serverListeners = new ObjectMap<>(); + private final ObjectMap, Cons> clientListeners = new ObjectMap<>(); + private final ObjectMap, Cons2> serverListeners = new ObjectMap<>(); private final IntMap streams = new IntMap<>(); private final NetProvider provider; @@ -170,7 +170,7 @@ public class Net{ * Starts discovering servers on a different thread. * Callback is run on the main libGDX thread. */ - public void discoverServers(Consumer cons, Runnable done){ + public void discoverServers(Cons cons, Runnable done){ provider.discoverServers(cons, done); } @@ -208,15 +208,15 @@ public class Net{ /** * Registers a client listener for when an object is recieved. */ - public void handleClient(Class type, Consumer listener){ + public void handleClient(Class type, Cons listener){ clientListeners.put(type, listener); } /** * Registers a server listener for when an object is recieved. */ - public void handleServer(Class type, BiConsumer listener){ - serverListeners.put(type, (BiConsumer)listener); + public void handleServer(Class type, Cons2 listener){ + serverListeners.put(type, (Cons2)listener); } /** @@ -244,7 +244,7 @@ public class Net{ if(clientLoaded || ((object instanceof Packet) && ((Packet)object).isImportant())){ if(clientListeners.get(object.getClass()) != null) - clientListeners.get(object.getClass()).accept(object); + clientListeners.get(object.getClass()).get(object); Pools.free(object); }else if(!((object instanceof Packet) && ((Packet)object).isUnimportant())){ packetQueue.add(object); @@ -263,7 +263,7 @@ public class Net{ if(serverListeners.get(object.getClass()) != null){ if(serverListeners.get(object.getClass()) != null) - serverListeners.get(object.getClass()).accept(connection, object); + serverListeners.get(object.getClass()).get(connection, object); Pools.free(object); }else{ Log.err("Unhandled packet type: '{0}'!", object.getClass()); @@ -273,7 +273,7 @@ public class Net{ /** * Pings a host in an new thread. If an error occured, failed() should be called with the exception. */ - public void pingHost(String address, int port, Consumer valid, Consumer failed){ + public void pingHost(String address, int port, Cons valid, Cons failed){ provider.pingHost(address, port, valid, failed); } @@ -324,10 +324,10 @@ public class Net{ * Callback should be run on the main thread. * @param done is the callback that should run after discovery. */ - void discoverServers(Consumer callback, Runnable done); + void discoverServers(Cons callback, Runnable done); /** Ping a host. If an error occured, failed() should be called with the exception. */ - void pingHost(String address, int port, Consumer valid, Consumer failed); + void pingHost(String address, int port, Cons valid, Cons failed); /** Host a server at specified port. */ void hostServer(int port) throws IOException; diff --git a/core/src/io/anuke/mindustry/net/Packets.java b/core/src/io/anuke/mindustry/net/Packets.java index 0a39de51ef..963ed3c549 100644 --- a/core/src/io/anuke/mindustry/net/Packets.java +++ b/core/src/io/anuke/mindustry/net/Packets.java @@ -80,7 +80,7 @@ public class Packets{ buffer.put(mobile ? (byte)1 : 0); buffer.putInt(color); buffer.put(Base64Coder.decode(uuid)); - buffer.putInt(mods.size); + buffer.put((byte)mods.size); for(int i = 0; i < mods.size; i++){ TypeIO.writeString(buffer, mods.get(i)); } @@ -97,7 +97,7 @@ public class Packets{ byte[] idbytes = new byte[8]; buffer.get(idbytes); uuid = new String(Base64Coder.encode(idbytes)); - int totalMods = buffer.getInt(); + 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/net/Registrator.java b/core/src/io/anuke/mindustry/net/Registrator.java index cfbcffd163..73c729dbcb 100644 --- a/core/src/io/anuke/mindustry/net/Registrator.java +++ b/core/src/io/anuke/mindustry/net/Registrator.java @@ -1,7 +1,7 @@ package io.anuke.mindustry.net; import io.anuke.arc.collection.ObjectIntMap; -import io.anuke.arc.function.Supplier; +import io.anuke.arc.func.Prov; import io.anuke.mindustry.net.Packets.*; public class Registrator{ @@ -35,9 +35,9 @@ public class Registrator{ public static class ClassEntry{ public final Class type; - public final Supplier constructor; + public final Prov constructor; - public ClassEntry(Class type, Supplier constructor){ + public ClassEntry(Class type, Prov constructor){ this.type = type; this.constructor = constructor; } diff --git a/core/src/io/anuke/mindustry/type/Category.java b/core/src/io/anuke/mindustry/type/Category.java index a22b742345..c75451bc64 100644 --- a/core/src/io/anuke/mindustry/type/Category.java +++ b/core/src/io/anuke/mindustry/type/Category.java @@ -23,4 +23,12 @@ public enum Category{ effect; public static final Category[] all = values(); + + public Category prev(){ + return all[(this.ordinal() - 1 + all.length) % all.length]; + } + + public Category next(){ + return all[(this.ordinal() + 1) % all.length]; + } } diff --git a/core/src/io/anuke/mindustry/type/Liquid.java b/core/src/io/anuke/mindustry/type/Liquid.java index 9b778dfd95..bc97a18990 100644 --- a/core/src/io/anuke/mindustry/type/Liquid.java +++ b/core/src/io/anuke/mindustry/type/Liquid.java @@ -3,13 +3,18 @@ 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.ui.*; public class Liquid extends UnlockableContent{ - public final Color color; + public final @NonNull Color color; + /** Color used in bars. */ + public @Nullable Color barColor; + /** Color used to draw lights. Note that the alpha channel is used to dictate brightness. */ + public Color lightColor = Color.clear.cpy(); /** 0-1, 0 is completely inflammable, anything above that may catch fire when exposed to heat, 0.5+ is very flammable. */ public float flammability; /** temperature: 0.5 is 'room' temperature, 0 is very cold, 1 is molten hot */ @@ -20,8 +25,6 @@ public class Liquid extends UnlockableContent{ public float viscosity = 0.5f; /** how prone to exploding this liquid is, when heated. 0 = nothing, 1 = nuke */ public float explosiveness; - /** the burning color of this liquid */ - public Color flameColor = Color.valueOf("ffb763"); /** The associated status effect. */ public StatusEffect effect = StatusEffects.none; @@ -40,6 +43,10 @@ public class Liquid extends UnlockableContent{ return flammability < 0.1f && temperature <= 0.5f; } + public Color barColor(){ + return barColor == null ? color : barColor; + } + @Override public void displayInfo(Table table){ ContentDisplay.displayLiquid(table, this); diff --git a/core/src/io/anuke/mindustry/type/Loadout.java b/core/src/io/anuke/mindustry/type/Loadout.java deleted file mode 100644 index 0b669c3f8f..0000000000 --- a/core/src/io/anuke/mindustry/type/Loadout.java +++ /dev/null @@ -1,113 +0,0 @@ -package io.anuke.mindustry.type; - -import io.anuke.arc.collection.*; -import io.anuke.mindustry.content.*; -import io.anuke.mindustry.ctype.Content; -import io.anuke.mindustry.world.*; -import io.anuke.mindustry.world.blocks.storage.*; - -import static io.anuke.mindustry.Vars.*; - -//TODO this class is a disappointment -public class Loadout extends Content{ - private final Array outArray = new Array<>(); - private final IntMap entries = new IntMap(){{ - put('>', new BlockEntry(Blocks.conveyor, 0)); - put('^', new BlockEntry(Blocks.conveyor, 1)); - put('<', new BlockEntry(Blocks.conveyor, 2)); - put('v', new BlockEntry(Blocks.conveyor, 3)); - - put('1', new BlockEntry(Blocks.coreShard)); - put('2', new BlockEntry(Blocks.coreFoundation)); - put('3', new BlockEntry(Blocks.coreNucleus)); - - put('C', new BlockEntry(Blocks.mechanicalDrill, Blocks.oreCopper)); - }}; - - private final IntMap blocks = new IntMap<>(); - private Block core; - - public Loadout(String... layout){ - int coreX = -1, coreY = -1; - - outer: - for(int y = 0; y < layout.length; y++){ - for(int x = 0; x < layout[0].length(); x++){ - char c = layout[y].charAt(x); - if(entries.get(c) != null && entries.get(c).block instanceof CoreBlock){ - core = entries.get(c).block; - coreX = x; - coreY = y; - break outer; - } - } - } - - if(coreX == -1) throw new IllegalArgumentException("Schematic does not have a core."); - - for(int y = 0; y < layout.length; y++){ - for(int x = 0; x < layout[0].length(); x++){ - char c = layout[y].charAt(x); - if(entries.containsKey(c)){ - BlockEntry entry = entries.get(c); - blocks.put(Pos.get(x - coreX, -(y - coreY)), entry); - } - } - } - } - - public Loadout(){ - - } - - public Block core(){ - return core; - } - - public void setup(int x, int y){ - for(IntMap.Entry entry : blocks.entries()){ - int rx = Pos.x(entry.key); - int ry = Pos.y(entry.key); - Tile tile = world.tile(x + rx, y + ry); - if(tile == null) continue; - - world.setBlock(tile, entry.value.block, defaultTeam); - tile.rotation((byte)entry.value.rotation); - if(entry.value.ore != null){ - for(Tile t : tile.getLinkedTiles(outArray)){ - t.setOverlay(entry.value.ore); - } - } - } - } - - @Override - public ContentType getContentType(){ - return ContentType.loadout; - } - - static class BlockEntry{ - final Block block; - final Block ore; - final int rotation; - - BlockEntry(Block block, Block ore){ - this.block = block; - this.ore = ore; - this.rotation = 0; - } - - BlockEntry(Block block, int rotation){ - this.block = block; - this.ore = null; - this.rotation = rotation; - } - - BlockEntry(Block block){ - this.block = block; - this.ore = null; - this.rotation = 0; - } - } - -} diff --git a/core/src/io/anuke/mindustry/type/StatusEffect.java b/core/src/io/anuke/mindustry/type/StatusEffect.java index 0c6cf15bd2..706c2a1ca8 100644 --- a/core/src/io/anuke/mindustry/type/StatusEffect.java +++ b/core/src/io/anuke/mindustry/type/StatusEffect.java @@ -2,7 +2,7 @@ package io.anuke.mindustry.type; import io.anuke.arc.collection.Array; import io.anuke.arc.collection.ObjectMap; -import io.anuke.arc.function.Supplier; +import io.anuke.arc.func.Prov; import io.anuke.arc.graphics.Color; import io.anuke.arc.math.Mathf; import io.anuke.arc.util.*; @@ -36,7 +36,7 @@ public class StatusEffect extends Content{ @Override public void init(){ for(Object[] pair : transInit){ - Supplier sup = (Supplier)pair[0]; + Prov sup = (Prov)pair[0]; TransitionHandler handler = (TransitionHandler)pair[1]; transitions.put(sup.get(), handler); } @@ -56,13 +56,13 @@ public class StatusEffect extends Content{ } } - protected void trans(Supplier effect, TransitionHandler handler){ + protected void trans(Prov effect, TransitionHandler handler){ transInit.add(new Object[]{effect, handler}); } @SuppressWarnings("unchecked") - protected void opposite(Supplier... effect){ - for(Supplier sup : effect){ + protected void opposite(Prov... effect){ + for(Prov sup : effect){ trans(sup, (unit, time, newTime, result) -> { time -= newTime * 0.5f; if(time > 0){ diff --git a/core/src/io/anuke/mindustry/type/TypeID.java b/core/src/io/anuke/mindustry/type/TypeID.java index 8af97048a6..bd190a7a63 100644 --- a/core/src/io/anuke/mindustry/type/TypeID.java +++ b/core/src/io/anuke/mindustry/type/TypeID.java @@ -1,13 +1,13 @@ package io.anuke.mindustry.type; -import io.anuke.arc.function.*; +import io.anuke.arc.func.*; import io.anuke.mindustry.ctype.*; import io.anuke.mindustry.entities.traits.*; public class TypeID extends MappableContent{ - public final Supplier constructor; + public final Prov constructor; - public TypeID(String name, Supplier constructor){ + public TypeID(String name, Prov constructor){ super(name); this.constructor = constructor; } diff --git a/core/src/io/anuke/mindustry/type/UnitType.java b/core/src/io/anuke/mindustry/type/UnitType.java index c05d6f2eab..b2602a16ad 100644 --- a/core/src/io/anuke/mindustry/type/UnitType.java +++ b/core/src/io/anuke/mindustry/type/UnitType.java @@ -3,7 +3,7 @@ package io.anuke.mindustry.type; import io.anuke.arc.*; import io.anuke.arc.audio.*; import io.anuke.arc.collection.*; -import io.anuke.arc.function.*; +import io.anuke.arc.func.*; import io.anuke.arc.graphics.g2d.*; import io.anuke.arc.scene.ui.layout.*; import io.anuke.arc.util.ArcAnnotate.*; @@ -16,7 +16,8 @@ import io.anuke.mindustry.ui.*; public class UnitType extends UnlockableContent{ public @NonNull TypeID typeID; - public @NonNull Supplier constructor; + public @NonNull + Prov constructor; public float health = 60; public float hitsize = 7f; @@ -43,7 +44,7 @@ public class UnitType extends UnlockableContent{ public TextureRegion legRegion, baseRegion, region; - public UnitType(String name, Supplier mainConstructor){ + public UnitType(String name, Prov mainConstructor){ this(name); create(mainConstructor); } @@ -53,7 +54,7 @@ public class UnitType extends UnlockableContent{ this.description = Core.bundle.getOrNull("unit." + name + ".description"); } - public void create(Supplier mainConstructor){ + public void create(Prov mainConstructor){ this.constructor = mainConstructor; this.description = Core.bundle.getOrNull("unit." + name + ".description"); this.typeID = new TypeID(name, mainConstructor); diff --git a/core/src/io/anuke/mindustry/type/Zone.java b/core/src/io/anuke/mindustry/type/Zone.java index b4088b24e6..e0084f0b73 100644 --- a/core/src/io/anuke/mindustry/type/Zone.java +++ b/core/src/io/anuke/mindustry/type/Zone.java @@ -2,7 +2,7 @@ package io.anuke.mindustry.type; import io.anuke.arc.*; import io.anuke.arc.collection.*; -import io.anuke.arc.function.*; +import io.anuke.arc.func.*; import io.anuke.arc.graphics.g2d.*; import io.anuke.arc.scene.ui.layout.*; import io.anuke.arc.util.ArcAnnotate.*; @@ -22,11 +22,11 @@ public class Zone extends UnlockableContent{ //TODO autogenerate public Array resources = new Array<>(); - public Consumer rules = rules -> {}; + public Cons rules = rules -> {}; public boolean alwaysUnlocked; public int conditionWave = Integer.MAX_VALUE; public int launchPeriod = 10; - public Loadout loadout = Loadouts.basicShard; + public Schematic loadout = Loadouts.basicShard; public TextureRegion preview; protected Array baseLaunchCost = new Array<>(); @@ -54,7 +54,7 @@ public class Zone extends UnlockableContent{ return ((MapGenerator)generator).getMap().rules(); }else{ Rules rules = new Rules(); - this.rules.accept(rules); + this.rules.get(rules); return rules; } } @@ -137,7 +137,7 @@ public class Zone extends UnlockableContent{ public void updateLaunchCost(){ Array stacks = new Array<>(); - Consumer adder = stack -> { + Cons adder = stack -> { for(ItemStack other : stacks){ if(other.item == stack.item){ other.amount += stack.amount; @@ -147,8 +147,8 @@ public class Zone extends UnlockableContent{ stacks.add(new ItemStack(stack.item, stack.amount)); }; - for(ItemStack stack : baseLaunchCost) adder.accept(stack); - for(ItemStack stack : startingItems) adder.accept(stack); + for(ItemStack stack : baseLaunchCost) adder.get(stack); + for(ItemStack stack : startingItems) adder.get(stack); for(ItemStack stack : stacks){ if(stack.amount < 0) stack.amount = 0; diff --git a/core/src/io/anuke/mindustry/ui/Bar.java b/core/src/io/anuke/mindustry/ui/Bar.java index 56c17befae..cc9e87b84b 100644 --- a/core/src/io/anuke/mindustry/ui/Bar.java +++ b/core/src/io/anuke/mindustry/ui/Bar.java @@ -1,7 +1,7 @@ package io.anuke.mindustry.ui; import io.anuke.arc.*; -import io.anuke.arc.function.*; +import io.anuke.arc.func.*; import io.anuke.arc.graphics.*; import io.anuke.arc.graphics.g2d.*; import io.anuke.arc.math.*; @@ -14,12 +14,12 @@ import io.anuke.mindustry.gen.*; public class Bar extends Element{ private static Rectangle scissor = new Rectangle(); - private FloatProvider fraction; + private Floatp fraction; private String name = ""; private float value, lastValue, blink; private Color blinkColor = new Color(); - public Bar(String name, Color color, FloatProvider fraction){ + public Bar(String name, Color color, Floatp fraction){ this.fraction = fraction; this.name = Core.bundle.get(name); this.blinkColor.set(color); @@ -27,7 +27,7 @@ public class Bar extends Element{ setColor(color); } - public Bar(Supplier name, Supplier color, FloatProvider fraction){ + public Bar(Prov name, Prov color, Floatp fraction){ this.fraction = fraction; lastValue = value = Mathf.clamp(fraction.get()); update(() -> { @@ -45,7 +45,7 @@ public class Bar extends Element{ this.value = lastValue = blink = value; } - public void set(Supplier name, FloatProvider fraction, Color color){ + public void set(Prov name, Floatp fraction, Color color){ this.fraction = fraction; this.lastValue = fraction.get(); this.blinkColor.set(color); @@ -63,7 +63,7 @@ public class Bar extends Element{ if(fraction == null) return; float computed = Mathf.clamp(fraction.get()); - if(!Mathf.isEqual(lastValue, computed)){ + if(!Mathf.equal(lastValue, computed)){ blink = 1f; lastValue = computed; } diff --git a/core/src/io/anuke/mindustry/ui/IntFormat.java b/core/src/io/anuke/mindustry/ui/IntFormat.java index 22d50ab495..695d177707 100644 --- a/core/src/io/anuke/mindustry/ui/IntFormat.java +++ b/core/src/io/anuke/mindustry/ui/IntFormat.java @@ -2,7 +2,7 @@ package io.anuke.mindustry.ui; import io.anuke.arc.Core; -import io.anuke.arc.function.Function; +import io.anuke.arc.func.Func; /** * A low-garbage way to format bundle strings. @@ -11,13 +11,13 @@ public class IntFormat{ private final StringBuilder builder = new StringBuilder(); private final String text; private int lastValue = Integer.MIN_VALUE; - private Function converter = String::valueOf; + private Func converter = String::valueOf; public IntFormat(String text){ this.text = text; } - public IntFormat(String text, Function converter){ + public IntFormat(String text, Func converter){ this.text = text; this.converter = converter; } diff --git a/core/src/io/anuke/mindustry/ui/Links.java b/core/src/io/anuke/mindustry/ui/Links.java index cfdaac40a9..670ca4e76e 100644 --- a/core/src/io/anuke/mindustry/ui/Links.java +++ b/core/src/io/anuke/mindustry/ui/Links.java @@ -17,6 +17,7 @@ public class Links{ new LinkEntry("reddit", "https://www.reddit.com/r/Mindustry/", Color.valueOf("ee593b")), new LinkEntry("itch.io", "https://anuke.itch.io/mindustry", Color.valueOf("fa5c5c")), new LinkEntry("google-play", "https://play.google.com/store/apps/details?id=io.anuke.mindustry", Color.valueOf("689f38")), + new LinkEntry("f-droid", "https://f-droid.org/packages/io.anuke.mindustry/", Color.valueOf("026aa7")), new LinkEntry("github", "https://github.com/Anuken/Mindustry/", Color.valueOf("24292e")), new LinkEntry("dev-builds", "https://github.com/Anuken/MindustryBuilds", Color.valueOf("fafbfc")) }; diff --git a/core/src/io/anuke/mindustry/ui/ReqImage.java b/core/src/io/anuke/mindustry/ui/ReqImage.java index ddb66961b3..17c88a959b 100644 --- a/core/src/io/anuke/mindustry/ui/ReqImage.java +++ b/core/src/io/anuke/mindustry/ui/ReqImage.java @@ -1,6 +1,6 @@ package io.anuke.mindustry.ui; -import io.anuke.arc.function.BooleanProvider; +import io.anuke.arc.func.Boolp; import io.anuke.arc.graphics.g2d.*; import io.anuke.arc.scene.Element; import io.anuke.arc.scene.ui.Image; @@ -9,9 +9,9 @@ import io.anuke.arc.scene.ui.layout.Scl; import io.anuke.mindustry.graphics.Pal; public class ReqImage extends Stack{ - private final BooleanProvider valid; + private final Boolp valid; - public ReqImage(Element image, BooleanProvider valid){ + public ReqImage(Element image, Boolp valid){ this.valid = valid; add(image); add(new Element(){ @@ -30,7 +30,7 @@ public class ReqImage extends Stack{ }); } - public ReqImage(TextureRegion region, BooleanProvider valid){ + public ReqImage(TextureRegion region, Boolp valid){ this(new Image(region), valid); } 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/ColorPicker.java b/core/src/io/anuke/mindustry/ui/dialogs/ColorPicker.java new file mode 100644 index 0000000000..03454d76e5 --- /dev/null +++ b/core/src/io/anuke/mindustry/ui/dialogs/ColorPicker.java @@ -0,0 +1,63 @@ +package io.anuke.mindustry.ui.dialogs; + +import io.anuke.arc.func.*; +import io.anuke.arc.graphics.*; +import io.anuke.arc.scene.ui.*; +import io.anuke.mindustry.gen.*; +import io.anuke.mindustry.graphics.*; + +public class ColorPicker extends FloatingDialog{ + private Cons cons = c -> {}; + private Color current = new Color(); + + public ColorPicker(){ + super("$pickcolor"); + } + + public void show(Color color, Cons consumer){ + show(color, true, consumer); + } + + public void show(Color color, boolean alpha, Cons consumer){ + this.current.set(color); + this.cons = consumer; + show(); + + cont.clear(); + cont.pane(t -> { + t.table(Tex.pane, i -> { + i.stack(new Image(Tex.alphaBg), new Image(){{ + setColor(current); + update(() -> setColor(current)); + }}).size(200f); + }).colspan(2).padBottom(5); + + float w = 150f; + + t.row(); + + t.defaults().padBottom(4); + t.add("R").color(Pal.remove); + t.addSlider(0f, 1f, 0.01f, current.r, current::r).width(w); + t.row(); + t.add("G").color(Color.lime); + t.addSlider(0f, 1f, 0.01f, current.g, current::g).width(w); + t.row(); + t.add("B").color(Color.royal); + t.addSlider(0f, 1f, 0.01f, current.b, current::b).width(w); + t.row(); + if(alpha){ + t.add("A"); + t.addSlider(0f, 1f, 0.01f, current.a, current::a).width(w); + t.row(); + } + }); + + buttons.clear(); + addCloseButton(); + buttons.addImageTextButton("$ok", Icon.checkSmall, () -> { + cons.get(current); + hide(); + }); + } +} diff --git a/core/src/io/anuke/mindustry/ui/dialogs/CustomRulesDialog.java b/core/src/io/anuke/mindustry/ui/dialogs/CustomRulesDialog.java index e0e617929e..201e3411f2 100644 --- a/core/src/io/anuke/mindustry/ui/dialogs/CustomRulesDialog.java +++ b/core/src/io/anuke/mindustry/ui/dialogs/CustomRulesDialog.java @@ -2,7 +2,7 @@ package io.anuke.mindustry.ui.dialogs; import io.anuke.arc.*; import io.anuke.arc.collection.*; -import io.anuke.arc.function.*; +import io.anuke.arc.func.*; import io.anuke.arc.graphics.*; import io.anuke.arc.scene.style.*; import io.anuke.arc.scene.ui.*; @@ -23,7 +23,7 @@ import static io.anuke.mindustry.Vars.*; public class CustomRulesDialog extends FloatingDialog{ private Table main; private Rules rules; - private Supplier resetter; + private Prov resetter; private LoadoutDialog loadoutDialog; private FloatingDialog banDialog; @@ -108,7 +108,7 @@ public class CustomRulesDialog extends FloatingDialog{ }).size(300f, 64f); } - public void show(Rules rules, Supplier resetter){ + public void show(Rules rules, Prov resetter){ this.rules = rules; this.resetter = resetter; show(); @@ -116,7 +116,7 @@ public class CustomRulesDialog extends FloatingDialog{ void setup(){ cont.clear(); - cont.pane(m -> main = m); + cont.pane(m -> main = m).get().setScrollingDisabled(true, false); main.margin(10f); main.addButton("$settings.reset", () -> { rules = resetter.get(); @@ -135,13 +135,11 @@ public class CustomRulesDialog extends FloatingDialog{ number("$rules.dropzoneradius", false, f -> rules.dropZoneRadius = f * tilesize, () -> rules.dropZoneRadius / tilesize, () -> true); title("$rules.title.respawns"); - //limited respawns don't work on PvP, commented out until they're fixed - //check("$rules.limitedRespawns", b -> rules.limitedRespawns = b, () -> rules.limitedRespawns); - //number("$rules.respawns", true, f -> rules.respawns = (int)f, () -> rules.respawns, () -> rules.limitedRespawns); number("$rules.respawntime", f -> rules.respawnTime = f * 60f, () -> rules.respawnTime / 60f); title("$rules.title.resourcesbuilding"); check("$rules.infiniteresources", b -> rules.infiniteResources = b, () -> rules.infiniteResources); + check("$rules.reactorexplosions", b -> rules.reactorExplosions = b, () -> rules.reactorExplosions); number("$rules.buildcostmultiplier", false, f -> rules.buildCostMultiplier = f, () -> rules.buildCostMultiplier, () -> !rules.infiniteResources); number("$rules.buildspeedmultiplier", f -> rules.buildSpeedMultiplier = f, () -> rules.buildSpeedMultiplier); @@ -171,18 +169,32 @@ public class CustomRulesDialog extends FloatingDialog{ check("$rules.attack", b -> rules.attackMode = b, () -> rules.attackMode); check("$rules.enemyCheat", b -> rules.enemyCheat = b, () -> rules.enemyCheat); number("$rules.enemycorebuildradius", f -> rules.enemyCoreBuildRadius = f * tilesize, () -> Math.min(rules.enemyCoreBuildRadius / tilesize, 200)); + + title("$rules.title.experimental"); + check("$rules.lighting", b -> rules.lighting = b, () -> rules.lighting); + + main.addButton(b -> { + b.left(); + b.table(Tex.pane, in -> { + in.stack(new Image(Tex.alphaBg), new Image(Tex.whiteui){{ + update(() -> setColor(rules.ambientLight)); + }}).grow(); + }).margin(4).size(50f).padRight(10); + b.add("$rules.ambientlight"); + }, () -> ui.picker.show(rules.ambientLight, rules.ambientLight::set)).left().width(250f); + main.row(); } - void number(String text, FloatConsumer cons, FloatProvider prov){ + void number(String text, Floatc cons, Floatp prov){ number(text, false, cons, prov, () -> true); } - void number(String text, boolean integer, FloatConsumer cons, FloatProvider prov, BooleanProvider condition){ + void number(String text, boolean integer, Floatc cons, Floatp prov, Boolp condition){ main.table(t -> { t.left(); t.add(text).left().padRight(5) .update(a -> a.setColor(condition.get() ? Color.white : Color.gray)); - Vars.platform.addDialog(t.addField((integer ? (int)prov.get() : prov.get()) + "", s -> cons.accept(Strings.parseFloat(s))) + Vars.platform.addDialog(t.addField((integer ? (int)prov.get() : prov.get()) + "", s -> cons.get(Strings.parseFloat(s))) .padRight(100f) .update(a -> a.setDisabled(!condition.get())) .valid(Strings::canParsePositiveFloat).width(120f).left().get()); @@ -190,17 +202,19 @@ public class CustomRulesDialog extends FloatingDialog{ main.row(); } - void check(String text, BooleanConsumer cons, BooleanProvider prov){ + void check(String text, Boolc cons, Boolp prov){ check(text, cons, prov, () -> true); } - void check(String text, BooleanConsumer cons, BooleanProvider prov, BooleanProvider condition){ + void check(String text, Boolc cons, Boolp prov, Boolp condition){ main.addCheck(text, cons).checked(prov.get()).update(a -> a.setDisabled(!condition.get())).padRight(100f).get().left(); main.row(); } void title(String text){ - main.add(text).color(Pal.accent).padTop(20).padBottom(20).padRight(100f); + main.add(text).color(Pal.accent).padTop(20).padRight(100f).padBottom(-3); + main.row(); + main.addImage().color(Pal.accent).height(3f).padRight(100f).padBottom(20); main.row(); } } diff --git a/core/src/io/anuke/mindustry/ui/dialogs/DeployDialog.java b/core/src/io/anuke/mindustry/ui/dialogs/DeployDialog.java index 4a8c1b54cd..056d0cfc24 100644 --- a/core/src/io/anuke/mindustry/ui/dialogs/DeployDialog.java +++ b/core/src/io/anuke/mindustry/ui/dialogs/DeployDialog.java @@ -2,7 +2,7 @@ package io.anuke.mindustry.ui.dialogs; import io.anuke.arc.*; import io.anuke.arc.collection.*; -import io.anuke.arc.function.*; +import io.anuke.arc.func.*; import io.anuke.arc.graphics.*; import io.anuke.arc.graphics.g2d.*; import io.anuke.arc.input.*; @@ -234,10 +234,10 @@ public class DeployDialog extends FloatingDialog{ if(zone.unlocked() && !hidden(zone)){ button.labelWrap(zone.localizedName()).style(Styles.outlineLabel).width(140).growX().get().setAlignment(Align.center); }else{ - Consumer flasher = zone.canUnlock() && !hidden(zone) ? e -> e.update(() -> e.getColor().set(Color.white).lerp(Pal.accent, Mathf.absin(3f, 1f))) : e -> {}; - flasher.accept(button.addImage(Icon.locked).get()); + 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()); button.row(); - flasher.accept(button.add("$locked").get()); + flasher.get(button.add("$locked").get()); } } diff --git a/core/src/io/anuke/mindustry/ui/dialogs/FileChooser.java b/core/src/io/anuke/mindustry/ui/dialogs/FileChooser.java index 75b260594b..c726778b5a 100644 --- a/core/src/io/anuke/mindustry/ui/dialogs/FileChooser.java +++ b/core/src/io/anuke/mindustry/ui/dialogs/FileChooser.java @@ -3,7 +3,7 @@ package io.anuke.mindustry.ui.dialogs; import io.anuke.arc.*; import io.anuke.arc.collection.*; import io.anuke.arc.files.*; -import io.anuke.arc.function.*; +import io.anuke.arc.func.*; import io.anuke.arc.graphics.g2d.*; import io.anuke.arc.scene.event.*; import io.anuke.arc.scene.ui.*; @@ -18,7 +18,7 @@ import java.util.*; import static io.anuke.mindustry.Vars.platform; public class FileChooser extends FloatingDialog{ - private static final FileHandle homeDirectory = Core.files.absolute(OS.isMac ? OS.getProperty("user.home") + "/Downloads/" : Core.files.getExternalStoragePath()); + private static final FileHandle homeDirectory = Core.files.absolute(Core.files.getExternalStoragePath()); private static FileHandle lastDirectory = homeDirectory; private Table files; @@ -27,11 +27,11 @@ public class FileChooser extends FloatingDialog{ private TextField navigation, filefield; private TextButton ok; private FileHistory stack = new FileHistory(); - private Predicate filter; - private Consumer selectListener; + private Boolf filter; + private Cons selectListener; private boolean open; - public FileChooser(String title, Predicate filter, boolean open, Consumer result){ + public FileChooser(String title, Boolf filter, boolean open, Cons result){ super(title); setFillParent(true); this.open = open; @@ -64,7 +64,7 @@ public class FileChooser extends FloatingDialog{ ok.clicked(() -> { if(ok.isDisabled()) return; if(selectListener != null) - selectListener.accept(directory.child(filefield.getText())); + selectListener.get(directory.child(filefield.getText())); hide(); }); @@ -98,10 +98,6 @@ public class FileChooser extends FloatingDialog{ updateFiles(true); }); - //Macs are confined to the Downloads/ directory - if(OS.isMac){ - up.setDisabled(true); - } ImageButton back = new ImageButton(Icon.arrowLeft); ImageButton forward = new ImageButton(Icon.arrowRight); @@ -171,8 +167,7 @@ public class FileChooser extends FloatingDialog{ private void updateFiles(boolean push){ if(push) stack.push(directory); - //if is mac, don't display extra info since you can only ever go to downloads - navigation.setText(OS.isMac ? directory.name() : directory.toString()); + navigation.setText(directory.toString()); GlyphLayout layout = Pools.obtain(GlyphLayout.class, GlyphLayout::new); @@ -190,29 +185,27 @@ public class FileChooser extends FloatingDialog{ files.top().left(); FileHandle[] names = getFileNames(); - //macs are confined to the Downloads/ directory - if(!OS.isMac){ - Image upimage = new Image(Icon.folderParentSmall); - TextButton upbutton = new TextButton(".." + directory.toString(), Styles.clearTogglet); - upbutton.clicked(() -> { - directory = directory.parent(); - lastDirectory = directory; - updateFiles(true); - }); + Image upimage = new Image(Icon.folderParentSmall); + TextButton upbutton = new TextButton(".." + directory.toString(), Styles.clearTogglet); + upbutton.clicked(() -> { + directory = directory.parent(); + lastDirectory = directory; + updateFiles(true); + }); - upbutton.left().add(upimage).padRight(4f).padLeft(4); - upbutton.getLabel().setAlignment(Align.left); - upbutton.getCells().reverse(); + upbutton.left().add(upimage).padRight(4f).padLeft(4); + upbutton.getLabel().setAlignment(Align.left); + upbutton.getCells().reverse(); + + files.add(upbutton).align(Align.topLeft).fillX().expandX().height(50).pad(2).colspan(2); + files.row(); - files.add(upbutton).align(Align.topLeft).fillX().expandX().height(50).pad(2).colspan(2); - files.row(); - } ButtonGroup group = new ButtonGroup<>(); group.setMinCheckCount(0); for(FileHandle file : names){ - if(!file.isDirectory() && !filter.test(file)) continue; //skip non-filtered files + if(!file.isDirectory() && !filter.get(file)) continue; //skip non-filtered files String filename = file.name(); diff --git a/core/src/io/anuke/mindustry/ui/dialogs/HostDialog.java b/core/src/io/anuke/mindustry/ui/dialogs/HostDialog.java index 5ecb7a3e9a..e3132a69ba 100644 --- a/core/src/io/anuke/mindustry/ui/dialogs/HostDialog.java +++ b/core/src/io/anuke/mindustry/ui/dialogs/HostDialog.java @@ -31,7 +31,7 @@ public class HostDialog extends FloatingDialog{ }).grow().pad(8).get().setMaxLength(40); ImageButton button = t.addImageButton(Tex.whiteui, Styles.clearFulli, 40, () -> { - new ColorPickDialog().show(color -> { + new PaletteDialog().show(color -> { player.color.set(color); Core.settings.put("color-0", Color.rgba8888(color)); Core.settings.save(); diff --git a/core/src/io/anuke/mindustry/ui/dialogs/JoinDialog.java b/core/src/io/anuke/mindustry/ui/dialogs/JoinDialog.java index b786bc3fe4..e8af992660 100644 --- a/core/src/io/anuke/mindustry/ui/dialogs/JoinDialog.java +++ b/core/src/io/anuke/mindustry/ui/dialogs/JoinDialog.java @@ -32,14 +32,14 @@ public class JoinDialog extends FloatingDialog{ loadServers(); - buttons.add().width(60f); - buttons.add().growX(); + if(!steam) buttons.add().width(60f); + buttons.add().growX().width(-1); addCloseButton(); - buttons.add().growX(); + buttons.add().growX().width(-1); if(!steam){ - buttons.addButton("?", () -> ui.showInfo("$join.info")).size(60f, 64f); + buttons.addButton("?", () -> ui.showInfo("$join.info")).size(60f, 64f).width(-1); } add = new FloatingDialog("$joingame.title"); @@ -247,7 +247,7 @@ public class JoinDialog extends FloatingDialog{ } ImageButton button = t.addImageButton(Tex.whiteui, Styles.clearFulli, 40, () -> { - new ColorPickDialog().show(color -> { + new PaletteDialog().show(color -> { player.color.set(color); Core.settings.put("color-0", Color.rgba8888(color)); Core.settings.save(); @@ -271,7 +271,7 @@ public class JoinDialog extends FloatingDialog{ Cell cell = ((Table)pane.getParent()).getCell(button); - if(!Mathf.isEqual(cell.minWidth(), pw)){ + if(!Mathf.equal(cell.minWidth(), pw)){ cell.width(pw); cell.padLeft(pad); pane.getParent().invalidateHierarchy(); diff --git a/core/src/io/anuke/mindustry/ui/dialogs/ModsDialog.java b/core/src/io/anuke/mindustry/ui/dialogs/ModsDialog.java index b74fdcbffe..50164a7dff 100644 --- a/core/src/io/anuke/mindustry/ui/dialogs/ModsDialog.java +++ b/core/src/io/anuke/mindustry/ui/dialogs/ModsDialog.java @@ -21,49 +21,54 @@ public class ModsDialog extends FloatingDialog{ super("$mods"); addCloseButton(); - buttons.addImageTextButton("$mods.report", Icon.link, - () -> Core.net.openURI(reportIssueURL)) + buttons.addImageTextButton(mobile ? "$mods.report" : "$mods.openfolder", Icon.link, + () -> { + if(mobile){ + Core.net.openURI(reportIssueURL); + }else{ + Core.net.openFolder(modDirectory.absolutePath()); + } + }) .size(250f, 64f); buttons.row(); buttons.addImageTextButton("$mods.guide", Icon.wiki, () -> Core.net.openURI(modGuideURL)) - .size(android ? 210f + 250f + 10f : 210, 64f).colspan(android ? 2 : 1); + .size(210, 64f); - if(!android){ - buttons.addImageTextButton("$mod.import.github", Icon.github, () -> { - ui.showTextInput("$mod.import.github", "", 64, "Anuken/ExampleMod", text -> { - ui.loadfrag.show(); - Core.net.httpGet("http://api.github.com/repos/" + text + "/zipball/master", loc -> { - Core.net.httpGet(loc.getHeader("Location"), result -> { - if(result.getStatus() != HttpStatus.OK){ - ui.showErrorMessage(Core.bundle.format("connectfail", result.getStatus())); - ui.loadfrag.hide(); - }else{ - try{ - FileHandle file = tmpDirectory.child(text.replace("/", "") + ".zip"); - Streams.copyStream(result.getResultAsStream(), file.write(false)); - mods.importMod(file); - file.delete(); - Core.app.post(() -> { - try{ - mods.reloadContent(); - setup(); - ui.loadfrag.hide(); - }catch(Throwable e){ - ui.showException(e); - } - }); - }catch(Throwable e){ - ui.showException(e); - } + buttons.addImageTextButton("$mod.import.github", Icon.github, () -> { + ui.showTextInput("$mod.import.github", "", 64, "Anuken/ExampleMod", text -> { + ui.loadfrag.show(); + Core.net.httpGet("http://api.github.com/repos/" + text + "/zipball/master", loc -> { + Core.net.httpGet(loc.getHeader("Location"), result -> { + if(result.getStatus() != HttpStatus.OK){ + ui.showErrorMessage(Core.bundle.format("connectfail", result.getStatus())); + ui.loadfrag.hide(); + }else{ + try{ + FileHandle file = tmpDirectory.child(text.replace("/", "") + ".zip"); + Streams.copyStream(result.getResultAsStream(), file.write(false)); + mods.importMod(file); + file.delete(); + Core.app.post(() -> { + try{ + mods.reloadContent(); + setup(); + ui.loadfrag.hide(); + }catch(Throwable e){ + ui.showException(e); + } + }); + }catch(Throwable e){ + modError(e); } - }, t -> Core.app.post(() -> ui.showException(t))); - }, t -> Core.app.post(() -> ui.showException(t))); - }); - }).size(250f, 64f); - } + } + }, t -> Core.app.post(() -> modError(t))); + }, t -> Core.app.post(() -> modError(t))); + }); + }).size(250f, 64f); + shown(this::setup); @@ -87,9 +92,19 @@ public class ModsDialog extends FloatingDialog{ })); } + void modError(Throwable error){ + ui.loadfrag.hide(); + + if(Strings.getCauses(error).contains(t -> t.getMessage() != null && (t.getMessage().contains("SSL") || t.getMessage().contains("protocol")))){ + ui.showErrorMessage("$feature.unsupported"); + }else{ + ui.showException(error); + } + } + void setup(){ cont.clear(); - cont.defaults().width(520f).pad(4); + cont.defaults().width(mobile ? 500 : 560f).pad(4); cont.add("$mod.reloadrequired").visible(mods::requiresReload).center().get().setAlignment(Align.center); cont.row(); if(!(mods.all().isEmpty() && mods.disabled().isEmpty())){ @@ -111,7 +126,7 @@ 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 + (" | " + Core.bundle.get(mod.enabled() ? "mod.enabled" : "mod.disabled"))).width(270f).wrap(); + title.add("[accent]" + mod.meta.name + "[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, () -> { @@ -150,7 +165,7 @@ public class ModsDialog extends FloatingDialog{ t.labelWrap(Core.bundle.format("mod.missingdependencies", mod.missingDependencies.toString(", "))).growX(); t.row(); } - }).width(500f); + }).width(mobile ? 430f : 500f); table.row(); } }); diff --git a/core/src/io/anuke/mindustry/ui/dialogs/ColorPickDialog.java b/core/src/io/anuke/mindustry/ui/dialogs/PaletteDialog.java similarity index 82% rename from core/src/io/anuke/mindustry/ui/dialogs/ColorPickDialog.java rename to core/src/io/anuke/mindustry/ui/dialogs/PaletteDialog.java index 4402d740c4..693a576691 100644 --- a/core/src/io/anuke/mindustry/ui/dialogs/ColorPickDialog.java +++ b/core/src/io/anuke/mindustry/ui/dialogs/PaletteDialog.java @@ -1,6 +1,6 @@ package io.anuke.mindustry.ui.dialogs; -import io.anuke.arc.function.*; +import io.anuke.arc.func.*; import io.anuke.arc.graphics.*; import io.anuke.arc.input.*; import io.anuke.arc.scene.ui.*; @@ -10,10 +10,10 @@ import io.anuke.mindustry.ui.*; import static io.anuke.mindustry.Vars.*; -public class ColorPickDialog extends Dialog{ - private Consumer cons; +public class PaletteDialog extends Dialog{ + private Cons cons; - public ColorPickDialog(){ + public PaletteDialog(){ super(""); build(); } @@ -26,7 +26,7 @@ public class ColorPickDialog extends Dialog{ Color color = playerColors[i]; ImageButton button = table.addImageButton(Tex.whiteui, Styles.clearTogglei, 34, () -> { - cons.accept(color); + cons.get(color); hide(); }).size(48).get(); button.setChecked(player.color.equals(color)); @@ -44,7 +44,7 @@ public class ColorPickDialog extends Dialog{ } - public void show(Consumer cons){ + public void show(Cons cons){ this.cons = cons; show(); } diff --git a/core/src/io/anuke/mindustry/ui/dialogs/SchematicsDialog.java b/core/src/io/anuke/mindustry/ui/dialogs/SchematicsDialog.java index aad45b93cc..e9c6cc18de 100644 --- a/core/src/io/anuke/mindustry/ui/dialogs/SchematicsDialog.java +++ b/core/src/io/anuke/mindustry/ui/dialogs/SchematicsDialog.java @@ -11,12 +11,12 @@ import io.anuke.arc.scene.ui.ImageButton.*; import io.anuke.arc.scene.ui.TextButton.*; import io.anuke.arc.scene.ui.layout.*; import io.anuke.arc.util.*; +import io.anuke.mindustry.core.GameState.*; import io.anuke.mindustry.game.*; import io.anuke.mindustry.gen.*; import io.anuke.mindustry.graphics.*; import io.anuke.mindustry.type.*; import io.anuke.mindustry.ui.*; -import io.anuke.mindustry.ui.Cicon; import static io.anuke.mindustry.Vars.*; @@ -34,6 +34,7 @@ public class SchematicsDialog extends FloatingDialog{ addCloseButton(); buttons.addImageTextButton("$schematic.import", Icon.loadMapSmall, this::showImport); shown(this::setup); + onResize(this::setup); } void setup(){ @@ -61,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 -> { @@ -113,17 +114,21 @@ public class SchematicsDialog extends FloatingDialog{ Label label = c.add(s.name()).style(Styles.outlineLabel).color(Color.white).top().growX().maxWidth(200f - 8f).get(); label.setEllipsis(true); label.setAlignment(Align.center); - }).growX().margin(1).pad(4).maxWidth(200f - 8f).padBottom(0); + }).growX().margin(1).pad(4).maxWidth(Scl.scl(200f - 8f)).padBottom(0); })).size(200f); }, () -> { if(sel[0].childrenPressed()) return; - control.input.useSchematic(s); - hide(); + if(state.is(State.menu)){ + showInfo(s); + }else{ + control.input.useSchematic(s); + hide(); + } }).pad(4).style(Styles.cleari).get(); sel[0].getStyle().up = Tex.pane; - if(++i % 4 == 0){ + if(++i % (mobile ? Core.graphics.isPortrait() ? 2 : 3 : 4) == 0){ t.row(); } } @@ -148,7 +153,7 @@ public class SchematicsDialog extends FloatingDialog{ t.addImageTextButton("$schematic.copy.import", Icon.copySmall, style, () -> { dialog.hide(); try{ - Schematic s = schematics.readBase64(Core.app.getClipboardText()); + Schematic s = Schematics.readBase64(Core.app.getClipboardText()); schematics.add(s); setup(); ui.showInfoFade("$schematic.saved"); diff --git a/core/src/io/anuke/mindustry/ui/dialogs/SettingsMenuDialog.java b/core/src/io/anuke/mindustry/ui/dialogs/SettingsMenuDialog.java index fdbf61df9e..28e83c63c8 100644 --- a/core/src/io/anuke/mindustry/ui/dialogs/SettingsMenuDialog.java +++ b/core/src/io/anuke/mindustry/ui/dialogs/SettingsMenuDialog.java @@ -218,15 +218,21 @@ public class SettingsMenuDialog extends SettingsDialog{ control.setInput(new MobileInput()); } }*/ - game.sliderPref("saveinterval", 60, 10, 5 * 120, i -> Core.bundle.format("setting.seconds", i)); + game.sliderPref("saveinterval", 60, 10, 5 * 120, 10, i -> Core.bundle.format("setting.seconds", i)); if(!mobile){ + game.sliderPref("blockselecttimeout", 750, 0, 2000, 50, i -> Core.bundle.format("setting.milliseconds", i)); + game.checkPref("crashreport", true); } game.checkPref("savecreate", true); - + game.checkPref("blockreplace", true); + game.checkPref("conveyorpathfinding", true); game.checkPref("hints", true); + if(!mobile){ + game.checkPref("buildautopause", false); + } if(steam && !Version.modifier.contains("beta")){ game.checkPref("publichost", false, i -> { @@ -247,7 +253,7 @@ public class SettingsMenuDialog extends SettingsDialog{ } }); - graphics.sliderPref("uiscale", 100, 25, 400, 25, s -> { + graphics.sliderPref("uiscale", 100, 25, 300, 25, s -> { if(ui.settings != null){ Core.settings.put("uiscalechanged", true); } @@ -255,7 +261,12 @@ public class SettingsMenuDialog extends SettingsDialog{ }); graphics.sliderPref("fpscap", 240, 15, 245, 5, s -> (s > 240 ? Core.bundle.get("setting.fpscap.none") : Core.bundle.format("setting.fpscap.text", s))); graphics.sliderPref("chatopacity", 100, 0, 100, 5, s -> s + "%"); - graphics.sliderPref("lasersopacity", 100, 0, 100, 5, s -> s + "%"); + graphics.sliderPref("lasersopacity", 100, 0, 100, 5, s -> { + if(ui.settings != null){ + Core.settings.put("preferredlaseropacity", s); + } + return s + "%"; + }); if(!mobile){ graphics.checkPref("vsync", true, b -> Core.graphics.setVSync(b)); @@ -292,16 +303,20 @@ public class SettingsMenuDialog extends SettingsDialog{ } graphics.checkPref("effects", true); + graphics.checkPref("destroyedblocks", true); graphics.checkPref("playerchat", true); graphics.checkPref("minimap", !mobile); graphics.checkPref("position", false); graphics.checkPref("fps", false); + if(!mobile){ + graphics.checkPref("blockselectkeys", true); + } graphics.checkPref("indicators", true); - graphics.checkPref("animatedwater", false); + graphics.checkPref("animatedwater", !mobile); if(Shaders.shield != null){ graphics.checkPref("animatedshields", !mobile); } - graphics.checkPref("bloom", false, val -> renderer.toggleBloom(val)); + graphics.checkPref("bloom", !mobile, val -> renderer.toggleBloom(val)); graphics.checkPref("pixelate", false, val -> { if(val){ Events.fire(Trigger.enablePixelation); @@ -350,7 +365,11 @@ public class SettingsMenuDialog extends SettingsDialog{ keyDown(key -> { if(key == KeyCode.ESCAPE || key == KeyCode.BACK){ - hide(); + if(prefs.getChildren().first() != menu){ + back(); + }else{ + hide(); + } } }); } diff --git a/core/src/io/anuke/mindustry/ui/dialogs/TechTreeDialog.java b/core/src/io/anuke/mindustry/ui/dialogs/TechTreeDialog.java index fb79710675..a9b8282a36 100644 --- a/core/src/io/anuke/mindustry/ui/dialogs/TechTreeDialog.java +++ b/core/src/io/anuke/mindustry/ui/dialogs/TechTreeDialog.java @@ -66,7 +66,6 @@ public class TechTreeDialog extends FloatingDialog{ }).size(210f, 64f); //scaling/drag input - addListener(new InputListener(){ @Override public boolean scrolled(InputEvent event, float x, float y, float amountX, float amountY){ diff --git a/core/src/io/anuke/mindustry/ui/dialogs/ZoneInfoDialog.java b/core/src/io/anuke/mindustry/ui/dialogs/ZoneInfoDialog.java index e563d9c07c..32d2e264f1 100644 --- a/core/src/io/anuke/mindustry/ui/dialogs/ZoneInfoDialog.java +++ b/core/src/io/anuke/mindustry/ui/dialogs/ZoneInfoDialog.java @@ -143,7 +143,7 @@ public class ZoneInfoDialog extends FloatingDialog{ cont.row(); cont.addButton(zone.canConfigure() ? "$configure" : Core.bundle.format("configure.locked", zone.configureObjective.display()), - () -> loadout.show(zone.loadout.core().itemCapacity, zone.getStartingItems(), zone::resetStartingItems, zone::updateLaunchCost, rebuildItems) + () -> loadout.show(zone.loadout.findCore().itemCapacity, zone.getStartingItems(), zone::resetStartingItems, zone::updateLaunchCost, rebuildItems) ).fillX().pad(3).disabled(b -> !zone.canConfigure()); cont.row(); diff --git a/core/src/io/anuke/mindustry/ui/fragments/BlockInventoryFragment.java b/core/src/io/anuke/mindustry/ui/fragments/BlockInventoryFragment.java index 8585bf94c7..1c663f2b4a 100644 --- a/core/src/io/anuke/mindustry/ui/fragments/BlockInventoryFragment.java +++ b/core/src/io/anuke/mindustry/ui/fragments/BlockInventoryFragment.java @@ -3,7 +3,7 @@ package io.anuke.mindustry.ui.fragments; import io.anuke.annotations.Annotations.*; import io.anuke.arc.*; import io.anuke.arc.collection.*; -import io.anuke.arc.function.*; +import io.anuke.arc.func.*; import io.anuke.arc.graphics.g2d.*; import io.anuke.arc.input.*; import io.anuke.arc.math.*; @@ -130,7 +130,7 @@ public class BlockInventoryFragment extends Fragment{ container.add(i); - BooleanProvider canPick = () -> player.acceptsItem(item) && !state.isPaused(); + Boolp canPick = () -> player.acceptsItem(item) && !state.isPaused(); HandCursorListener l = new HandCursorListener(); l.setEnabled(canPick); @@ -203,7 +203,7 @@ public class BlockInventoryFragment extends Fragment{ table.setPosition(v.x, v.y, Align.topLeft); } - private Element itemImage(TextureRegion region, Supplier text){ + private Element itemImage(TextureRegion region, Prov text){ Stack stack = new Stack(); Table t = new Table().left().bottom(); diff --git a/core/src/io/anuke/mindustry/ui/fragments/HudFragment.java b/core/src/io/anuke/mindustry/ui/fragments/HudFragment.java index 7f3effba9c..caca0a81a9 100644 --- a/core/src/io/anuke/mindustry/ui/fragments/HudFragment.java +++ b/core/src/io/anuke/mindustry/ui/fragments/HudFragment.java @@ -40,12 +40,8 @@ public class HudFragment extends Fragment{ private Table lastUnlockTable; private Table lastUnlockLayout; private boolean shown = true; - private float dsize = 59; + private float dsize = 47.2f; - private float coreAttackTime; - private float lastCoreHP; - private Team lastTeam; - private float coreAttackOpacity = 0f; private long lastToast; public void build(Group parent){ @@ -65,10 +61,12 @@ public class HudFragment extends Fragment{ ImageButtonStyle style = Styles.clearTransi; - select.addImageButton(Icon.menuLarge, style, ui.paused::show); - flip = select.addImageButton(Icon.arrowUp, style, this::toggleMenus).get(); + select.addImageButton(Icon.menuLargeSmall, style, ui.paused::show); + flip = select.addImageButton(Icon.arrowUpSmall, style, this::toggleMenus).get(); - select.addImageButton(Icon.pause, style, () -> { + select.addImageButton(Icon.pasteSmall, style, ui.schematics::show); + + select.addImageButton(Icon.pauseSmall, style, () -> { if(net.active()){ ui.listfrag.toggle(); }else{ @@ -76,14 +74,14 @@ public class HudFragment extends Fragment{ } }).name("pause").update(i -> { if(net.active()){ - i.getStyle().imageUp = Icon.players; + i.getStyle().imageUp = Icon.playersSmall; }else{ i.setDisabled(false); - i.getStyle().imageUp = state.is(State.paused) ? Icon.play : Icon.pause; + i.getStyle().imageUp = state.is(State.paused) ? Icon.playSmall : Icon.pauseSmall; } - }).get(); + }); - select.addImageButton(Icon.settings, style,() -> { + select.addImageButton(Icon.chatSmall, style,() -> { if(net.active() && mobile){ if(ui.chatfrag.chatOpen()){ ui.chatfrag.hide(); @@ -97,11 +95,11 @@ public class HudFragment extends Fragment{ } }).update(i -> { if(net.active() && mobile){ - i.getStyle().imageUp = Icon.chat; + i.getStyle().imageUp = Icon.chatSmall; }else{ - i.getStyle().imageUp = Icon.database; + i.getStyle().imageUp = Icon.databaseSmall; } - }).get(); + }); select.addImage().color(Pal.gray).width(4f).fillY(); @@ -114,7 +112,7 @@ public class HudFragment extends Fragment{ int fi = index++; parent.addChild(elem); elem.visible(() -> { - if(fi < 4){ + if(fi < 5){ elem.setSize(size); }else{ elem.setSize(Scl.scl(4f), size); @@ -124,7 +122,7 @@ public class HudFragment extends Fragment{ }); } - cont.add().size(dsize * 4 + 3, dsize).left(); + cont.add().size(dsize * 5 + 3, dsize).left(); } cont.row(); @@ -154,7 +152,7 @@ public class HudFragment extends Fragment{ addWaveTable(waves); addPlayButton(btable); - wavesMain.add(stack).width(dsize * 4 + 4f); + wavesMain.add(stack).width(dsize * 5 + 4f); wavesMain.row(); wavesMain.table(Tex.button, t -> t.margin(10f).add(new Bar("boss.health", Pal.health, () -> state.boss() == null ? 0f : state.boss().healthf()).blink(Color.white)) .grow()).fillX().visible(() -> state.rules.waves && state.boss() != null).height(60f).get(); @@ -234,7 +232,7 @@ public class HudFragment extends Fragment{ } }); } - }).width(dsize * 4 + 4f); + }).width(dsize * 5 + 4f); editorMain.visible(() -> shown && state.isEditor()); } @@ -280,44 +278,29 @@ public class HudFragment extends Fragment{ parent.fill(t -> { t.touchable(Touchable.disabled); float notifDuration = 240f; + float[] coreAttackTime = {0}; + float[] coreAttackOpacity = {0}; - Events.on(StateChangeEvent.class, event -> { - if(event.to == State.menu || event.from == State.menu){ - coreAttackTime = 0f; - lastCoreHP = Float.NaN; - } + Events.on(Trigger.teamCoreDamage, () -> { + coreAttackTime[0] = notifDuration; }); t.top().visible(() -> { if(state.is(State.menu) || state.teams.get(player.getTeam()).cores.size == 0 || state.teams.get(player.getTeam()).cores.first().entity == null){ - coreAttackTime = 0f; + coreAttackTime[0] = 0f; return false; } - float curr = state.teams.get(player.getTeam()).cores.first().entity.health; - - if(lastTeam != player.getTeam()){ - lastCoreHP = curr; - lastTeam = player.getTeam(); - return false; - } - - if(!Float.isNaN(lastCoreHP) && curr < lastCoreHP){ - coreAttackTime = notifDuration; - } - lastCoreHP = curr; - - t.getColor().a = coreAttackOpacity; - if(coreAttackTime > 0){ - coreAttackOpacity = Mathf.lerpDelta(coreAttackOpacity, 1f, 0.1f); + t.getColor().a = coreAttackOpacity[0]; + if(coreAttackTime[0] > 0){ + coreAttackOpacity[0] = Mathf.lerpDelta(coreAttackOpacity[0], 1f, 0.1f); }else{ - coreAttackOpacity = Mathf.lerpDelta(coreAttackOpacity, 0f, 0.1f); + coreAttackOpacity[0] = Mathf.lerpDelta(coreAttackOpacity[0], 0f, 0.1f); } - coreAttackTime -= Time.delta(); - lastTeam = player.getTeam(); + coreAttackTime[0] -= Time.delta(); - return coreAttackOpacity > 0; + return coreAttackOpacity[0] > 0; }); t.table(Tex.button, top -> top.add("$coreattack").pad(2) .update(label -> label.getColor().set(Color.orange).lerp(Color.scarlet, Mathf.absin(Time.time(), 2f, 1f)))).touchable(Touchable.disabled); @@ -578,7 +561,7 @@ public class HudFragment extends Fragment{ private void toggleMenus(){ if(flip != null){ - flip.getStyle().imageUp = shown ? Icon.arrowDown : Icon.arrowUp; + flip.getStyle().imageUp = shown ? Icon.arrowDownSmall : Icon.arrowUpSmall; } shown = !shown; diff --git a/core/src/io/anuke/mindustry/ui/fragments/LoadingFragment.java b/core/src/io/anuke/mindustry/ui/fragments/LoadingFragment.java index fc0a246851..dec9860e0d 100644 --- a/core/src/io/anuke/mindustry/ui/fragments/LoadingFragment.java +++ b/core/src/io/anuke/mindustry/ui/fragments/LoadingFragment.java @@ -1,6 +1,6 @@ package io.anuke.mindustry.ui.fragments; -import io.anuke.arc.function.*; +import io.anuke.arc.func.*; import io.anuke.arc.graphics.*; import io.anuke.arc.scene.Group; import io.anuke.arc.scene.actions.*; @@ -36,7 +36,7 @@ public class LoadingFragment extends Fragment{ }); } - public void setProgress(FloatProvider progress){ + public void setProgress(Floatp progress){ bar.reset(0f); bar.visible(true); bar.set(() -> ((int)(progress.get() * 100) + "%"), progress, Pal.accent); diff --git a/core/src/io/anuke/mindustry/ui/fragments/MenuFragment.java b/core/src/io/anuke/mindustry/ui/fragments/MenuFragment.java index 4fb14f855d..9229546fe0 100644 --- a/core/src/io/anuke/mindustry/ui/fragments/MenuFragment.java +++ b/core/src/io/anuke/mindustry/ui/fragments/MenuFragment.java @@ -164,6 +164,8 @@ public class MenuFragment extends Fragment{ ), new Buttoni("$editor", Icon.editorSmall, ui.maps::show), steam ? new Buttoni("$workshop", Icon.saveSmall, platform::openWorkshop) : null, new Buttoni(Core.bundle.get("mods") + "\n" + Core.bundle.get("mods.alpha"), Icon.wikiSmall, ui.mods::show), + //not enough space for this button + //new Buttoni("$schematics", Icon.pasteSmall, ui.schematics::show), new Buttoni("$settings", Icon.toolsSmall, ui.settings::show), new Buttoni("$about.button", Icon.infoSmall, ui.about::show), new Buttoni("$quit", Icon.exitSmall, Core.app::exit) diff --git a/core/src/io/anuke/mindustry/ui/fragments/PlacementFragment.java b/core/src/io/anuke/mindustry/ui/fragments/PlacementFragment.java index 93ef539a96..95bdd5affa 100644 --- a/core/src/io/anuke/mindustry/ui/fragments/PlacementFragment.java +++ b/core/src/io/anuke/mindustry/ui/fragments/PlacementFragment.java @@ -26,15 +26,35 @@ import static io.anuke.mindustry.Vars.*; public class PlacementFragment extends Fragment{ final int rowWidth = 4; + public Category currentCategory = Category.distribution; Array returnArray = new Array<>(); Array returnCatArray = new Array<>(); boolean[] categoryEmpty = new boolean[Category.all.length]; - Category currentCategory = Category.distribution; + ObjectMap selectedBlocks = new ObjectMap(); Block hovered, lastDisplay; Tile lastHover; Tile hoverTile; Table blockTable, toggler, topTable; boolean lastGround; + boolean blockSelectEnd; + int blockSelectSeq; + long blockSelectSeqMillis; + Binding[] blockSelect = { + Binding.block_select_01, + Binding.block_select_02, + Binding.block_select_03, + Binding.block_select_04, + Binding.block_select_05, + Binding.block_select_06, + Binding.block_select_07, + Binding.block_select_08, + Binding.block_select_09, + Binding.block_select_10, + Binding.block_select_left, + Binding.block_select_right, + Binding.block_select_up, + Binding.block_select_down + }; public PlacementFragment(){ Events.on(WorldLoadEvent.class, event -> { @@ -49,6 +69,10 @@ public class PlacementFragment extends Fragment{ rebuild(); } }); + + Events.on(ResetEvent.class, event -> { + selectedBlocks.clear(); + }); } void rebuild(){ @@ -78,6 +102,78 @@ public class PlacementFragment extends Fragment{ return true; } } + + if(ui.chatfrag.chatOpen()) return false; + for(int i = 0; i < blockSelect.length; i++){ + if(Core.input.keyTap(blockSelect[i])){ + if(i > 9) { //select block directionally + Array blocks = getByCategory(currentCategory); + Block currentBlock = getSelectedBlock(currentCategory); + for(int j = 0; j < blocks.size; j++){ + if(blocks.get(j) == currentBlock){ + switch(i){ + case 10: //left + j = (j - 1 + blocks.size) % blocks.size; + break; + case 11: //right + j = (j + 1) % blocks.size; + break; + case 12: //up + j = (j > 3 ? j - 4 : blocks.size - blocks.size % 4 + j); + j -= (j < blocks.size ? 0 : 4); + break; + case 13: //down + j = (j < blocks.size - 4 ? j + 4 : j % 4); + } + input.block = blocks.get(j); + selectedBlocks.put(currentCategory, input.block); + break; + } + } + }else if(blockSelectEnd || Time.timeSinceMillis(blockSelectSeqMillis) > Core.settings.getInt("blockselecttimeout")){ //1st number of combo, select category + //select only visible categories + if(!getByCategory(Category.all[i]).isEmpty()){ + currentCategory = Category.all[i]; + if(input.block != null){ + input.block = getSelectedBlock(currentCategory); + } + blockSelectEnd = false; + blockSelectSeq = 0; + blockSelectSeqMillis = Time.millis(); + } + }else{ //select block + if(blockSelectSeq == 0){ //2nd number of combo + blockSelectSeq = i + 1; + }else{ //3rd number of combo + //entering "X,1,0" selects the same block as "X,0" + i += (blockSelectSeq - (i != 9 ? 0 : 1)) * 10; + blockSelectEnd = true; + } + Array blocks = getByCategory(currentCategory); + input.block = (i < blocks.size) ? blocks.get(i) : null; + selectedBlocks.put(currentCategory, input.block); + blockSelectSeqMillis = Time.millis(); + } + return true; + } + } + + if(Core.input.keyTap(Binding.category_prev)){ + do{ + currentCategory = currentCategory.prev(); + }while(categoryEmpty[currentCategory.ordinal()]); + input.block = getSelectedBlock(currentCategory); + return true; + } + + if(Core.input.keyTap(Binding.category_next)){ + do{ + currentCategory = currentCategory.next(); + }while(categoryEmpty[currentCategory.ordinal()]); + input.block = getSelectedBlock(currentCategory); + return true; + } + return false; } @@ -104,14 +200,10 @@ public class PlacementFragment extends Fragment{ blockTable.row(); } - if(!unlocked(block)){ - blockTable.add().size(46); - continue; - } - ImageButton button = blockTable.addImageButton(Icon.lockedSmall, Styles.selecti, () -> { if(unlocked(block)){ control.input.block = control.input.block == block ? null : block; + selectedBlocks.put(currentCategory, control.input.block); } }).size(46f).group(group).name("block-" + block.name).get(); @@ -164,9 +256,22 @@ public class PlacementFragment extends Fragment{ lastGround = false; topTable.table(header -> { + String keyCombo = ""; + if(!mobile && Core.settings.getBool("blockselectkeys")){ + Array blocks = getByCategory(currentCategory); + for(int i = 0; i < blocks.size; i++){ + if(blocks.get(i) == lastDisplay){ + keyCombo = Core.bundle.format("placement.blockselectkeys", Core.keybinds.get(blockSelect[currentCategory.ordinal()]).key.toString()) + + (i < 10 ? "" : Core.keybinds.get(blockSelect[(i + 1) / 10 - 1]).key.toString() + ",") + + Core.keybinds.get(blockSelect[i % 10]).key.toString() + "]"; + break; + } + } + } + final String keyComboFinal = keyCombo; header.left(); header.add(new Image(lastDisplay.icon(Cicon.medium))).size(8 * 4); - header.labelWrap(() -> !unlocked(lastDisplay) ? Core.bundle.get("block.unknown") : lastDisplay.localizedName) + header.labelWrap(() -> !unlocked(lastDisplay) ? Core.bundle.get("block.unknown") : lastDisplay.localizedName + keyComboFinal) .left().width(190f).padLeft(5); header.add().growX(); if(unlocked(lastDisplay)){ @@ -185,7 +290,7 @@ public class PlacementFragment extends Fragment{ req.table(line -> { line.left(); line.addImage(stack.item.icon(Cicon.small)).size(8 * 2); - line.add(stack.item.localizedName()).color(Color.lightGray).padLeft(2).left(); + line.add(stack.item.localizedName).maxWidth(140f).fillX().color(Color.lightGray).padLeft(2).left().get().setEllipsis(true); line.labelWrap(() -> { TileEntity core = player.getClosestCore(); if(core == null || state.rules.infiniteResources) return "*/*"; @@ -232,7 +337,14 @@ public class PlacementFragment extends Fragment{ frame.row(); frame.table(Tex.pane2, blocksSelect -> { blocksSelect.margin(4).marginTop(0); - blocksSelect.pane(blocks -> blockTable = blocks).height(194f).grow().get().setStyle(Styles.smallPane); + blocksSelect.pane(blocks -> blockTable = blocks).height(194f).update(pane -> { + if(pane.hasScroll()){ + Element result = Core.scene.hit(Core.input.mouseX(), Core.input.mouseY(), true); + if(result == null || !result.isDescendantOf(pane)){ + Core.scene.setScrollFocus(null); + } + } + }).grow().get().setStyle(Styles.smallPane); blocksSelect.row(); blocksSelect.table(control.input::buildPlacementUI).name("inputTable").growX(); }).fillY().bottom().touchable(Touchable.enabled); @@ -252,7 +364,7 @@ public class PlacementFragment extends Fragment{ //update category empty values for(Category cat : Category.all){ Array blocks = getByCategory(cat); - categoryEmpty[cat.ordinal()] = blocks.isEmpty() || !unlocked(blocks.first()); + categoryEmpty[cat.ordinal()] = blocks.isEmpty(); } int f = 0; @@ -266,6 +378,9 @@ public class PlacementFragment extends Fragment{ categories.addImageButton(Core.atlas.drawable("icon-" + cat.name() + "-smaller"), Styles.clearToggleTransi, () -> { currentCategory = cat; + if(control.input.block != null){ + control.input.block = getSelectedBlock(currentCategory); + } rebuildCategory.run(); }).group(group).update(i -> i.setChecked(currentCategory == cat)).name("category-" + cat.name()); } @@ -289,7 +404,7 @@ public class PlacementFragment extends Fragment{ Array getByCategory(Category cat){ returnArray.clear(); for(Block block : content.blocks()){ - if(block.category == cat && block.isVisible()){ + if(block.category == cat && block.isVisible() && unlocked(block)){ returnArray.add(block); } } @@ -301,6 +416,13 @@ public class PlacementFragment extends Fragment{ return returnArray; } + Block getSelectedBlock(Category cat){ + if(selectedBlocks.get(cat) == null){ + selectedBlocks.put(cat, getByCategory(cat).find(this::unlocked)); + } + return selectedBlocks.get(cat); + } + boolean unlocked(Block block){ return !world.isZone() || data.isUnlocked(block); } @@ -340,4 +462,4 @@ public class PlacementFragment extends Fragment{ Block tileDisplayBlock(){ return hoverTile == null ? null : hoverTile.block().synthetic() ? hoverTile.block() : hoverTile.drop() != null ? hoverTile.overlay().itemDrop != null ? hoverTile.overlay() : hoverTile.floor() : null; } -} \ No newline at end of file +} diff --git a/core/src/io/anuke/mindustry/ui/layout/RadialTreeLayout.java b/core/src/io/anuke/mindustry/ui/layout/RadialTreeLayout.java index b8aad3d3c4..e0c8006cb9 100644 --- a/core/src/io/anuke/mindustry/ui/layout/RadialTreeLayout.java +++ b/core/src/io/anuke/mindustry/ui/layout/RadialTreeLayout.java @@ -15,27 +15,29 @@ public class RadialTreeLayout implements TreeLayout{ delta = root.height * 2.4f; bfs(root, true); - radialize(root, 0, 360); + + ObjectSet all = new ObjectSet<>(visited); + for(TreeNode node : all){ + node.leaves = bfs(node, false); + } + + radialize(root, startRadius, 0, 360); } - void radialize(TreeNode root, float from, float to){ - int depthOfVertex = root.number; - float theta = from; - float radius = startRadius + (delta * depthOfVertex); + void radialize(TreeNode root, float radius, float from, float to){ + float angle = from; - int leavesNumber = bfs(root, false); for(TreeNode child : root.children){ - int lambda = bfs(child, false); - float mi = theta + ((float)lambda / leavesNumber * (to - from)); + float nextAngle = angle + ((float)child.leaves / root.leaves * (to - from)); - float x = radius * Mathf.cos((theta + mi) / 2f * Mathf.degRad); - float y = radius * Mathf.sin((theta + mi) / 2f * Mathf.degRad); + float x = radius * Mathf.cos((angle + nextAngle) / 2f * Mathf.degRad); + float y = radius * Mathf.sin((angle + nextAngle) / 2f * Mathf.degRad); child.x = x; child.y = y; - if(child.children.length > 0) radialize(child, theta, mi); - theta = mi; + if(child.children.length > 0) radialize(child, radius + delta, angle, nextAngle); + angle = nextAngle; } } @@ -54,8 +56,7 @@ public class RadialTreeLayout implements TreeLayout{ for(TreeNode child : current.children){ if(assign) child.number = current.number + 1; - if(!visited.contains(child)){ - visited.add(child); + if(visited.add(child)){ queue.addLast(child); } } diff --git a/core/src/io/anuke/mindustry/ui/layout/TreeLayout.java b/core/src/io/anuke/mindustry/ui/layout/TreeLayout.java index 8b905e051d..6b9f4556da 100644 --- a/core/src/io/anuke/mindustry/ui/layout/TreeLayout.java +++ b/core/src/io/anuke/mindustry/ui/layout/TreeLayout.java @@ -12,7 +12,7 @@ public interface TreeLayout{ //internal stuff public float mode, prelim, change, shift; - public int number = -1; + public int number = -1, leaves; public TreeNode thread, ancestor; public boolean isLeaf(){ diff --git a/core/src/io/anuke/mindustry/world/Block.java b/core/src/io/anuke/mindustry/world/Block.java index 0472713e87..8a8c5f4d23 100644 --- a/core/src/io/anuke/mindustry/world/Block.java +++ b/core/src/io/anuke/mindustry/world/Block.java @@ -7,7 +7,7 @@ import io.anuke.arc.Graphics.Cursor.*; import io.anuke.arc.audio.*; import io.anuke.arc.collection.EnumSet; import io.anuke.arc.collection.*; -import io.anuke.arc.function.*; +import io.anuke.arc.func.*; import io.anuke.arc.graphics.*; import io.anuke.arc.graphics.g2d.*; import io.anuke.arc.graphics.g2d.TextureAtlas.*; @@ -89,8 +89,12 @@ public class Block extends BlockStorage{ public boolean configurable; /** Whether this block consumes touchDown events when tapped. */ public boolean consumesTap; + /** Whether to draw the glow of the liquid for this block, if it has one. */ + public boolean drawLiquidLight = true; /** Whether the config is positional and needs to be shifted. */ public boolean posConfig; + /** Whether this block uses conveyor-type placement mode.*/ + public boolean conveyorPlacement; /** * The color of this block when displayed on the minimap or map preview. * Do not set manually! This is overriden when loading for most blocks. @@ -135,6 +139,7 @@ public class Block extends BlockStorage{ protected TextureRegion[] cacheRegions = {}; protected Array cacheRegionStrings = new Array<>(); + protected Prov entityType = TileEntity::new; protected Array tempTiles = new Array<>(); protected TextureRegion[] generatedIcons; @@ -205,7 +210,8 @@ public class Block extends BlockStorage{ if(tile == null || tile.entity == null || tile.entity.power == null) return out; for(Tile other : tile.entity.proximity()){ - if(other != null && other.entity != null && other.entity.power != null && !(consumesPower && other.block().consumesPower && !outputsPower && !other.block().outputsPower) + if(other != null && other.entity != null && other.entity.power != null + && !(consumesPower && other.block().consumesPower && !outputsPower && !other.block().outputsPower) && !tile.entity.power.links.contains(other.pos())){ out.add(other); } @@ -219,11 +225,7 @@ public class Block extends BlockStorage{ } protected float getProgressIncrease(TileEntity entity, float baseTime){ - float progressIncrease = 1f / baseTime * entity.delta(); - if(hasPower){ - progressIncrease *= entity.power.satisfaction; // Reduced increase in case of low power - } - return progressIncrease; + return 1f / baseTime * entity.delta() * entity.efficiency(); } /** @return whether this block should play its active sound.*/ @@ -233,7 +235,7 @@ public class Block extends BlockStorage{ /** @return whether this block should play its idle sound.*/ public boolean shouldIdleSound(Tile tile){ - return canProduce(tile); + return shouldConsume(tile); } public void drawLayer(Tile tile){ @@ -293,6 +295,23 @@ public class Block extends BlockStorage{ Draw.rect(region, tile.drawx(), tile.drawy(), rotate ? tile.rotation() * 90 : 0); } + public void drawLight(Tile tile){ + if(tile.entity != null && hasLiquids && drawLiquidLight && tile.entity.liquids.current().lightColor.a > 0.001f){ + drawLiquidLight(tile, tile.entity.liquids.current(), tile.entity.liquids.smoothAmount()); + } + } + + public void drawLiquidLight(Tile tile, Liquid liquid, float amount){ + if(amount > 0.01f){ + Color color = liquid.lightColor; + float fract = 1f; + float opacity = color.a * fract; + if(opacity > 0.001f){ + renderer.lights.add(tile.drawx(), tile.drawy(), size * 30f * fract, color, opacity); + } + } + } + public void drawTeam(Tile tile){ Draw.color(tile.getTeam().color); Draw.rect("block-border", tile.drawx() - size * tilesize / 2f + 4, tile.drawy() - size * tilesize / 2f + 4); @@ -364,6 +383,16 @@ public class Block extends BlockStorage{ return sum; } + public float percentSolid(int x, int y){ + Tile tile = world.tile(x, y); + if(tile == null) return 0; + float sum = 0; + for(Tile other : tile.getLinkedTilesAs(this, tempTiles)){ + sum += !other.floor.isLiquid ? 1f : 0f; + } + return sum / size / size; + } + @Override public String localizedName(){ return localizedName; @@ -514,7 +543,7 @@ public class Block extends BlockStorage{ bars.add("health", entity -> new Bar("blocks.health", Pal.health, entity::healthf).blink(Color.white)); if(hasLiquids){ - Function current; + Func current; if(consumes.has(ConsumeType.liquid) && consumes.get(ConsumeType.liquid) instanceof ConsumeLiquid){ Liquid liquid = consumes.get(ConsumeType.liquid).liquid; current = entity -> liquid; @@ -522,7 +551,7 @@ public class Block extends BlockStorage{ 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(), - () -> current.get(entity).color, () -> entity.liquids.get(current.get(entity)) / liquidCapacity)); + () -> current.get(entity).barColor(), () -> entity.liquids.get(current.get(entity)) / liquidCapacity)); } if(hasPower && consumes.hasPower()){ @@ -530,8 +559,8 @@ public class Block extends BlockStorage{ boolean buffered = cons.buffered; float capacity = cons.capacity; - bars.add("power", entity -> new Bar(() -> buffered ? Core.bundle.format("bar.poweramount", Float.isNaN(entity.power.satisfaction * capacity) ? "" : (int)(entity.power.satisfaction * capacity)) : - Core.bundle.get("bar.power"), () -> Pal.powerBar, () -> Mathf.isZero(cons.requestedPower(entity)) && entity.power.graph.getPowerProduced() + entity.power.graph.getBatteryStored() > 0f ? 1f : entity.power.satisfaction)); + bars.add("power", entity -> new Bar(() -> buffered ? Core.bundle.format("bar.poweramount", Float.isNaN(entity.power.status * capacity) ? "" : (int)(entity.power.status * capacity)) : + Core.bundle.get("bar.power"), () -> Pal.powerBar, () -> Mathf.zero(cons.requestedPower(entity)) && entity.power.graph.getPowerProduced() + entity.power.graph.getBatteryStored() > 0f ? 1f : entity.power.status)); } if(hasItems && configurable){ @@ -551,6 +580,11 @@ public class Block extends BlockStorage{ return (other != this || rotate) && this.group != BlockGroup.none && other.group == this.group; } + /** @return a possible replacement for this block when placed in a line by the player. */ + public Block getReplacement(BuildRequest req, Array requests){ + return this; + } + public float handleDamage(Tile tile, float amount){ return amount; } @@ -587,12 +621,12 @@ public class Block extends BlockStorage{ } if(consumes.hasPower() && consumes.getPower().buffered){ - power += tile.entity.power.satisfaction * consumes.getPower().capacity; + power += tile.entity.power.status * consumes.getPower().capacity; } if(hasLiquids){ - tile.entity.liquids.forEach((liquid, amount) -> { + tile.entity.liquids.each((liquid, amount) -> { float splash = Mathf.clamp(amount / 4f, 0f, 10f); for(int i = 0; i < Mathf.clamp(amount / 5, 0, 30); i++){ @@ -668,7 +702,7 @@ public class Block extends BlockStorage{ } public void displayBars(Tile tile, Table table){ - for(Function bar : bars.list()){ + for(Func bar : bars.list()){ table.add(bar.get(tile.entity)).growX(); table.row(); } @@ -702,13 +736,20 @@ public class Block extends BlockStorage{ Color color = content instanceof Item ? ((Item)content).color : content instanceof Liquid ? ((Liquid)content).color : null; if(color == null) return; + float prev = Draw.scl; + Draw.color(color); Draw.scl *= req.animScale; Draw.rect(region, req.drawx(), req.drawy()); - Draw.scl /= req.animScale; + Draw.scl = prev; Draw.color(); } + /** @return a custom minimap color for this tile, or 0 to use default colors. */ + public int minimapColor(Tile tile){ + return 0; + } + public void drawRequestConfigTop(BuildRequest req, Eachable list){ } @@ -816,8 +857,8 @@ public class Block extends BlockStorage{ return destructible || update; } - public TileEntity newEntity(){ - return new TileEntity(); + public final TileEntity newEntity(){ + return entityType.get(); } /** Offset for placing and drawing multiblocks. */ diff --git a/core/src/io/anuke/mindustry/world/BlockStorage.java b/core/src/io/anuke/mindustry/world/BlockStorage.java index fc2ab42d1a..ced126de72 100644 --- a/core/src/io/anuke/mindustry/world/BlockStorage.java +++ b/core/src/io/anuke/mindustry/world/BlockStorage.java @@ -28,6 +28,7 @@ public abstract class BlockStorage extends UnlockableContent{ public int itemCapacity = 10; public float liquidCapacity = 10f; + public float liquidPressure = 1f; public final BlockStats stats = new BlockStats(); public final BlockBars bars = new BlockBars(); @@ -41,6 +42,10 @@ public abstract class BlockStorage extends UnlockableContent{ return true; } + public boolean productionValid(Tile tile){ + return true; + } + public float getPowerProduction(Tile tile){ return 0f; } @@ -111,7 +116,9 @@ public abstract class BlockStorage extends UnlockableContent{ Tile other = proximity.get((i + dump) % proximity.size); Tile in = Edges.getFacingEdge(tile, other); - if(other.getTeam() == tile.getTeam() && other.block().hasLiquids && canDumpLiquid(tile, other, liquid) && other.entity.liquids != null){ + other = other.block().getLiquidDestination(other, in, liquid); + + if(other != null && other.getTeam() == tile.getTeam() && other.block().hasLiquids && canDumpLiquid(tile, other, liquid) && other.entity.liquids != null){ float ofract = other.entity.liquids.get(liquid) / other.block().liquidCapacity; float fract = tile.entity.liquids.get(liquid) / liquidCapacity; @@ -135,15 +142,20 @@ public abstract class BlockStorage extends UnlockableContent{ } public float tryMoveLiquid(Tile tile, Tile next, boolean leak, Liquid liquid){ + return tryMoveLiquid(tile, next, leak ? 1.5f : 100, liquid); + } + + public float tryMoveLiquid(Tile tile, Tile next, float leakResistance, Liquid liquid){ if(next == null) return 0; next = next.link(); + next = next.block().getLiquidDestination(next, tile, liquid); if(next.getTeam() == tile.getTeam() && next.block().hasLiquids && tile.entity.liquids.get(liquid) > 0f){ if(next.block().acceptLiquid(next, tile, liquid, 0f)){ float ofract = next.entity.liquids.get(liquid) / next.block().liquidCapacity; - float fract = tile.entity.liquids.get(liquid) / liquidCapacity; + float fract = tile.entity.liquids.get(liquid) / liquidCapacity * liquidPressure; float flow = Math.min(Mathf.clamp((fract - ofract) * (1f)) * (liquidCapacity), tile.entity.liquids.get(liquid)); flow = Math.min(flow, next.block().liquidCapacity - next.entity.liquids.get(liquid) - 0.001f); @@ -167,14 +179,18 @@ public abstract class BlockStorage extends UnlockableContent{ } } } - }else if(leak && !next.block().solid && !next.block().hasLiquids){ - float leakAmount = tile.entity.liquids.get(liquid) / 1.5f; + }else if(leakResistance != 100f && !next.block().solid && !next.block().hasLiquids){ + float leakAmount = tile.entity.liquids.get(liquid) / leakResistance; Puddle.deposit(next, tile, liquid, leakAmount); tile.entity.liquids.remove(liquid, leakAmount); } return 0; } + public Tile getLiquidDestination(Tile tile, Tile from, Liquid liquid){ + return tile; + } + /** * Tries to put this item into a nearby container, if there are no available * containers, it gets added to the block's inventory. @@ -266,9 +282,4 @@ public abstract class BlockStorage extends UnlockableContent{ } return false; } - - /** Returns whether this block's inventory has space and is ready for production. */ - public boolean canProduce(Tile tile){ - return true; - } } diff --git a/core/src/io/anuke/mindustry/world/Build.java b/core/src/io/anuke/mindustry/world/Build.java index c8a137f520..5f7834ed25 100644 --- a/core/src/io/anuke/mindustry/world/Build.java +++ b/core/src/io/anuke/mindustry/world/Build.java @@ -16,7 +16,6 @@ import io.anuke.mindustry.world.blocks.BuildBlock.BuildEntity; import static io.anuke.mindustry.Vars.*; public class Build{ - private static final Rectangle rect = new Rectangle(); /** Returns block type that was broken, or null if unsuccesful. */ @Remote(called = Loc.server) diff --git a/core/src/io/anuke/mindustry/world/Tile.java b/core/src/io/anuke/mindustry/world/Tile.java index 2dfe5a8669..06e6cdca81 100644 --- a/core/src/io/anuke/mindustry/world/Tile.java +++ b/core/src/io/anuke/mindustry/world/Tile.java @@ -1,7 +1,7 @@ package io.anuke.mindustry.world; import io.anuke.arc.collection.*; -import io.anuke.arc.function.*; +import io.anuke.arc.func.*; import io.anuke.arc.math.*; import io.anuke.arc.math.geom.*; import io.anuke.arc.util.ArcAnnotate.*; @@ -123,15 +123,15 @@ public class Tile implements Position, TargetTrait{ return block().solid && !block().synthetic() && block().fillsTile; } - public Floor floor(){ + public @NonNull Floor floor(){ return floor; } - public Block block(){ + public @NonNull Block block(){ return block; } - public Floor overlay(){ + public @NonNull Floor overlay(){ return overlay; } @@ -251,7 +251,7 @@ public class Tile implements Position, TargetTrait{ * Returns the list of all tiles linked to this multiblock, or an empty array if it's not a multiblock. * This array contains all linked tiles, including this tile itself. */ - public void getLinkedTiles(Consumer cons){ + public void getLinkedTiles(Cons cons){ if(block.isMultiblock()){ int size = block.size; int offsetx = -(size - 1) / 2; @@ -259,11 +259,11 @@ public class Tile implements Position, TargetTrait{ for(int dx = 0; dx < size; dx++){ for(int dy = 0; dy < size; dy++){ Tile other = world.tile(x + dx + offsetx, y + dy + offsety); - if(other != null) cons.accept(other); + if(other != null) cons.get(other); } } }else{ - cons.accept(this); + cons.get(this); } } @@ -318,6 +318,31 @@ public class Tile implements Position, TargetTrait{ return null; } + public Tile getNearbyLink(int rotation){ + if(rotation == 0) return world.ltile(x + 1, y); + if(rotation == 1) return world.ltile(x, y + 1); + if(rotation == 2) return world.ltile(x - 1, y); + if(rotation == 3) return world.ltile(x, y - 1); + return null; + } + + // ▲ ▲ ▼ ▼ ◀ ▶ ◀ ▶ B A + public @Nullable Tile front(){ + return getNearbyLink((rotation + 4) % 4); + } + + public @Nullable Tile right(){ + return getNearbyLink((rotation + 3) % 4); + } + + public @Nullable Tile back(){ + return getNearbyLink((rotation + 2) % 4); + } + + public @Nullable Tile left(){ + return getNearbyLink((rotation + 1) % 4); + } + public boolean interactable(Team team){ return getTeam() == Team.derelict || team == getTeam(); } diff --git a/core/src/io/anuke/mindustry/world/blocks/Autotiler.java b/core/src/io/anuke/mindustry/world/blocks/Autotiler.java index 4ee4d938fb..29e99361a4 100644 --- a/core/src/io/anuke/mindustry/world/blocks/Autotiler.java +++ b/core/src/io/anuke/mindustry/world/blocks/Autotiler.java @@ -1,8 +1,8 @@ package io.anuke.mindustry.world.blocks; -import io.anuke.arc.function.*; import io.anuke.arc.math.*; import io.anuke.arc.math.geom.*; +import io.anuke.arc.util.*; import io.anuke.arc.util.ArcAnnotate.*; import io.anuke.mindustry.entities.traits.BuilderTrait.*; import io.anuke.mindustry.world.*; @@ -87,6 +87,12 @@ public interface Autotiler{ return other != null && blends(tile, rotation, other.x, other.y, other.rotation(), other.block()); } + default boolean blendsArmored(Tile tile, int rotation, int otherx, int othery, int otherrot, Block otherblock){ + return (Point2.equals(tile.x + Geometry.d4(rotation).x, tile.y + Geometry.d4(rotation).y, otherx, othery) + || ((!otherblock.rotate && Edges.getFacingEdge(otherblock, otherx, othery, tile) != null && + Edges.getFacingEdge(otherblock, otherx, othery, tile).relativeTo(tile) == rotation) || (otherblock.rotate && Point2.equals(otherx + Geometry.d4(otherrot).x, othery + Geometry.d4(otherrot).y, tile.x, tile.y)))); + } + default boolean lookingAt(Tile tile, int rotation, int otherx, int othery, int otherrot, Block otherblock){ return (Point2.equals(tile.x + Geometry.d4(rotation).x, tile.y + Geometry.d4(rotation).y, otherx, othery) || (!otherblock.rotate || Point2.equals(otherx + Geometry.d4(otherrot).x, othery + Geometry.d4(otherrot).y, tile.x, tile.y))); diff --git a/core/src/io/anuke/mindustry/world/blocks/BuildBlock.java b/core/src/io/anuke/mindustry/world/blocks/BuildBlock.java index 10f678173c..45023deac8 100644 --- a/core/src/io/anuke/mindustry/world/blocks/BuildBlock.java +++ b/core/src/io/anuke/mindustry/world/blocks/BuildBlock.java @@ -7,6 +7,7 @@ import io.anuke.arc.Graphics.Cursor.*; import io.anuke.arc.graphics.g2d.*; import io.anuke.arc.math.*; import io.anuke.arc.util.ArcAnnotate.*; +import io.anuke.arc.util.*; import io.anuke.mindustry.content.*; import io.anuke.mindustry.entities.*; import io.anuke.mindustry.entities.effect.*; @@ -29,6 +30,10 @@ public class BuildBlock extends Block{ public static final int maxSize = 9; private static final BuildBlock[] buildBlocks = new BuildBlock[maxSize]; + private static long lastTime = 0; + private static int pitchSeq = 0; + private static long lastPlayed; + public BuildBlock(int size){ super("build" + size); this.size = size; @@ -37,6 +42,7 @@ public class BuildBlock extends Block{ layer = Layer.placement; consumesTap = true; solidifes = true; + entityType = BuildEntity::new; buildBlocks[size - 1] = this; } @@ -53,7 +59,7 @@ public class BuildBlock extends Block{ Effects.effect(Fx.breakBlock, tile.drawx(), tile.drawy(), block.size); world.removeBlock(tile); Events.fire(new BlockBuildEndEvent(tile, playerGroup.getByID(builderID), team, true)); - Sounds.breaks.at(tile, Mathf.random(0.7f, 1.4f)); + if(shouldPlay()) Sounds.breaks.at(tile, calcPitch(false)); } @Remote(called = Loc.server) @@ -73,12 +79,36 @@ public class BuildBlock extends Block{ Effects.effect(Fx.placeBlock, tile.drawx(), tile.drawy(), block.size); } + static boolean shouldPlay(){ + if(Time.timeSinceMillis(lastPlayed) >= 32){ + lastPlayed = Time.millis(); + return true; + }else{ + return false; + } + } + + static float calcPitch(boolean up){ + if(Time.timeSinceMillis(lastTime) < 16 * 30){ + lastTime = Time.millis(); + pitchSeq ++; + if(pitchSeq > 30){ + pitchSeq = 0; + } + return 1f + Mathf.clamp(pitchSeq / 30f) * (up ? 1.9f : -0.4f); + }else{ + pitchSeq = 0; + lastTime = Time.millis(); + return Mathf.random(0.7f, 1.3f); + } + } + public static void constructed(Tile tile, Block block, int builderID, byte rotation, Team team, boolean skipConfig){ Call.onConstructFinish(tile, block, builderID, rotation, team, skipConfig); tile.block().placed(tile); Events.fire(new BlockBuildEndEvent(tile, playerGroup.getByID(builderID), team, false)); - Sounds.place.at(tile, Mathf.random(0.7f, 1.4f)); + if(shouldPlay()) Sounds.place.at(tile, calcPitch(true)); } @Override @@ -115,6 +145,9 @@ public class BuildBlock extends Block{ //if the target is constructible, begin constructing if(entity.cblock != null){ + if(player.buildWasAutoPaused && !player.isBuilding){ + player.isBuilding = true; + } //player.clearBuilding(); player.addBuildRequest(new BuildRequest(tile.x, tile.y, tile.rotation(), entity.cblock), false); } @@ -165,11 +198,6 @@ public class BuildBlock extends Block{ } } - @Override - public TileEntity newEntity(){ - return new BuildEntity(); - } - public class BuildEntity extends TileEntity{ /** * The recipe of the block that is being constructed. diff --git a/core/src/io/anuke/mindustry/world/blocks/ItemSelection.java b/core/src/io/anuke/mindustry/world/blocks/ItemSelection.java index b892ade149..26e4a3d5c9 100644 --- a/core/src/io/anuke/mindustry/world/blocks/ItemSelection.java +++ b/core/src/io/anuke/mindustry/world/blocks/ItemSelection.java @@ -1,7 +1,7 @@ package io.anuke.mindustry.world.blocks; import io.anuke.arc.collection.*; -import io.anuke.arc.function.*; +import io.anuke.arc.func.*; import io.anuke.arc.scene.style.*; import io.anuke.arc.scene.ui.*; import io.anuke.arc.scene.ui.layout.*; @@ -14,7 +14,7 @@ import static io.anuke.mindustry.Vars.*; public class ItemSelection{ - public static void buildItemTable(Table table, Supplier holder, Consumer consumer){ + public static void buildItemTable(Table table, Prov holder, Cons consumer){ Array items = content.items(); @@ -29,7 +29,7 @@ public class ItemSelection{ if(!data.isUnlocked(item) && world.isZone()) continue; ImageButton button = cont.addImageButton(Tex.whiteui, Styles.clearToggleTransi, 24, () -> control.input.frag.config.hideConfig()).group(group).get(); - button.changed(() -> consumer.accept(button.isChecked() ? item : null)); + button.changed(() -> consumer.get(button.isChecked() ? item : null)); button.getStyle().imageUp = new TextureRegionDrawable(item.icon(Cicon.small)); button.update(() -> button.setChecked(holder.get() == item)); 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 de358e7b53..1dff9f636c 100644 --- a/core/src/io/anuke/mindustry/world/blocks/defense/DeflectorWall.java +++ b/core/src/io/anuke/mindustry/world/blocks/defense/DeflectorWall.java @@ -20,6 +20,7 @@ public class DeflectorWall extends Wall{ public DeflectorWall(String name){ super(name); + entityType = DeflectorEntity::new; } @Override @@ -72,11 +73,6 @@ public class DeflectorWall extends Wall{ ((DeflectorEntity)entity).hit = 1f; } - @Override - public TileEntity newEntity(){ - return new DeflectorEntity(); - } - public static class DeflectorEntity extends TileEntity{ public float hit; } 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 d10afac6aa..b0c83fba9d 100644 --- a/core/src/io/anuke/mindustry/world/blocks/defense/Door.java +++ b/core/src/io/anuke/mindustry/world/blocks/defense/Door.java @@ -31,6 +31,7 @@ public class Door extends Wall{ solid = false; solidifes = true; consumesTap = true; + entityType = DoorEntity::new; } @Remote(called = Loc.server) @@ -89,11 +90,6 @@ public class Door extends Wall{ Call.onDoorToggle(null, tile, !entity.open); } - @Override - public TileEntity newEntity(){ - return new DoorEntity(); - } - public class DoorEntity extends TileEntity{ public boolean open = false; 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 4107281512..4dce2d9db9 100644 --- a/core/src/io/anuke/mindustry/world/blocks/defense/ForceProjector.java +++ b/core/src/io/anuke/mindustry/world/blocks/defense/ForceProjector.java @@ -1,7 +1,7 @@ package io.anuke.mindustry.world.blocks.defense; import io.anuke.arc.*; -import io.anuke.arc.function.*; +import io.anuke.arc.func.*; import io.anuke.arc.graphics.*; import io.anuke.arc.graphics.g2d.*; import io.anuke.arc.math.*; @@ -31,13 +31,12 @@ public class ForceProjector extends Block{ protected float cooldownLiquid = 1.5f; protected float cooldownBrokenBase = 0.35f; protected float basePowerDraw = 0.2f; - protected float powerDamage = 0.1f; protected TextureRegion topRegion; private static Tile paramTile; private static ForceProjector paramBlock; private static ForceEntity paramEntity; - private static Consumer shieldConsumer = trait -> { + private static Cons shieldConsumer = trait -> { if(trait.canBeAbsorbed() && trait.getTeam() != paramTile.getTeam() && paramBlock.isInsideHexagon(trait.getX(), trait.getY(), paramBlock.realRadius(paramEntity) * 2f, paramTile.drawx(), paramTile.drawy())){ trait.absorb(); Effects.effect(Fx.absorb, trait); @@ -55,6 +54,7 @@ public class ForceProjector extends Block{ hasLiquids = true; hasItems = true; consumes.add(new ConsumeLiquidFilter(liquid -> liquid.temperature <= 0.5f && liquid.flammability < 0.1f, 0.1f)).boost().update(false); + entityType = ForceEntity::new; } @Override @@ -73,8 +73,6 @@ public class ForceProjector extends Block{ super.setStats(); stats.add(BlockStat.powerUse, basePowerDraw * 60f, StatUnit.powerSecond); - stats.add(BlockStat.powerDamage, powerDamage, StatUnit.powerUnits); - stats.add(BlockStat.boostEffect, phaseRadiusBoost / tilesize, StatUnit.blocks); } @@ -101,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(); } @@ -111,12 +109,12 @@ public class ForceProjector extends Block{ Effects.effect(Fx.reactorsmoke, tile.drawx() + Mathf.range(tilesize / 2f), tile.drawy() + Mathf.range(tilesize / 2f)); } - entity.warmup = Mathf.lerpDelta(entity.warmup, entity.power.satisfaction, 0.1f); + entity.warmup = Mathf.lerpDelta(entity.warmup, entity.efficiency(), 0.1f); /* - if(entity.power.satisfaction < relativePowerDraw){ + if(entity.power.status < relativePowerDraw){ entity.warmup = Mathf.lerpDelta(entity.warmup, 0f, 0.15f); - entity.power.satisfaction = 0f; + entity.power.status = 0f; if(entity.warmup <= 0.09f){ entity.broken = true; } @@ -182,11 +180,6 @@ public class ForceProjector extends Block{ Draw.reset(); } - @Override - public TileEntity newEntity(){ - return new ForceEntity(); - } - class ForceEntity extends TileEntity{ ShieldEntity shield; boolean broken = true; 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 d2149dcbab..5ba2461265 100644 --- a/core/src/io/anuke/mindustry/world/blocks/defense/MendProjector.java +++ b/core/src/io/anuke/mindustry/world/blocks/defense/MendProjector.java @@ -38,6 +38,7 @@ public class MendProjector extends Block{ update = true; hasPower = true; hasItems = true; + entityType = MendEntity::new; } @Override @@ -70,7 +71,7 @@ public class MendProjector extends Block{ entity.phaseHeat = Mathf.lerpDelta(entity.phaseHeat, Mathf.num(entity.cons.optionalValid()), 0.1f); - if(entity.cons.optionalValid() && entity.timer.get(timerUse, useTime) && entity.power.satisfaction > 0){ + if(entity.cons.optionalValid() && entity.timer.get(timerUse, useTime) && entity.efficiency() > 0){ entity.cons.trigger(); } @@ -90,7 +91,7 @@ public class MendProjector extends Block{ if(other == null) continue; 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.power.satisfaction); + 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); healed.add(other.pos()); } @@ -133,13 +134,13 @@ public class MendProjector extends Block{ } @Override - public TileEntity newEntity(){ - return new MendEntity(); + public void drawLight(Tile tile){ + renderer.lights.add(tile.drawx(), tile.drawy(), 50f * tile.entity.efficiency(), color, 0.7f * tile.entity.efficiency()); } class MendEntity extends TileEntity{ float heat; - float charge; + float charge = Mathf.random(reload); float phaseHeat; @Override 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 5ff8c2ba94..cc8c99a54e 100644 --- a/core/src/io/anuke/mindustry/world/blocks/defense/OverdriveProjector.java +++ b/core/src/io/anuke/mindustry/world/blocks/defense/OverdriveProjector.java @@ -37,6 +37,7 @@ public class OverdriveProjector extends Block{ hasPower = true; hasItems = true; canOverdrive = false; + entityType = OverdriveEntity::new; } @Override @@ -66,6 +67,11 @@ public class OverdriveProjector extends Block{ stats.add(BlockStat.boostEffect, (int)((speedBoost + speedBoostPhase) * 100f), StatUnit.percent); } + @Override + public void drawLight(Tile tile){ + renderer.lights.add(tile.drawx(), tile.drawy(), 50f * tile.entity.efficiency(), color, 0.7f * tile.entity.efficiency()); + } + @Override public void update(Tile tile){ OverdriveEntity entity = tile.entity(); @@ -74,13 +80,13 @@ public class OverdriveProjector extends Block{ entity.phaseHeat = Mathf.lerpDelta(entity.phaseHeat, Mathf.num(entity.cons.optionalValid()), 0.1f); - if(entity.timer.get(timerUse, useTime) && entity.power.satisfaction > 0){ + if(entity.timer.get(timerUse, useTime) && entity.efficiency() > 0){ entity.cons.trigger(); } if(entity.charge >= reload){ float realRange = range + entity.phaseHeat * phaseRangeBoost; - float realBoost = (speedBoost + entity.phaseHeat * speedBoostPhase) * entity.power.satisfaction; + float realBoost = (speedBoost + entity.phaseHeat * speedBoostPhase) * entity.efficiency(); entity.charge = 0f; @@ -132,14 +138,9 @@ public class OverdriveProjector extends Block{ Draw.reset(); } - @Override - public TileEntity newEntity(){ - return new OverdriveEntity(); - } - class OverdriveEntity extends TileEntity{ float heat; - float charge; + float charge = Mathf.random(reload); float phaseHeat; @Override 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 aa7151df98..3f02328eed 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 @@ -1,13 +1,12 @@ package io.anuke.mindustry.world.blocks.defense.turrets; -import io.anuke.arc.math.Mathf; -import io.anuke.arc.util.Time; -import io.anuke.mindustry.content.Fx; -import io.anuke.mindustry.entities.Effects; -import io.anuke.mindustry.entities.Effects.Effect; -import io.anuke.mindustry.entities.bullet.BulletType; -import io.anuke.mindustry.entities.type.TileEntity; -import io.anuke.mindustry.world.Tile; +import io.anuke.arc.math.*; +import io.anuke.arc.util.*; +import io.anuke.mindustry.content.*; +import io.anuke.mindustry.entities.*; +import io.anuke.mindustry.entities.Effects.*; +import io.anuke.mindustry.entities.bullet.*; +import io.anuke.mindustry.world.*; import static io.anuke.mindustry.Vars.tilesize; @@ -21,6 +20,7 @@ public class ChargeTurret extends PowerTurret{ public ChargeTurret(String name){ super(name); + entityType = LaserTurretEntity::new; } @Override @@ -59,11 +59,6 @@ public class ChargeTurret extends PowerTurret{ return !entity.shooting; } - @Override - public TileEntity newEntity(){ - return new LaserTurretEntity(); - } - public class LaserTurretEntity extends TurretEntity{ public boolean shooting; } 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 40110a7d26..dca1324e66 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 @@ -28,6 +28,7 @@ public class ItemTurret extends CooledTurret{ public ItemTurret(String name){ super(name); hasItems = true; + entityType = ItemTurretEntity::new; } /** Initializes accepted ammo map. Format: [item1, bullet1, item2, bullet2...] */ @@ -45,7 +46,7 @@ public class ItemTurret extends CooledTurret{ @Override public void build(Tile tile, Table table){ MultiReqImage image = new MultiReqImage(); - content.items().each(i -> filter.test(i) && (!world.isZone() || data.isUnlocked(i)), item -> image.add(new ReqImage(new ItemImage(item.icon(Cicon.medium)), + 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))); table.add(image).size(8 * 4); @@ -148,11 +149,6 @@ public class ItemTurret extends CooledTurret{ return ammo != null && ammo.get(item) != null && entity.totalAmmo + ammo.get(item).ammoMultiplier <= maxAmmo; } - @Override - public TileEntity newEntity(){ - return new ItemTurretEntity(); - } - public class ItemTurretEntity extends TurretEntity{ @Override public void write(DataOutput stream) throws IOException{ 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 d6b94f872c..2766e79724 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 @@ -23,6 +23,7 @@ public class LaserTurret extends PowerTurret{ consumes.add(new ConsumeLiquidFilter(liquid -> liquid.temperature <= 0.5f && liquid.flammability < 0.1f, 0.01f)).update(false); coolantMultiplier = 1f; + entityType = LaserTurretEntity::new; } @Override @@ -99,11 +100,6 @@ public class LaserTurret extends PowerTurret{ entity.bulletLife = shootDuration; } - @Override - public TileEntity newEntity(){ - return new LaserTurretEntity(); - } - @Override public boolean shouldActiveSound(Tile tile){ LaserTurretEntity entity = tile.entity(); 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 4cbcb4a680..28a33aa82a 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 @@ -14,7 +14,7 @@ import io.anuke.mindustry.world.meta.values.*; import static io.anuke.mindustry.Vars.*; -public abstract class LiquidTurret extends Turret{ +public class LiquidTurret extends Turret{ protected ObjectMap ammo = new ObjectMap<>(); public LiquidTurret(String name){ 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 b8b0055096..7e4c54ace4 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 @@ -1,12 +1,13 @@ package io.anuke.mindustry.world.blocks.defense.turrets; +import io.anuke.arc.util.ArcAnnotate.*; import io.anuke.mindustry.entities.bullet.BulletType; import io.anuke.mindustry.world.Tile; import io.anuke.mindustry.world.meta.BlockStat; import io.anuke.mindustry.world.meta.StatUnit; -public abstract class PowerTurret extends CooledTurret{ - protected BulletType shootType; +public class PowerTurret extends CooledTurret{ + protected @NonNull BulletType shootType; protected float powerUse = 1f; public PowerTurret(String name){ @@ -46,6 +47,6 @@ public abstract class PowerTurret extends CooledTurret{ @Override protected float baseReloadSpeed(Tile tile){ - return tile.isEnemyCheat() ? 1f : tile.entity.power.satisfaction; + return tile.isEnemyCheat() ? 1f : tile.entity.power.status; } } 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 8a124ea3cc..05edbe5091 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 @@ -4,7 +4,7 @@ import io.anuke.arc.Core; import io.anuke.arc.audio.*; import io.anuke.arc.collection.Array; import io.anuke.arc.collection.EnumSet; -import io.anuke.arc.function.BiConsumer; +import io.anuke.arc.func.Cons2; import io.anuke.arc.graphics.Blending; import io.anuke.arc.graphics.Color; import io.anuke.arc.graphics.g2d.*; @@ -60,8 +60,8 @@ public abstract class Turret extends Block{ protected TextureRegion baseRegion, heatRegion; - protected BiConsumer drawer = (tile, entity) -> Draw.rect(region, tile.drawx() + tr2.x, tile.drawy() + tr2.y, entity.rotation - 90); - protected BiConsumer heatDrawer = (tile, entity) -> { + protected Cons2 drawer = (tile, entity) -> Draw.rect(region, tile.drawx() + tr2.x, tile.drawy() + tr2.y, entity.rotation - 90); + protected Cons2 heatDrawer = (tile, entity) -> { if(entity.heat <= 0.00001f) return; Draw.color(heatColor, entity.heat); Draw.blend(Blending.additive); @@ -79,6 +79,7 @@ public abstract class Turret extends Block{ group = BlockGroup.turrets; flags = EnumSet.of(BlockFlag.turret); outlineIcon = true; + entityType = TurretEntity::new; } @Override @@ -119,10 +120,10 @@ public abstract class Turret extends Block{ tr2.trns(entity.rotation, -entity.recoil); - drawer.accept(tile, entity); + drawer.get(tile, entity); if(heatRegion != Core.atlas.find("error")){ - heatDrawer.accept(tile, entity); + heatDrawer.get(tile, entity); } } @@ -305,11 +306,6 @@ public abstract class Turret extends Block{ return (tile.entity instanceof TurretEntity); } - @Override - public TileEntity newEntity(){ - return new TurretEntity(); - } - public static abstract class AmmoEntry{ public int amount; diff --git a/core/src/io/anuke/mindustry/world/blocks/distribution/ArmoredConveyor.java b/core/src/io/anuke/mindustry/world/blocks/distribution/ArmoredConveyor.java index 17de588eea..c91c16318b 100644 --- a/core/src/io/anuke/mindustry/world/blocks/distribution/ArmoredConveyor.java +++ b/core/src/io/anuke/mindustry/world/blocks/distribution/ArmoredConveyor.java @@ -1,6 +1,5 @@ package io.anuke.mindustry.world.blocks.distribution; -import io.anuke.arc.math.geom.*; import io.anuke.mindustry.type.*; import io.anuke.mindustry.world.*; @@ -16,9 +15,7 @@ public class ArmoredConveyor extends Conveyor{ } @Override - public boolean blends(Tile tile, int rotation, int otherx, int othery, int otherrot, Block otherblock){ - return otherblock.outputsItems() && otherblock instanceof Conveyor && (Point2.equals(tile.x + Geometry.d4(rotation).x, tile.y + Geometry.d4(rotation).y, otherx, othery) - || ((!otherblock.rotate && Edges.getFacingEdge(otherblock, otherx, othery, tile) != null && - Edges.getFacingEdge(otherblock, otherx, othery, tile).relativeTo(tile) == tile.rotation()) || Point2.equals(otherx + Geometry.d4(otherrot).x, othery + Geometry.d4(otherrot).y, tile.x, tile.y))); + public boolean blends(Tile tile, int rotation, int otherx, int othery, int otherrot, Block otherblock) { + return otherblock.outputsItems() && blendsArmored(tile, rotation, otherx, othery, otherrot, otherblock); } } 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 74d47e2c6d..4fc815676d 100644 --- a/core/src/io/anuke/mindustry/world/blocks/distribution/BufferedItemBridge.java +++ b/core/src/io/anuke/mindustry/world/blocks/distribution/BufferedItemBridge.java @@ -1,10 +1,8 @@ package io.anuke.mindustry.world.blocks.distribution; -import io.anuke.arc.math.Mathf; -import io.anuke.mindustry.entities.type.TileEntity; -import io.anuke.mindustry.type.Item; -import io.anuke.mindustry.world.ItemBuffer; -import io.anuke.mindustry.world.Tile; +import io.anuke.arc.math.*; +import io.anuke.mindustry.type.*; +import io.anuke.mindustry.world.*; import java.io.*; @@ -18,6 +16,7 @@ public class BufferedItemBridge extends ExtendingItemBridge{ super(name); hasPower = false; hasItems = true; + entityType = BufferedItemBridgeEntity::new; } @Override @@ -38,11 +37,6 @@ public class BufferedItemBridge extends ExtendingItemBridge{ } } - @Override - public TileEntity newEntity(){ - return new BufferedItemBridgeEntity(); - } - class BufferedItemBridgeEntity extends ItemBridgeEntity{ ItemBuffer buffer = new ItemBuffer(bufferCapacity, speed); 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 5465aa3e93..e05812d523 100644 --- a/core/src/io/anuke/mindustry/world/blocks/distribution/Conveyor.java +++ b/core/src/io/anuke/mindustry/world/blocks/distribution/Conveyor.java @@ -2,17 +2,18 @@ package io.anuke.mindustry.world.blocks.distribution; import io.anuke.arc.*; import io.anuke.arc.collection.*; -import io.anuke.arc.function.*; +import io.anuke.arc.func.*; import io.anuke.arc.graphics.g2d.*; import io.anuke.arc.math.*; import io.anuke.arc.math.geom.*; import io.anuke.arc.util.*; +import io.anuke.mindustry.content.*; 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.type.*; -import io.anuke.mindustry.ui.Cicon; +import io.anuke.mindustry.ui.*; import io.anuke.mindustry.world.*; import io.anuke.mindustry.world.blocks.*; import io.anuke.mindustry.world.meta.*; @@ -29,9 +30,6 @@ public class Conveyor extends Block implements Autotiler{ private static ItemPos pos2 = new ItemPos(); private final Vector2 tr1 = new Vector2(); private final Vector2 tr2 = new Vector2(); - private final int[] blendresult = new int[3]; - private final BuildRequest[] directionals = new BuildRequest[4]; - private TextureRegion[][] regions = new TextureRegion[7][4]; protected float speed = 0f; @@ -44,6 +42,8 @@ public class Conveyor extends Block implements Autotiler{ group = BlockGroup.transportation; hasItems = true; itemCapacity = 4; + conveyorPlacement = true; + entityType = ConveyorEntity::new; idleSound = Sounds.conveyor; idleSoundVolume = 0.004f; @@ -59,7 +59,7 @@ public class Conveyor extends Block implements Autotiler{ @Override public void setStats(){ super.setStats(); - stats.add(BlockStat.itemsMoved, speed * 60 * (1f / itemSpace), StatUnit.itemsSecond); + stats.add(BlockStat.itemsMoved, speed * 60 / itemSpace, StatUnit.itemsSecond); } @Override @@ -183,7 +183,7 @@ public class Conveyor extends Block implements Autotiler{ Tile next = tile.getNearby(tile.rotation()); if(next != null) next = next.link(); - float nextMax = next != null && next.block() instanceof Conveyor ? 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.entity().minitem, 0) : 1f; int minremove = Integer.MAX_VALUE; for(int i = entity.convey.size - 1; i >= 0; i--){ @@ -201,7 +201,7 @@ public class Conveyor extends Block implements Autotiler{ if(maxmove > minmove){ pos.y += maxmove; - if(Mathf.isEqual(pos.x, 0, 0.1f)){ + if(Mathf.equal(pos.x, 0, 0.1f)){ pos.x = 0f; } pos.x = Mathf.lerpDelta(pos.x, 0, 0.1f); @@ -251,6 +251,16 @@ public class Conveyor extends Block implements Autotiler{ return true; } + @Override + public Block getReplacement(BuildRequest req, Array requests){ + Boolf cont = p -> requests.contains(o -> o.x == req.x + p.x && o.y == req.y + p.y && o.rotation == req.rotation && (req.block instanceof Conveyor || req.block instanceof Junction)); + return cont.get(Geometry.d4(req.rotation)) && + cont.get(Geometry.d4(req.rotation - 2)) && + req.tile() != null && + req.tile().block() instanceof Conveyor && + Mathf.mod(req.tile().rotation() - req.rotation, 2) == 1 ? Blocks.junction : this; + } + @Override public int removeStack(Tile tile, Item item, int amount){ ConveyorEntity entity = tile.entity(); @@ -333,11 +343,6 @@ public class Conveyor extends Block implements Autotiler{ entity.lastInserted = (byte)(entity.convey.size - 1); } - @Override - public TileEntity newEntity(){ - return new ConveyorEntity(); - } - public static class ConveyorEntity extends TileEntity{ LongArray convey = new LongArray(); 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 3c11b5903f..826f35fbfd 100644 --- a/core/src/io/anuke/mindustry/world/blocks/distribution/ItemBridge.java +++ b/core/src/io/anuke/mindustry/world/blocks/distribution/ItemBridge.java @@ -3,7 +3,6 @@ package io.anuke.mindustry.world.blocks.distribution; import io.anuke.arc.*; import io.anuke.arc.collection.*; import io.anuke.arc.collection.IntSet.*; -import io.anuke.arc.function.*; import io.anuke.arc.graphics.*; import io.anuke.arc.graphics.g2d.*; import io.anuke.arc.math.*; @@ -42,22 +41,12 @@ public class ItemBridge extends Block{ hasItems = true; unloadable = false; group = BlockGroup.transportation; + entityType = ItemBridgeEntity::new; } @Override public void configured(Tile tile, Player player, int value){ - ItemBridgeEntity entity = tile.entity(); - - if(world.tile(entity.link) != null && world.tile(entity.link).entity instanceof ItemBridgeEntity){ - ItemBridgeEntity oe = world.tile(entity.link).entity(); - oe.incoming.remove(tile.pos()); - } - - entity.link = value; - - if(world.tile(value) != null && world.tile(value).entity instanceof ItemBridgeEntity){ - ((ItemBridgeEntity)world.tile(value).entity).incoming.add(tile.pos()); - } + tile.entity().link = value; } @Override @@ -196,8 +185,9 @@ public class ItemBridge extends Block{ tryDump(tile); entity.uptime = 0f; }else{ + ((ItemBridgeEntity)world.tile(entity.link).entity).incoming.add(tile.pos()); - if(entity.cons.valid() && (!hasPower || Mathf.isZero(1f - entity.power.satisfaction))){ + if(entity.cons.valid() && Mathf.zero(1f - entity.efficiency())){ entity.uptime = Mathf.lerpDelta(entity.uptime, 1f, 0.04f); }else{ entity.uptime = Mathf.lerpDelta(entity.uptime, 0f, 0.02f); @@ -351,11 +341,6 @@ public class ItemBridge extends Block{ return rel != rel2; } - @Override - public TileEntity newEntity(){ - return new ItemBridgeEntity(); - } - public boolean linkValid(Tile tile, Tile other){ return linkValid(tile, other, true); } 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 e184492864..7877317185 100644 --- a/core/src/io/anuke/mindustry/world/blocks/distribution/Junction.java +++ b/core/src/io/anuke/mindustry/world/blocks/distribution/Junction.java @@ -27,6 +27,7 @@ public class Junction extends Block{ instantTransfer = true; group = BlockGroup.transportation; unloadable = false; + entityType = JunctionEntity::new; } @Override @@ -87,11 +88,6 @@ public class Junction extends Block{ return to != null && to.link().entity != null; } - @Override - public TileEntity newEntity(){ - return new JunctionEntity(); - } - class JunctionEntity extends TileEntity{ DirectionalItemBuffer buffer = new DirectionalItemBuffer(capacity, speed); diff --git a/core/src/io/anuke/mindustry/world/blocks/distribution/LiquidJunction.java b/core/src/io/anuke/mindustry/world/blocks/distribution/LiquidJunction.java deleted file mode 100644 index c2942cb797..0000000000 --- a/core/src/io/anuke/mindustry/world/blocks/distribution/LiquidJunction.java +++ /dev/null @@ -1,60 +0,0 @@ -package io.anuke.mindustry.world.blocks.distribution; - -import io.anuke.arc.Core; -import io.anuke.arc.graphics.g2d.Draw; -import io.anuke.arc.graphics.g2d.TextureRegion; -import io.anuke.mindustry.type.Liquid; -import io.anuke.mindustry.world.Tile; -import io.anuke.mindustry.world.blocks.LiquidBlock; -import io.anuke.mindustry.world.meta.BlockStat; - -public class LiquidJunction extends LiquidBlock{ - - public LiquidJunction(String name){ - super(name); - hasLiquids = true; - } - - @Override - public void setStats(){ - super.setStats(); - stats.remove(BlockStat.liquidCapacity); - } - - @Override - public void setBars(){ - super.setBars(); - bars.remove("liquid"); - } - - @Override - public void draw(Tile tile){ - Draw.rect(name, tile.worldx(), tile.worldy()); - } - - @Override - public TextureRegion[] generateIcons(){ - return new TextureRegion[]{Core.atlas.find(name)}; - } - - @Override - public void handleLiquid(Tile tile, Tile source, Liquid liquid, float amount){ - int dir = source.relativeTo(tile.x, tile.y); - dir = (dir + 4) % 4; - Tile to = tile.getNearby(dir).link(); - - if(to.block().hasLiquids && to.block().acceptLiquid(to, tile, liquid, amount)){ - to.block().handleLiquid(to, tile, liquid, amount); - } - } - - @Override - public boolean acceptLiquid(Tile dest, Tile source, Liquid liquid, float amount){ - int dir = source.relativeTo(dest.x, dest.y); - dir = (dir + 4) % 4; - Tile to = dest.getNearby(dir); - if(to == null) return false; - to = to.link(); - return to != null && to.entity != null && to.block().hasLiquids && to.block().acceptLiquid(to, dest, liquid, amount); - } -} 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 04a8af5b9b..c4a1aba990 100644 --- a/core/src/io/anuke/mindustry/world/blocks/distribution/MassDriver.java +++ b/core/src/io/anuke/mindustry/world/blocks/distribution/MassDriver.java @@ -42,16 +42,9 @@ public class MassDriver extends Block{ layer = Layer.turret; hasPower = true; outlineIcon = true; + entityType = MassDriverEntity::new; } - /* - @Remote(targets = Loc.both, called = Loc.server, forward = true) - public static void linkMassDriver(Player player, Tile tile, int position){ - if(!Units.canInteract(player, tile)) return; - MassDriverEntity entity = tile.entity(); - entity.link = position; - }*/ - @Override public void configured(Tile tile, Player player, int value){ tile.entity().link = value; @@ -77,7 +70,7 @@ public class MassDriver extends Block{ //reload regardless of state if(entity.reload > 0f){ - entity.reload = Mathf.clamp(entity.reload - entity.delta() / reloadTime * entity.power.satisfaction); + entity.reload = Mathf.clamp(entity.reload - entity.delta() / reloadTime * entity.efficiency()); } //cleanup waiting shooters that are not valid @@ -113,7 +106,7 @@ public class MassDriver extends Block{ } //align to shooter rotation - entity.rotation = Mathf.slerpDelta(entity.rotation, tile.angleTo(entity.currentShooter()), rotateSpeed * entity.power.satisfaction); + entity.rotation = Mathf.slerpDelta(entity.rotation, tile.angleTo(entity.currentShooter()), rotateSpeed * entity.efficiency()); }else if(entity.state == DriverState.shooting){ //if there's nothing to shoot at OR someone wants to shoot at this thing, bail if(!hasLink || (!entity.waitingShooters.isEmpty() && (itemCapacity - entity.items.total() >= minDistribute))){ @@ -133,7 +126,7 @@ public class MassDriver extends Block{ if(entity.reload <= 0.0001f){ //align to target location - entity.rotation = Mathf.slerpDelta(entity.rotation, targetRotation, rotateSpeed * entity.power.satisfaction); + entity.rotation = Mathf.slerpDelta(entity.rotation, targetRotation, rotateSpeed * entity.efficiency()); //fire when it's the first in the queue and angles are ready. if(other.currentShooter() == tile && @@ -213,11 +206,6 @@ public class MassDriver extends Block{ return tile.entity.items.total() < itemCapacity && linkValid(tile); } - @Override - public TileEntity newEntity(){ - return new MassDriverEntity(); - } - protected void fire(Tile tile, Tile target){ MassDriverEntity entity = tile.entity(); MassDriverEntity other = target.entity(); 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 e1bdc27bd8..b25635e005 100644 --- a/core/src/io/anuke/mindustry/world/blocks/distribution/OverflowGate.java +++ b/core/src/io/anuke/mindustry/world/blocks/distribution/OverflowGate.java @@ -19,6 +19,7 @@ public class OverflowGate extends Block{ update = true; group = BlockGroup.transportation; unloadable = false; + entityType = OverflowGateEntity::new; } @Override @@ -108,11 +109,6 @@ public class OverflowGate extends Block{ return to; } - @Override - public TileEntity newEntity(){ - return new OverflowGateEntity(); - } - public class OverflowGateEntity extends TileEntity{ Item lastItem; Tile lastInput; 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 bd92126717..fdff392743 100644 --- a/core/src/io/anuke/mindustry/world/blocks/distribution/Router.java +++ b/core/src/io/anuke/mindustry/world/blocks/distribution/Router.java @@ -19,6 +19,7 @@ public class Router extends Block{ itemCapacity = 1; group = BlockGroup.transportation; unloadable = false; + entityType = RouterEntity::new; } @Override @@ -82,11 +83,6 @@ public class Router extends Block{ return result; } - @Override - public TileEntity newEntity(){ - return new RouterEntity(); - } - public class RouterEntity extends TileEntity{ Item lastItem; Tile lastInput; 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 a1ef2bce86..13eb1224e8 100644 --- a/core/src/io/anuke/mindustry/world/blocks/distribution/Sorter.java +++ b/core/src/io/anuke/mindustry/world/blocks/distribution/Sorter.java @@ -1,9 +1,9 @@ package io.anuke.mindustry.world.blocks.distribution; -import io.anuke.arc.function.*; import io.anuke.arc.graphics.g2d.*; import io.anuke.arc.math.*; import io.anuke.arc.scene.ui.layout.*; +import io.anuke.arc.util.*; import io.anuke.arc.util.ArcAnnotate.*; import io.anuke.mindustry.entities.traits.BuilderTrait.*; import io.anuke.mindustry.entities.type.*; @@ -28,6 +28,7 @@ public class Sorter extends Block{ group = BlockGroup.transportation; configurable = true; unloadable = false; + entityType = SorterEntity::new; } @Override @@ -64,6 +65,11 @@ public class Sorter extends Block{ Draw.color(); } + @Override + public int minimapColor(Tile tile){ + return tile.entity().sortItem == null ? 0 : tile.entity().sortItem.color.rgba(); + } + @Override public boolean acceptItem(Item item, Tile tile, Tile source){ Tile to = getTileTarget(item, tile, source, false); @@ -79,7 +85,7 @@ 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){ @@ -132,12 +138,6 @@ public class Sorter extends Block{ }); } - @Override - public TileEntity newEntity(){ - return new SorterEntity(); - } - - public class SorterEntity extends TileEntity{ @Nullable Item sortItem; diff --git a/core/src/io/anuke/mindustry/world/blocks/liquid/ArmoredConduit.java b/core/src/io/anuke/mindustry/world/blocks/liquid/ArmoredConduit.java new file mode 100644 index 0000000000..7a50ef5f0a --- /dev/null +++ b/core/src/io/anuke/mindustry/world/blocks/liquid/ArmoredConduit.java @@ -0,0 +1,45 @@ +package io.anuke.mindustry.world.blocks.liquid; + +import io.anuke.arc.Core; +import io.anuke.arc.graphics.g2d.Draw; +import io.anuke.arc.graphics.g2d.TextureRegion; +import io.anuke.mindustry.type.Liquid; +import io.anuke.mindustry.world.Block; +import io.anuke.mindustry.world.Edges; +import io.anuke.mindustry.world.Tile; + +public class ArmoredConduit extends Conduit{ + protected TextureRegion capRegion; + + public ArmoredConduit(String name){ + super(name); + leakResistance = 10f; + } + + @Override + public void load(){ + super.load(); + capRegion = Core.atlas.find(name + "-cap"); + } + + @Override + public void draw(Tile tile){ + super.draw(tile); + + // draw the cap when a conduit would normally leak + Tile next = tile.front(); + if(next != null && next.getTeam() == tile.getTeam() && next.block().hasLiquids) return; + + Draw.rect(capRegion, tile.drawx(), tile.drawy(), tile.rotation() * 90); + } + + @Override + public boolean acceptLiquid(Tile tile, Tile source, Liquid liquid, float amount){ + return super.acceptLiquid(tile, source, liquid, amount) && (source.block() instanceof Conduit) || Edges.getFacingEdge(source, tile).relativeTo(tile) == tile.rotation(); + } + + @Override + public boolean blends(Tile tile, int rotation, int otherx, int othery, int otherrot, Block otherblock){ + return otherblock.outputsLiquid && blendsArmored(tile, rotation, otherx, othery, otherrot, otherblock); + } +} diff --git a/core/src/io/anuke/mindustry/world/blocks/distribution/Conduit.java b/core/src/io/anuke/mindustry/world/blocks/liquid/Conduit.java similarity index 78% rename from core/src/io/anuke/mindustry/world/blocks/distribution/Conduit.java rename to core/src/io/anuke/mindustry/world/blocks/liquid/Conduit.java index 4abf4c9cdc..80c2ab5baf 100644 --- a/core/src/io/anuke/mindustry/world/blocks/distribution/Conduit.java +++ b/core/src/io/anuke/mindustry/world/blocks/liquid/Conduit.java @@ -1,9 +1,13 @@ -package io.anuke.mindustry.world.blocks.distribution; +package io.anuke.mindustry.world.blocks.liquid; import io.anuke.arc.*; -import io.anuke.arc.function.*; +import io.anuke.arc.collection.*; +import io.anuke.arc.func.*; import io.anuke.arc.graphics.g2d.*; import io.anuke.arc.math.*; +import io.anuke.arc.math.geom.*; +import io.anuke.arc.util.*; +import io.anuke.mindustry.content.*; import io.anuke.mindustry.entities.traits.BuilderTrait.*; import io.anuke.mindustry.entities.type.*; import io.anuke.mindustry.type.*; @@ -17,11 +21,15 @@ public class Conduit extends LiquidBlock implements Autotiler{ protected TextureRegion[] topRegions = new TextureRegion[7]; protected TextureRegion[] botRegions = new TextureRegion[7]; + protected float leakResistance = 1.5f; + public Conduit(String name){ super(name); rotate = true; solid = false; floating = true; + conveyorPlacement = true; + entityType = ConduitEntity::new; } @Override @@ -61,6 +69,16 @@ public class Conduit extends LiquidBlock implements Autotiler{ Draw.rect(topRegions[bits[0]], req.drawx(), req.drawy(), topRegions[bits[0]].getWidth() * Draw.scl * req.animScale, topRegions[bits[0]].getHeight() * Draw.scl * req.animScale, req.rotation * 90); } + @Override + public Block getReplacement(BuildRequest req, Array requests){ + Boolf cont = p -> requests.contains(o -> o.x == req.x + p.x && o.y == req.y + p.y && o.rotation == req.rotation && (req.block instanceof Conduit || req.block instanceof LiquidJunction)); + return cont.get(Geometry.d4(req.rotation)) && + cont.get(Geometry.d4(req.rotation - 2)) && + req.tile() != null && + req.tile().block() instanceof Conduit && + Mathf.mod(req.tile().rotation() - req.rotation, 2) == 1 ? Blocks.liquidJunction : this; + } + @Override public void transformCase(int num, int[] bits){ bits[0] = num == 0 ? 3 : num == 1 ? 6 : num == 2 ? 2 : num == 3 ? 4 : num == 4 ? 5 : num == 5 ? 1 : 0; @@ -94,7 +112,7 @@ public class Conduit extends LiquidBlock implements Autotiler{ 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)){ - tryMoveLiquid(tile, tile.getNearby(tile.rotation()), true, tile.entity.liquids.current()); + tryMoveLiquid(tile, tile.getNearby(tile.rotation()), leakResistance, tile.entity.liquids.current()); entity.noSleep(); }else{ entity.sleep(); @@ -109,12 +127,8 @@ public class Conduit extends LiquidBlock implements Autotiler{ @Override public boolean acceptLiquid(Tile tile, Tile source, Liquid liquid, float amount){ tile.entity.noSleep(); - return tile.entity.liquids.get(liquid) + amount < liquidCapacity && (tile.entity.liquids.current() == liquid || tile.entity.liquids.get(tile.entity.liquids.current()) < 0.2f) && ((2 + source.relativeTo(tile.x, tile.y)) % 4 != tile.rotation()); - } - - @Override - public TileEntity newEntity(){ - return new ConduitEntity(); + return tile.entity.liquids.get(liquid) + amount < liquidCapacity && (tile.entity.liquids.current() == liquid || tile.entity.liquids.get(tile.entity.liquids.current()) < 0.2f) + && ((source.absoluteRelativeTo(tile.x, tile.y) + 2) % 4 != tile.rotation()); } public static class ConduitEntity extends TileEntity{ diff --git a/core/src/io/anuke/mindustry/world/blocks/distribution/LiquidBridge.java b/core/src/io/anuke/mindustry/world/blocks/liquid/LiquidBridge.java similarity index 89% rename from core/src/io/anuke/mindustry/world/blocks/distribution/LiquidBridge.java rename to core/src/io/anuke/mindustry/world/blocks/liquid/LiquidBridge.java index d282321114..5373acdc6f 100644 --- a/core/src/io/anuke/mindustry/world/blocks/distribution/LiquidBridge.java +++ b/core/src/io/anuke/mindustry/world/blocks/liquid/LiquidBridge.java @@ -1,9 +1,10 @@ -package io.anuke.mindustry.world.blocks.distribution; +package io.anuke.mindustry.world.blocks.liquid; import io.anuke.arc.math.*; import io.anuke.arc.util.*; import io.anuke.mindustry.type.*; import io.anuke.mindustry.world.*; +import io.anuke.mindustry.world.blocks.distribution.*; import io.anuke.mindustry.world.meta.*; import static io.anuke.mindustry.Vars.world; @@ -32,7 +33,7 @@ public class LiquidBridge extends ItemBridge{ if(entity.cons.valid()){ float alpha = 0.04f; if(hasPower){ - alpha *= entity.power.satisfaction; // Exceed boot time unless power is at max. + alpha *= entity.efficiency(); // Exceed boot time unless power is at max. } entity.uptime = Mathf.lerpDelta(entity.uptime, 1f, alpha); }else{ diff --git a/core/src/io/anuke/mindustry/world/blocks/distribution/LiquidExtendingBridge.java b/core/src/io/anuke/mindustry/world/blocks/liquid/LiquidExtendingBridge.java similarity index 93% rename from core/src/io/anuke/mindustry/world/blocks/distribution/LiquidExtendingBridge.java rename to core/src/io/anuke/mindustry/world/blocks/liquid/LiquidExtendingBridge.java index 53abc6d128..be0edc1bff 100644 --- a/core/src/io/anuke/mindustry/world/blocks/distribution/LiquidExtendingBridge.java +++ b/core/src/io/anuke/mindustry/world/blocks/liquid/LiquidExtendingBridge.java @@ -1,9 +1,10 @@ -package io.anuke.mindustry.world.blocks.distribution; +package io.anuke.mindustry.world.blocks.liquid; import io.anuke.arc.math.*; import io.anuke.arc.util.*; import io.anuke.mindustry.type.*; import io.anuke.mindustry.world.*; +import io.anuke.mindustry.world.blocks.distribution.*; import io.anuke.mindustry.world.meta.*; import static io.anuke.mindustry.Vars.world; diff --git a/core/src/io/anuke/mindustry/world/blocks/liquid/LiquidJunction.java b/core/src/io/anuke/mindustry/world/blocks/liquid/LiquidJunction.java new file mode 100644 index 0000000000..34cf6c4916 --- /dev/null +++ b/core/src/io/anuke/mindustry/world/blocks/liquid/LiquidJunction.java @@ -0,0 +1,48 @@ +package io.anuke.mindustry.world.blocks.liquid; + +import io.anuke.arc.*; +import io.anuke.arc.graphics.g2d.*; +import io.anuke.mindustry.type.*; +import io.anuke.mindustry.world.*; +import io.anuke.mindustry.world.blocks.*; +import io.anuke.mindustry.world.meta.*; + +public class LiquidJunction extends LiquidBlock{ + + public LiquidJunction(String name){ + super(name); + } + + @Override + public void setStats(){ + super.setStats(); + stats.remove(BlockStat.liquidCapacity); + } + + @Override + public void setBars(){ + super.setBars(); + bars.remove("liquid"); + } + + @Override + public void draw(Tile tile){ + Draw.rect(name, tile.worldx(), tile.worldy()); + } + + @Override + public TextureRegion[] generateIcons(){ + return new TextureRegion[]{Core.atlas.find(name)}; + } + + @Override + public Tile getLiquidDestination(Tile tile, Tile source, Liquid liquid){ + int dir = source.relativeTo(tile.x, tile.y); + dir = (dir + 4) % 4; + Tile next = tile.getNearby(dir).link(); + if(!next.block().acceptLiquid(next, tile, liquid, 0f) && !(next.block() instanceof LiquidJunction)){ + return tile; + } + return next.block().getLiquidDestination(next, tile, liquid); + } +} diff --git a/core/src/io/anuke/mindustry/world/blocks/liquid/LiquidOverflowGate.java b/core/src/io/anuke/mindustry/world/blocks/liquid/LiquidOverflowGate.java new file mode 100644 index 0000000000..dafcef1508 --- /dev/null +++ b/core/src/io/anuke/mindustry/world/blocks/liquid/LiquidOverflowGate.java @@ -0,0 +1,53 @@ +package io.anuke.mindustry.world.blocks.liquid; + +import io.anuke.arc.*; +import io.anuke.arc.graphics.g2d.*; +import io.anuke.mindustry.type.*; +import io.anuke.mindustry.world.*; +import io.anuke.mindustry.world.blocks.*; +import io.anuke.mindustry.world.meta.*; + +//TODO implement later +public class LiquidOverflowGate extends LiquidBlock{ + int topRegion; + + public LiquidOverflowGate(String name){ + super(name); + rotate = true; + topRegion = reg("-top"); + } + + @Override + public void setStats(){ + super.setStats(); + stats.remove(BlockStat.liquidCapacity); + } + + @Override + public void setBars(){ + super.setBars(); + bars.remove("liquid"); + } + + @Override + public void draw(Tile tile){ + Draw.rect(name, tile.drawx(), tile.drawy()); + Draw.rect(reg(topRegion), tile.drawx(), tile.drawy(), tile.rotation() * 90); + } + + @Override + public TextureRegion[] generateIcons(){ + return new TextureRegion[]{Core.atlas.find(name), Core.atlas.find(name + "-top")}; + } + + @Override + public Tile getLiquidDestination(Tile tile, Tile source, Liquid liquid){ + int dir = source.relativeTo(tile.x, tile.y); + dir = (dir + 4) % 4; + Tile next = tile.getNearby(dir).link(); + if(!next.block().acceptLiquid(next, tile, liquid, 0.0001f) && !(next.block() instanceof LiquidOverflowGate || next.block() instanceof LiquidJunction)){ + return tile; + } + return next.block().getLiquidDestination(next, tile, liquid); + } +} diff --git a/core/src/io/anuke/mindustry/world/blocks/distribution/LiquidRouter.java b/core/src/io/anuke/mindustry/world/blocks/liquid/LiquidRouter.java similarity index 92% rename from core/src/io/anuke/mindustry/world/blocks/distribution/LiquidRouter.java rename to core/src/io/anuke/mindustry/world/blocks/liquid/LiquidRouter.java index 52dbe920fd..e5c4103a3c 100644 --- a/core/src/io/anuke/mindustry/world/blocks/distribution/LiquidRouter.java +++ b/core/src/io/anuke/mindustry/world/blocks/liquid/LiquidRouter.java @@ -1,4 +1,4 @@ -package io.anuke.mindustry.world.blocks.distribution; +package io.anuke.mindustry.world.blocks.liquid; import io.anuke.mindustry.type.Liquid; import io.anuke.mindustry.world.Tile; diff --git a/core/src/io/anuke/mindustry/world/blocks/distribution/LiquidTank.java b/core/src/io/anuke/mindustry/world/blocks/liquid/LiquidTank.java similarity index 67% rename from core/src/io/anuke/mindustry/world/blocks/distribution/LiquidTank.java rename to core/src/io/anuke/mindustry/world/blocks/liquid/LiquidTank.java index c73ab0d2d0..c8303771a6 100644 --- a/core/src/io/anuke/mindustry/world/blocks/distribution/LiquidTank.java +++ b/core/src/io/anuke/mindustry/world/blocks/liquid/LiquidTank.java @@ -1,4 +1,4 @@ -package io.anuke.mindustry.world.blocks.distribution; +package io.anuke.mindustry.world.blocks.liquid; public class LiquidTank extends LiquidRouter{ 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 0c21c5db15..9b773c6356 100644 --- a/core/src/io/anuke/mindustry/world/blocks/logic/MessageBlock.java +++ b/core/src/io/anuke/mindustry/world/blocks/logic/MessageBlock.java @@ -7,14 +7,12 @@ import io.anuke.arc.graphics.*; import io.anuke.arc.graphics.g2d.*; import io.anuke.arc.math.geom.*; import io.anuke.arc.scene.ui.*; -import io.anuke.arc.scene.ui.TextField.*; import io.anuke.arc.scene.ui.layout.*; import io.anuke.arc.util.*; import io.anuke.arc.util.pooling.*; import io.anuke.mindustry.entities.*; import io.anuke.mindustry.entities.type.*; import io.anuke.mindustry.gen.*; -import io.anuke.mindustry.net.Net; import io.anuke.mindustry.net.*; import io.anuke.mindustry.ui.*; import io.anuke.mindustry.ui.dialogs.*; @@ -33,6 +31,7 @@ public class MessageBlock extends Block{ configurable = true; solid = true; destructible = true; + entityType = MessageBlockEntity::new; } @Remote(targets = Loc.both, called = Loc.both, forward = true) @@ -99,7 +98,7 @@ public class MessageBlock extends Block{ public void buildTable(Tile tile, Table table){ MessageBlockEntity entity = tile.entity(); - table.addImageButton(io.anuke.mindustry.gen.Icon.pencilSmall, () -> { + table.addImageButton(Icon.pencilSmall, () -> { if(mobile){ Core.input.getTextInput(new TextInput(){{ text = entity.message; @@ -147,11 +146,6 @@ public class MessageBlock extends Block{ table.setPosition(pos.x, pos.y, Align.bottom); } - @Override - public TileEntity newEntity(){ - return new MessageBlockEntity(); - } - public class MessageBlockEntity extends TileEntity{ protected String message = ""; protected String[] lines = {""}; diff --git a/core/src/io/anuke/mindustry/world/blocks/power/ConditionalConsumePower.java b/core/src/io/anuke/mindustry/world/blocks/power/ConditionalConsumePower.java index e94cfab6ba..1f9dadd3e9 100644 --- a/core/src/io/anuke/mindustry/world/blocks/power/ConditionalConsumePower.java +++ b/core/src/io/anuke/mindustry/world/blocks/power/ConditionalConsumePower.java @@ -1,20 +1,20 @@ package io.anuke.mindustry.world.blocks.power; -import io.anuke.arc.function.Predicate; +import io.anuke.arc.func.Boolf; import io.anuke.mindustry.entities.type.TileEntity; import io.anuke.mindustry.world.consumers.ConsumePower; /** A power consumer that only activates sometimes. */ public class ConditionalConsumePower extends ConsumePower{ - private final Predicate consume; + private final Boolf consume; - public ConditionalConsumePower(float usage, Predicate consume){ + public ConditionalConsumePower(float usage, Boolf consume){ super(usage, 0, false); this.consume = consume; } @Override public float requestedPower(TileEntity entity){ - return consume.test(entity) ? usage : 0f; + return consume.get(entity) ? usage : 0f; } } 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 82fd6dc1b3..e1945f1609 100644 --- a/core/src/io/anuke/mindustry/world/blocks/power/ImpactReactor.java +++ b/core/src/io/anuke/mindustry/world/blocks/power/ImpactReactor.java @@ -7,7 +7,6 @@ import io.anuke.arc.math.*; import io.anuke.arc.util.*; import io.anuke.mindustry.content.*; import io.anuke.mindustry.entities.*; -import io.anuke.mindustry.entities.type.*; import io.anuke.mindustry.game.EventType.*; import io.anuke.mindustry.gen.*; import io.anuke.mindustry.graphics.*; @@ -17,7 +16,7 @@ import io.anuke.mindustry.world.meta.*; import java.io.*; -import static io.anuke.mindustry.Vars.tilesize; +import static io.anuke.mindustry.Vars.*; public class ImpactReactor extends PowerGenerator{ protected int timerUse = timers++; @@ -39,6 +38,7 @@ public class ImpactReactor extends PowerGenerator{ liquidCapacity = 30f; hasItems = true; outputsPower = consumesPower = true; + entityType = FusionReactorEntity::new; bottomRegion = reg("-bottom"); plasmaRegions = new int[plasmas]; @@ -71,11 +71,11 @@ public class ImpactReactor extends PowerGenerator{ public void update(Tile tile){ FusionReactorEntity entity = tile.entity(); - if(entity.cons.valid() && entity.power.satisfaction >= 0.99f){ + if(entity.cons.valid() && entity.power.status >= 0.99f){ boolean prevOut = getPowerProduction(tile) <= consumes.getPower().requestedPower(entity); entity.warmup = Mathf.lerpDelta(entity.warmup, 1f, warmupSpeed); - if(Mathf.isEqual(entity.warmup, 1f, 0.001f)){ + if(Mathf.equal(entity.warmup, 1f, 0.001f)){ entity.warmup = 1f; } @@ -117,13 +117,14 @@ public class ImpactReactor extends PowerGenerator{ } @Override - public TextureRegion[] generateIcons(){ - return new TextureRegion[]{Core.atlas.find(name + "-bottom"), Core.atlas.find(name)}; + public void drawLight(Tile tile){ + float fract = tile.entity().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); } @Override - public TileEntity newEntity(){ - return new FusionReactorEntity(); + public TextureRegion[] generateIcons(){ + return new TextureRegion[]{Core.atlas.find(name + "-bottom"), Core.atlas.find(name)}; } @Override @@ -132,7 +133,7 @@ public class ImpactReactor extends PowerGenerator{ FusionReactorEntity entity = tile.entity(); - 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 5af8ba1e9c..07effa5b30 100644 --- a/core/src/io/anuke/mindustry/world/blocks/power/ItemLiquidGenerator.java +++ b/core/src/io/anuke/mindustry/world/blocks/power/ItemLiquidGenerator.java @@ -8,7 +8,6 @@ import io.anuke.arc.util.*; import io.anuke.mindustry.content.*; import io.anuke.mindustry.entities.*; import io.anuke.mindustry.entities.Effects.*; -import io.anuke.mindustry.entities.type.*; import io.anuke.mindustry.type.*; import io.anuke.mindustry.world.*; import io.anuke.mindustry.world.consumers.*; @@ -37,15 +36,15 @@ public class ItemLiquidGenerator extends PowerGenerator{ protected boolean defaults = false; public ItemLiquidGenerator(boolean hasItems, boolean hasLiquids, String name){ - super(name); + this(name); this.hasItems = hasItems; this.hasLiquids = hasLiquids; - setDefaults(); } public ItemLiquidGenerator(String name){ super(name); + this.entityType = ItemLiquidGeneratorEntity::new; } protected void setDefaults(){ @@ -87,7 +86,7 @@ public class ItemLiquidGenerator extends PowerGenerator{ } @Override - public boolean shouldConsume(Tile tile){ + public boolean productionValid(Tile tile){ ItemLiquidGeneratorEntity entity = tile.entity(); return entity.generateTime > 0; } @@ -140,7 +139,7 @@ public class ItemLiquidGenerator extends PowerGenerator{ if(entity.generateTime > 0f){ entity.generateTime -= Math.min(1f / itemDuration * entity.delta(), entity.generateTime); - if(randomlyExplode && Mathf.chance(entity.delta() * 0.06 * Mathf.clamp(entity.explosiveness - 0.5f))){ + if(randomlyExplode && state.rules.reactorExplosions && Mathf.chance(entity.delta() * 0.06 * Mathf.clamp(entity.explosiveness - 0.5f))){ //this block is run last so that in the event of a block destruction, no code relies on the block type Core.app.post(() -> { entity.damage(Mathf.random(11f)); @@ -174,6 +173,13 @@ public class ItemLiquidGenerator extends PowerGenerator{ } } + @Override + public void drawLight(Tile tile){ + ItemLiquidGeneratorEntity entity = tile.entity(); + + renderer.lights.add(tile.drawx(), tile.drawy(), (60f + Mathf.absin(10f, 5f)) * entity.productionEfficiency * size, Color.orange, 0.5f); + } + protected float getItemEfficiency(Item item){ return 0.0f; } @@ -182,11 +188,6 @@ public class ItemLiquidGenerator extends PowerGenerator{ return 0.0f; } - @Override - public TileEntity newEntity(){ - return new ItemLiquidGeneratorEntity(); - } - public static class ItemLiquidGeneratorEntity extends GeneratorEntity{ public float explosiveness; public float heat; diff --git a/core/src/io/anuke/mindustry/world/blocks/power/LightBlock.java b/core/src/io/anuke/mindustry/world/blocks/power/LightBlock.java new file mode 100644 index 0000000000..0fc61676f2 --- /dev/null +++ b/core/src/io/anuke/mindustry/world/blocks/power/LightBlock.java @@ -0,0 +1,95 @@ +package io.anuke.mindustry.world.blocks.power; + +import io.anuke.arc.graphics.*; +import io.anuke.arc.graphics.g2d.*; +import io.anuke.arc.scene.ui.layout.*; +import io.anuke.arc.util.*; +import io.anuke.mindustry.entities.type.*; +import io.anuke.mindustry.gen.*; +import io.anuke.mindustry.graphics.*; +import io.anuke.mindustry.world.*; + +import java.io.*; + +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 LightBlock(String name){ + super(name); + hasPower = true; + update = true; + topRegion = reg("-top"); + configurable = true; + entityType = LightEntity::new; + } + + @Override + public void playerPlaced(Tile tile){ + if(lastColor != 0){ + tile.configure(lastColor); + } + } + + @Override + public void draw(Tile tile){ + super.draw(tile); + LightEntity entity = tile.entity(); + + Draw.blend(Blending.additive); + Draw.color(Tmp.c1.set(entity.color), entity.efficiency() * 0.3f); + Draw.rect(reg(topRegion), tile.drawx(), tile.drawy()); + Draw.color(); + Draw.blend(); + } + + @Override + public void buildTable(Tile tile, Table table){ + LightEntity entity = tile.entity(); + + table.addImageButton(Icon.pencilSmall, () -> { + ui.picker.show(Tmp.c1.set(entity.color).a(0.5f), false, res -> { + entity.color = res.rgba(); + lastColor = entity.color; + }); + control.input.frag.config.hideConfig(); + }).size(40f); + } + + @Override + public void configured(Tile tile, Player player, int value){ + tile.entity().color = value; + } + + @Override + public void drawLight(Tile tile){ + LightEntity entity = tile.entity(); + 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); + stream.writeInt(color); + } + + @Override + public void read(DataInput stream, byte revision) throws IOException{ + super.read(stream, revision); + color = stream.readInt(); + } + } +} 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 9a1d12ac39..2aa478a3bf 100644 --- a/core/src/io/anuke/mindustry/world/blocks/power/NuclearReactor.java +++ b/core/src/io/anuke/mindustry/world/blocks/power/NuclearReactor.java @@ -1,35 +1,32 @@ package io.anuke.mindustry.world.blocks.power; import io.anuke.arc.*; -import io.anuke.arc.graphics.Color; +import io.anuke.arc.graphics.*; import io.anuke.arc.graphics.g2d.*; -import io.anuke.arc.math.Mathf; -import io.anuke.arc.math.geom.Vector2; -import io.anuke.arc.util.Time; -import io.anuke.mindustry.content.Fx; -import io.anuke.mindustry.entities.Damage; -import io.anuke.mindustry.entities.Effects; -import io.anuke.mindustry.entities.type.TileEntity; +import io.anuke.arc.math.*; +import io.anuke.arc.math.geom.*; +import io.anuke.arc.util.*; +import io.anuke.mindustry.content.*; +import io.anuke.mindustry.entities.*; import io.anuke.mindustry.game.EventType.*; import io.anuke.mindustry.gen.*; -import io.anuke.mindustry.graphics.Pal; -import io.anuke.mindustry.type.Item; -import io.anuke.mindustry.type.Liquid; -import io.anuke.mindustry.ui.Bar; -import io.anuke.mindustry.world.Tile; +import io.anuke.mindustry.graphics.*; +import io.anuke.mindustry.type.*; +import io.anuke.mindustry.ui.*; +import io.anuke.mindustry.world.*; import io.anuke.mindustry.world.consumers.*; -import io.anuke.mindustry.world.meta.BlockStat; -import io.anuke.mindustry.world.meta.StatUnit; +import io.anuke.mindustry.world.meta.*; import java.io.*; -import static io.anuke.mindustry.Vars.tilesize; +import static io.anuke.mindustry.Vars.*; public class NuclearReactor extends PowerGenerator{ protected final int timerFuel = timers++; protected 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 @@ -48,6 +45,7 @@ public class NuclearReactor extends PowerGenerator{ liquidCapacity = 30; hasItems = true; hasLiquids = true; + entityType = NuclearReactorEntity::new; } @Override @@ -93,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); } @@ -127,7 +124,7 @@ public class NuclearReactor extends PowerGenerator{ int fuel = entity.items.get(consumes.get(ConsumeType.item).items[0].item); - if(fuel < 5 && entity.heat < 0.5f) return; + if((fuel < 5 && entity.heat < 0.5f) || !state.rules.reactorExplosions) return; Effects.shake(6f, 16f, tile.worldx(), tile.worldy()); Effects.effect(Fx.nuclearShockwave, tile.worldx(), tile.worldy()); @@ -152,6 +149,13 @@ public class NuclearReactor extends PowerGenerator{ } } + @Override + public void drawLight(Tile tile){ + NuclearReactorEntity entity = tile.entity(); + 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); + } + @Override public void draw(Tile tile){ super.draw(tile); @@ -176,11 +180,6 @@ public class NuclearReactor extends PowerGenerator{ Draw.reset(); } - @Override - public TileEntity newEntity(){ - return new NuclearReactorEntity(); - } - public static class NuclearReactorEntity extends GeneratorEntity{ public float heat; public float flash; diff --git a/core/src/io/anuke/mindustry/world/blocks/power/PowerDiode.java b/core/src/io/anuke/mindustry/world/blocks/power/PowerDiode.java new file mode 100644 index 0000000000..08d621a09c --- /dev/null +++ b/core/src/io/anuke/mindustry/world/blocks/power/PowerDiode.java @@ -0,0 +1,89 @@ +package io.anuke.mindustry.world.blocks.power; + +import io.anuke.arc.Core; +import io.anuke.arc.math.Mathf; +import io.anuke.mindustry.ui.Bar; +import io.anuke.arc.util.Eachable; +import io.anuke.mindustry.ui.Cicon; +import io.anuke.mindustry.world.Tile; +import io.anuke.mindustry.world.Block; +import io.anuke.arc.graphics.g2d.Draw; +import io.anuke.mindustry.graphics.Pal; +import io.anuke.arc.graphics.g2d.TextureRegion; +import io.anuke.mindustry.entities.traits.BuilderTrait; + +public class PowerDiode extends Block{ + protected TextureRegion arrow; + + public PowerDiode(String name){ + super(name); + rotate = true; + update = true; + solid = true; + insulated = true; + } + + @Override + public void update(Tile tile){ + super.update(tile); + + if(tile.front() == null || tile.back() == null || !tile.back().block().hasPower || !tile.front().block().hasPower) return; + + PowerGraph backGraph = tile.back().entity.power.graph; + PowerGraph frontGraph = tile.front().entity.power.graph; + if(backGraph == frontGraph) return; + + // 0f - 1f of battery capacity in use + float backStored = backGraph.getBatteryStored() / backGraph.getTotalBatteryCapacity(); + float frontStored = frontGraph.getBatteryStored() / frontGraph.getTotalBatteryCapacity(); + + // try to send if the back side has more % capacity stored than the front side + if(backStored > frontStored) { + // send half of the difference + float amount = backGraph.getBatteryStored() * (backStored - frontStored) / 2; + // prevent sending more than the front can handle + amount = Mathf.clamp(amount, 0, frontGraph.getTotalBatteryCapacity() * (1 - frontStored)); + + backGraph.useBatteries(amount); + frontGraph.chargeBatteries(amount); + } + } + + // battery % of the graph on either side, defaults to zero + protected 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.powerBar, () -> bar(entity.tile.back()))); + bars.add("front", entity -> new Bar("bar.output", Pal.powerBar, () -> bar(entity.tile.front()))); + } + + @Override + public void load(){ + super.load(); + arrow = Core.atlas.find(name + "-arrow"); + } + + @Override + public void draw(Tile tile){ + Draw.rect(region, tile.drawx(), tile.drawy(), 0); + Draw.rect(arrow, tile.drawx(), tile.drawy(), rotate ? tile.rotation() * 90 : 0); + } + + @Override + public void drawRequestRegion(BuilderTrait.BuildRequest req, Eachable list) { + TextureRegion reg = icon(Cicon.full); + Draw.rect(icon(Cicon.full), req.drawx(), req.drawy(), + reg.getWidth() * req.animScale * Draw.scl, + reg.getHeight() * req.animScale * Draw.scl, + 0); + Draw.rect(arrow, req.drawx(), req.drawy(), + arrow.getWidth() * req.animScale * Draw.scl, + arrow.getHeight() * req.animScale * Draw.scl, + !rotate ? 0 : req.rotation * 90); + } +} 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 f4e1597445..9f0f21f008 100644 --- a/core/src/io/anuke/mindustry/world/blocks/power/PowerGenerator.java +++ b/core/src/io/anuke/mindustry/world/blocks/power/PowerGenerator.java @@ -20,6 +20,7 @@ public class PowerGenerator extends PowerDistributor{ super(name); baseExplosiveness = 5f; flags = EnumSet.of(BlockFlag.producer); + entityType = GeneratorEntity::new; } @Override @@ -51,11 +52,6 @@ public class PowerGenerator extends PowerDistributor{ return false; } - @Override - public TileEntity newEntity(){ - return new GeneratorEntity(); - } - public static class GeneratorEntity extends TileEntity{ public float generateTime; /** The efficiency of the producer. An efficiency of 1.0 means 100% */ 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 e4cbf26c65..b5d29266ac 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{ @@ -47,9 +46,9 @@ public class PowerGraph{ } public float getSatisfaction(){ - if(Mathf.isZero(lastPowerProduced)){ + if(Mathf.zero(lastPowerProduced)){ return 0f; - }else if(Mathf.isZero(lastPowerNeeded)){ + }else if(Mathf.zero(lastPowerNeeded)){ return 1f; } return Mathf.clamp(lastPowerProduced / lastPowerNeeded); @@ -83,7 +82,7 @@ public class PowerGraph{ for(Tile battery : batteries){ Consumers consumes = battery.block().consumes; if(consumes.hasPower()){ - totalAccumulator += battery.entity.power.satisfaction * consumes.getPower().capacity; + totalAccumulator += battery.entity.power.status * consumes.getPower().capacity; } } return totalAccumulator; @@ -94,7 +93,7 @@ public class PowerGraph{ for(Tile battery : batteries){ if(battery.block().consumes.hasPower()){ ConsumePower power = battery.block().consumes.getPower(); - totalCapacity += (1f - battery.entity.power.satisfaction) * power.capacity; + totalCapacity += (1f - battery.entity.power.status) * power.capacity; } } return totalCapacity; @@ -112,14 +111,14 @@ public class PowerGraph{ public float useBatteries(float needed){ float stored = getBatteryStored(); - if(Mathf.isEqual(stored, 0f)) return 0f; + if(Mathf.equal(stored, 0f)) return 0f; float used = Math.min(stored, needed); float consumedPowerPercentage = Math.min(1.0f, needed / stored); for(Tile battery : batteries){ Consumers consumes = battery.block().consumes; if(consumes.hasPower()){ - battery.entity.power.satisfaction *= (1f-consumedPowerPercentage); + battery.entity.power.status *= (1f-consumedPowerPercentage); } } return used; @@ -129,14 +128,14 @@ public class PowerGraph{ float capacity = getBatteryCapacity(); //how much of the missing in each battery % is charged float chargedPercent = Math.min(excess/capacity, 1f); - if(Mathf.isEqual(capacity, 0f)) return 0f; + if(Mathf.equal(capacity, 0f)) return 0f; for(Tile battery : batteries){ Consumers consumes = battery.block().consumes; if(consumes.hasPower()){ ConsumePower consumePower = consumes.getPower(); if(consumePower.capacity > 0f){ - battery.entity.power.satisfaction += (1f-battery.entity.power.satisfaction) * chargedPercent; + battery.entity.power.status += (1f-battery.entity.power.status) * chargedPercent; } } } @@ -145,26 +144,26 @@ public class PowerGraph{ public void distributePower(float needed, float produced){ //distribute even if not needed. this is because some might be requiring power but not using it; it updates consumers - float coverage = Mathf.isZero(needed) && Mathf.isZero(produced) ? 0f : Mathf.isZero(needed) ? 1f : Math.min(1, produced / needed); + float coverage = Mathf.zero(needed) && Mathf.zero(produced) ? 0f : Mathf.zero(needed) ? 1f : Math.min(1, produced / needed); for(Tile consumer : consumers){ Consumers consumes = consumer.block().consumes; if(consumes.hasPower()){ ConsumePower consumePower = consumes.getPower(); if(consumePower.buffered){ - if(!Mathf.isZero(consumePower.capacity)){ + if(!Mathf.zero(consumePower.capacity)){ // Add an equal percentage of power to all buffers, based on the global power coverage in this graph float maximumRate = consumePower.requestedPower(consumer.entity) * coverage * consumer.entity.delta(); - consumer.entity.power.satisfaction = Mathf.clamp(consumer.entity.power.satisfaction + maximumRate / consumePower.capacity); + consumer.entity.power.status = Mathf.clamp(consumer.entity.power.status + maximumRate / consumePower.capacity); } }else{ //valid consumers get power as usual if(otherConsumersAreValid(consumer, consumePower)){ - consumer.entity.power.satisfaction = coverage; + consumer.entity.power.status = coverage; }else{ //invalid consumers get an estimate, if they were to activate - consumer.entity.power.satisfaction = Math.min(1, produced / (needed + consumePower.usage * consumer.entity.delta())); + consumer.entity.power.status = Math.min(1, produced / (needed + consumePower.usage * consumer.entity.delta())); //just in case - if(Float.isNaN(consumer.entity.power.satisfaction)){ - consumer.entity.power.satisfaction = 0f; + if(Float.isNaN(consumer.entity.power.status)){ + consumer.entity.power.status = 0f; } } } @@ -176,11 +175,12 @@ public class PowerGraph{ if(Core.graphics.getFrameId() == lastFrameUpdated){ return; }else if(!consumers.isEmpty() && consumers.first().isEnemyCheat()){ - //when cheating, just set satisfaction to 1 + //when cheating, just set status to 1 for(Tile tile : consumers){ - tile.entity.power.satisfaction = 1f; + 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.isEqual(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){ 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 556648a6b6..8c3002c417 100644 --- a/core/src/io/anuke/mindustry/world/blocks/power/PowerNode.java +++ b/core/src/io/anuke/mindustry/world/blocks/power/PowerNode.java @@ -2,12 +2,13 @@ package io.anuke.mindustry.world.blocks.power; import io.anuke.arc.*; import io.anuke.arc.collection.*; -import io.anuke.arc.function.*; +import io.anuke.arc.func.*; import io.anuke.arc.graphics.*; import io.anuke.arc.graphics.g2d.*; import io.anuke.arc.math.*; import io.anuke.arc.math.geom.*; import io.anuke.arc.util.*; +import io.anuke.arc.util.ArcAnnotate.*; import io.anuke.mindustry.entities.type.*; import io.anuke.mindustry.graphics.*; import io.anuke.mindustry.ui.*; @@ -18,6 +19,8 @@ import io.anuke.mindustry.world.meta.*; 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; @@ -88,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", @@ -101,20 +104,24 @@ public class PowerNode extends PowerBlock{ public void placed(Tile tile){ if(net.client()) return; - Predicate valid = other -> other != null && other != tile && ((!other.block().outputsPower && other.block().consumesPower) || (other.block().outputsPower && !other.block().consumesPower) || other.block() instanceof PowerNode) && linkValid(tile, other) + Boolf valid = other -> other != null && other != tile && ((!other.block().outputsPower && other.block().consumesPower) || (other.block().outputsPower && !other.block().consumesPower) || other.block() instanceof PowerNode) && linkValid(tile, other) && !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) -> { Tile other = world.ltile(x, y); - if(valid.test(other)){ + if(valid.get(other)){ if(!insulated(tile, other)){ tempTiles.add(other); } } }); - tempTiles.sort(Structs.comparingFloat(t -> t.dst2(tile))); + tempTiles.sort((a, b) -> { + int type = -Boolean.compare(a.block() instanceof PowerNode, b.block() instanceof PowerNode); + if(type != 0) return type; + return Float.compare(a.dst2(tile), b.dst2(tile)); + }); tempTiles.each(valid, other -> { if(!tile.entity.power.links.contains(other.pos())){ tile.configureAny(other.pos()); @@ -124,8 +131,8 @@ public class PowerNode extends PowerBlock{ super.placed(tile); } - private void getPotentialLinks(Tile tile, Consumer others){ - Predicate valid = other -> other != null && other != tile && other.entity != null && other.entity.power != null && + private void getPotentialLinks(Tile tile, Cons others){ + Boolf valid = other -> other != null && other != tile && other.entity != null && other.entity.power != null && ((!other.block().outputsPower && other.block().consumesPower) || (other.block().outputsPower && !other.block().consumesPower) || other.block() instanceof PowerNode) && overlaps(tile.x * tilesize + offset(), tile.y * tilesize + offset(), other, laserRange * tilesize) && other.getTeam() == player.getTeam() && !other.entity.proximity().contains(tile) && !graphs.contains(other.entity.power.graph); @@ -134,15 +141,19 @@ public class PowerNode extends PowerBlock{ graphs.clear(); Geometry.circle(tile.x, tile.y, (int)(laserRange + 1), (x, y) -> { Tile other = world.ltile(x, y); - if(valid.test(other) && !tempTiles.contains(other)){ + if(valid.get(other) && !tempTiles.contains(other)){ tempTiles.add(other); } }); - tempTiles.sort(Structs.comparingFloat(t -> t.dst2(tile))); + tempTiles.sort((a, b) -> { + int type = -Boolean.compare(a.block() instanceof PowerNode, b.block() instanceof PowerNode); + if(type != 0) return type; + return Float.compare(a.dst2(tile), b.dst2(tile)); + }); tempTiles.each(valid, t -> { graphs.add(t.entity.power.graph); - others.accept(t); + others.get(t); }); } @@ -151,6 +162,7 @@ public class PowerNode extends PowerBlock{ super.setStats(); stats.add(BlockStat.powerRange, laserRange, StatUnit.blocks); + stats.add(BlockStat.powerConnections, maxNodes, StatUnit.none); } @Override @@ -293,6 +305,11 @@ public class PowerNode extends PowerBlock{ return overlaps(src.drawx(), src.drawy(), other, range); } + public boolean overlaps(@Nullable Tile src, @Nullable Tile other){ + if(src == null || other == null) return true; + return Intersector.overlaps(Tmp.cr1.set(src.worldx() + offset(), src.worldy() + offset(), laserRange * tilesize), Tmp.r1.setSize(size * tilesize).setCenter(other.worldx() + offset(), other.worldy() + offset())); + } + protected void drawLaser(Tile tile, Tile target){ int opacityPercentage = Core.settings.getInt("lasersopacity"); if(opacityPercentage == 0) return; @@ -324,19 +341,17 @@ public class PowerNode extends PowerBlock{ } public static boolean insulated(int x, int y, int x2, int y2){ - final Boolean[] bool = {false}; - insulators(x, y, x2, y2, cause -> { - bool[0] = true; - }); - return bool[0]; + returnValue = false; + insulators(x, y, x2, y2, cause -> returnValue = true); + return returnValue; } - public static void insulators(int x, int y, int x2, int y2, Consumer iterator){ + public static void insulators(int x, int y, int x2, int y2, Cons iterator){ world.raycastEach(x, y, x2, y2, (wx, wy) -> { Tile tile = world.ltile(wx, wy); if(tile != null && tile.block() != null && tile.block().insulated){ - iterator.accept(tile); + iterator.get(tile); } return false; 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 fd8f9cf642..4844fc2297 100644 --- a/core/src/io/anuke/mindustry/world/blocks/power/SolarGenerator.java +++ b/core/src/io/anuke/mindustry/world/blocks/power/SolarGenerator.java @@ -1,8 +1,10 @@ package io.anuke.mindustry.world.blocks.power; -import io.anuke.arc.collection.EnumSet; -import io.anuke.mindustry.entities.type.TileEntity; -import io.anuke.mindustry.world.meta.StatUnit; +import io.anuke.arc.collection.*; +import io.anuke.mindustry.world.*; +import io.anuke.mindustry.world.meta.*; + +import static io.anuke.mindustry.Vars.state; public class SolarGenerator extends PowerGenerator{ @@ -10,6 +12,12 @@ public class SolarGenerator extends PowerGenerator{ super(name); // Remove the BlockFlag.producer flag to make this a lower priority target than other generators. flags = EnumSet.of(); + entityType = GeneratorEntity::new; + } + + @Override + public void update(Tile tile){ + tile.entity().productionEfficiency = state.rules.lighting ? 1f - state.rules.ambientLight.a : 1f; } @Override @@ -19,12 +27,4 @@ public class SolarGenerator extends PowerGenerator{ stats.remove(generationType); stats.add(generationType, powerProduction * 60.0f, StatUnit.powerSecond); } - - @Override - public TileEntity newEntity(){ - return new PowerGenerator.GeneratorEntity(){{ - productionEfficiency = 1.0f; - }}; - } - } 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 2415a84578..b2d9576718 100644 --- a/core/src/io/anuke/mindustry/world/blocks/power/ThermalGenerator.java +++ b/core/src/io/anuke/mindustry/world/blocks/power/ThermalGenerator.java @@ -1,12 +1,15 @@ package io.anuke.mindustry.world.blocks.power; -import io.anuke.arc.Core; -import io.anuke.arc.math.Mathf; -import io.anuke.mindustry.content.Fx; -import io.anuke.mindustry.entities.Effects; -import io.anuke.mindustry.entities.Effects.Effect; -import io.anuke.mindustry.world.Tile; -import io.anuke.mindustry.world.meta.Attribute; +import io.anuke.arc.*; +import io.anuke.arc.graphics.*; +import io.anuke.arc.math.*; +import io.anuke.mindustry.content.*; +import io.anuke.mindustry.entities.*; +import io.anuke.mindustry.entities.Effects.*; +import io.anuke.mindustry.world.*; +import io.anuke.mindustry.world.meta.*; + +import static io.anuke.mindustry.Vars.renderer; public class ThermalGenerator extends PowerGenerator{ protected Effect generateEffect = Fx.none; @@ -29,6 +32,12 @@ public class ThermalGenerator extends PowerGenerator{ drawPlaceText(Core.bundle.formatFloat("bar.efficiency", sumAttribute(Attribute.heat, x, y) * 100, 1), x, y, valid); } + @Override + public void drawLight(Tile tile){ + GeneratorEntity entity = tile.entity(); + renderer.lights.add(tile.drawx(), tile.drawy(), (40f + Mathf.absin(10f, 5f)) * entity.productionEfficiency * size, Color.scarlet, 0.4f); + } + @Override public void onProximityAdded(Tile tile){ super.onProximityAdded(tile); 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 07a7242bb2..c3901d435c 100644 --- a/core/src/io/anuke/mindustry/world/blocks/production/Cultivator.java +++ b/core/src/io/anuke/mindustry/world/blocks/production/Cultivator.java @@ -23,10 +23,12 @@ public class Cultivator extends GenericCrafter{ protected TextureRegion middleRegion, topRegion; protected RandomXS128 random = new RandomXS128(0); protected float recurrence = 6f; + protected Attribute attribute = Attribute.spores; public Cultivator(String name){ super(name); craftEffect = Fx.none; + entityType = CultivatorEntity::new; } @Override @@ -57,7 +59,7 @@ public class Cultivator extends GenericCrafter{ @Override public void drawPlace(int x, int y, int rotation, boolean valid){ - drawPlaceText(Core.bundle.formatFloat("bar.efficiency", (1 + sumAttribute(Attribute.spores, x, y)) * 100, 1), x, y, valid); + drawPlaceText(Core.bundle.formatFloat("bar.efficiency", (1 + sumAttribute(attribute, x, y)) * 100, 1), x, y, valid); } @Override @@ -93,17 +95,12 @@ public class Cultivator extends GenericCrafter{ return new TextureRegion[]{Core.atlas.find(name), Core.atlas.find(name + "-top"),}; } - @Override - public TileEntity newEntity(){ - return new CultivatorEntity(); - } - @Override public void onProximityAdded(Tile tile){ super.onProximityAdded(tile); CultivatorEntity entity = tile.entity(); - entity.boost = sumAttribute(Attribute.spores, tile.x, tile.y); + entity.boost = sumAttribute(attribute, tile.x, tile.y); } @Override 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 5e528a1416..c200de737b 100644 --- a/core/src/io/anuke/mindustry/world/blocks/production/Drill.java +++ b/core/src/io/anuke/mindustry/world/blocks/production/Drill.java @@ -66,6 +66,7 @@ public class Drill extends Block{ hasLiquids = true; liquidCapacity = 5f; hasItems = true; + entityType = DrillEntity::new; idleSound = Sounds.drill; idleSoundVolume = 0.003f; @@ -129,7 +130,7 @@ public class Drill extends Block{ } @Override - public boolean canProduce(Tile tile){ + public boolean shouldConsume(Tile tile){ return tile.entity.items.total() < itemCapacity; } @@ -257,9 +258,7 @@ public class Drill extends Block{ speed = liquidBoostIntensity; } - if(hasPower){ - speed *= entity.power.satisfaction; // Drill slower when not at full power - } + speed *= entity.efficiency(); // Drill slower when not at full power entity.lastDrillSpeed = (speed * entity.dominantItems * entity.warmup) / (drillTime + hardnessDrillMultiplier * entity.dominantItem.hardness); entity.warmup = Mathf.lerpDelta(entity.warmup, speed, warmupSpeed); @@ -302,11 +301,6 @@ public class Drill extends Block{ } } - @Override - public TileEntity newEntity(){ - return new DrillEntity(); - } - public int tier(){ return tier; } 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 2cd220d7b2..deb606eedd 100644 --- a/core/src/io/anuke/mindustry/world/blocks/production/Fracker.java +++ b/core/src/io/anuke/mindustry/world/blocks/production/Fracker.java @@ -2,7 +2,6 @@ package io.anuke.mindustry.world.blocks.production; import io.anuke.arc.*; import io.anuke.arc.graphics.g2d.*; -import io.anuke.mindustry.entities.type.*; import io.anuke.mindustry.world.*; import io.anuke.mindustry.world.meta.*; @@ -16,6 +15,7 @@ public class Fracker extends SolidPump{ public Fracker(String name){ super(name); hasItems = true; + entityType = FrackerEntity::new; } @Override @@ -43,7 +43,7 @@ public class Fracker extends SolidPump{ public void drawCracks(Tile tile){} @Override - public boolean canProduce(Tile tile){ + public boolean shouldConsume(Tile tile){ return tile.entity.liquids.get(result) < liquidCapacity - 0.01f; } @@ -79,17 +79,12 @@ public class Fracker extends SolidPump{ } super.update(tile); - entity.accumulator += entity.delta() * entity.power.satisfaction; + entity.accumulator += entity.delta() * entity.efficiency(); }else{ tryDumpLiquid(tile, result); } } - @Override - public TileEntity newEntity(){ - return new FrackerEntity(); - } - @Override public float typeLiquid(Tile tile){ return tile.entity.liquids.get(result); 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 eb76325965..1878ada116 100644 --- a/core/src/io/anuke/mindustry/world/blocks/production/GenericCrafter.java +++ b/core/src/io/anuke/mindustry/world/blocks/production/GenericCrafter.java @@ -1,6 +1,6 @@ package io.anuke.mindustry.world.blocks.production; -import io.anuke.arc.function.*; +import io.anuke.arc.func.*; import io.anuke.arc.graphics.g2d.*; import io.anuke.arc.math.*; import io.anuke.arc.util.*; @@ -25,8 +25,8 @@ public class GenericCrafter extends Block{ protected Effect updateEffect = Fx.none; protected float updateEffectChance = 0.04f; - protected Consumer drawer = null; - protected Supplier drawIcons = null; + protected Cons drawer = null; + protected Prov drawIcons = null; public GenericCrafter(String name){ super(name); @@ -36,6 +36,7 @@ public class GenericCrafter extends Block{ health = 60; idleSound = Sounds.machine; idleSoundVolume = 0.03f; + entityType = GenericCrafterEntity::new; } @Override @@ -73,7 +74,7 @@ public class GenericCrafter extends Block{ if(drawer == null){ super.draw(tile); }else{ - drawer.accept(tile); + drawer.get(tile); } } @@ -135,18 +136,13 @@ public class GenericCrafter extends Block{ @Override - public boolean canProduce(Tile tile){ + public boolean shouldConsume(Tile tile){ if(outputItem != null && tile.entity.items.get(outputItem.item) >= itemCapacity){ return false; } return outputLiquid == null || !(tile.entity.liquids.get(outputLiquid.liquid) >= liquidCapacity); } - @Override - public TileEntity newEntity(){ - return new GenericCrafterEntity(); - } - @Override public int getMaximumAccepted(Tile tile, Item item){ return itemCapacity; 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 576236cd53..828decc1e0 100644 --- a/core/src/io/anuke/mindustry/world/blocks/production/GenericSmelter.java +++ b/core/src/io/anuke/mindustry/world/blocks/production/GenericSmelter.java @@ -1,11 +1,13 @@ package io.anuke.mindustry.world.blocks.production; -import io.anuke.arc.Core; -import io.anuke.arc.graphics.Color; +import io.anuke.arc.*; +import io.anuke.arc.graphics.*; import io.anuke.arc.graphics.g2d.*; -import io.anuke.arc.math.Mathf; -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 static io.anuke.mindustry.Vars.renderer; /** A GenericCrafter with a new glowing region drawn on top. */ public class GenericSmelter extends GenericCrafter{ @@ -45,4 +47,11 @@ public class GenericSmelter extends GenericCrafter{ Draw.color(); } } + + @Override + public void drawLight(Tile tile){ + GenericCrafterEntity entity = tile.entity(); + + 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 7e28b8bc67..fce368f246 100644 --- a/core/src/io/anuke/mindustry/world/blocks/production/Incinerator.java +++ b/core/src/io/anuke/mindustry/world/blocks/production/Incinerator.java @@ -24,6 +24,7 @@ public class Incinerator extends Block{ hasLiquids = true; update = true; solid = true; + entityType = IncineratorEntity::new; } @Override @@ -84,11 +85,6 @@ public class Incinerator extends Block{ return entity.heat > 0.5f; } - @Override - public TileEntity newEntity(){ - return new IncineratorEntity(); - } - public static class IncineratorEntity extends TileEntity{ public float heat; } 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 7c9da8619d..6908ad4176 100644 --- a/core/src/io/anuke/mindustry/world/blocks/production/LiquidConverter.java +++ b/core/src/io/anuke/mindustry/world/blocks/production/LiquidConverter.java @@ -32,16 +32,21 @@ public class LiquidConverter extends GenericCrafter{ stats.add(BlockStat.output, outputLiquid.liquid, outputLiquid.amount * craftTime, false); } + @Override + public void drawLight(Tile tile){ + if(hasLiquids && drawLiquidLight && outputLiquid.liquid.lightColor.a > 0.001f){ + drawLiquidLight(tile, outputLiquid.liquid, tile.entity.liquids.get(outputLiquid.liquid)); + } + } + @Override public void update(Tile tile){ GenericCrafterEntity entity = tile.entity(); ConsumeLiquidBase cl = consumes.get(ConsumeType.liquid); if(tile.entity.cons.valid()){ - float use = Math.min(cl.amount * entity.delta(), liquidCapacity - entity.liquids.get(outputLiquid.liquid)); - if(hasPower){ - use *= entity.power.satisfaction; // Produce less liquid if power is not maxed - } + float use = Math.min(cl.amount * entity.delta(), liquidCapacity - entity.liquids.get(outputLiquid.liquid)) * entity.efficiency(); + useContent(tile, outputLiquid.liquid); entity.progress += use / cl.amount / craftTime; entity.liquids.add(outputLiquid.liquid, use); 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 e3bd566738..9b91d8b98f 100644 --- a/core/src/io/anuke/mindustry/world/blocks/production/Pump.java +++ b/core/src/io/anuke/mindustry/world/blocks/production/Pump.java @@ -2,14 +2,19 @@ package io.anuke.mindustry.world.blocks.production; import io.anuke.arc.Core; import io.anuke.arc.collection.Array; +import io.anuke.arc.graphics.Color; import io.anuke.arc.graphics.g2d.Draw; import io.anuke.arc.graphics.g2d.TextureRegion; import io.anuke.mindustry.graphics.Layer; import io.anuke.mindustry.type.Liquid; +import io.anuke.mindustry.ui.Cicon; import io.anuke.mindustry.world.Tile; import io.anuke.mindustry.world.blocks.LiquidBlock; import io.anuke.mindustry.world.meta.*; +import static io.anuke.mindustry.Vars.tilesize; +import static io.anuke.mindustry.Vars.world; + public class Pump extends LiquidBlock{ protected final Array drawTiles = new Array<>(); protected final Array updateTiles = new Array<>(); @@ -49,6 +54,31 @@ public class Pump extends LiquidBlock{ Draw.color(); } + @Override + public void drawPlace(int x, int y, int rotation, boolean valid) { + Tile tile = world.tile(x, y); + if(tile == null) return; + + float tiles = 0f; + Liquid liquidDrop = null; + + for(Tile other : tile.getLinkedTilesAs(this, tempTiles)){ + if(isValid(other)){ + liquidDrop = other.floor().liquidDrop; + tiles++; + } + } + + if(liquidDrop != null){ + float width = drawPlaceText(Core.bundle.formatFloat("bar.pumpspeed", tiles * pumpAmount / size / size * 60f, 0), x, y, valid); + float dx = x * tilesize + offset() - width/2f - 4f, dy = y * tilesize + offset() + size * tilesize / 2f + 5; + Draw.mixcol(Color.darkGray, 1f); + Draw.rect(liquidDrop.icon(Cicon.small), dx, dy - 1); + Draw.reset(); + Draw.rect(liquidDrop.icon(Cicon.small), dx, dy); + } + } + @Override public TextureRegion[] generateIcons(){ return new TextureRegion[]{Core.atlas.find(name)}; @@ -89,10 +119,7 @@ public class Pump extends LiquidBlock{ } if(tile.entity.cons.valid() && liquidDrop != null){ - float maxPump = Math.min(liquidCapacity - tile.entity.liquids.total(), tiles * pumpAmount * tile.entity.delta() / size / size); - if(hasPower){ - maxPump *= tile.entity.power.satisfaction; // Produce slower if not at full power - } + float maxPump = Math.min(liquidCapacity - tile.entity.liquids.total(), tiles * pumpAmount * tile.entity.delta() / size / size) * tile.entity.efficiency(); tile.entity.liquids.add(liquidDrop, maxPump); } 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 90039e140e..bd3f98966b 100644 --- a/core/src/io/anuke/mindustry/world/blocks/production/Separator.java +++ b/core/src/io/anuke/mindustry/world/blocks/production/Separator.java @@ -1,21 +1,15 @@ package io.anuke.mindustry.world.blocks.production; -import io.anuke.arc.graphics.Color; -import io.anuke.arc.graphics.g2d.Draw; -import io.anuke.arc.graphics.g2d.Lines; -import io.anuke.arc.math.Mathf; +import io.anuke.arc.graphics.*; +import io.anuke.arc.graphics.g2d.*; +import io.anuke.arc.math.*; import io.anuke.arc.util.ArcAnnotate.*; -import io.anuke.mindustry.entities.type.TileEntity; -import io.anuke.mindustry.type.Item; -import io.anuke.mindustry.type.ItemStack; -import io.anuke.mindustry.world.Block; -import io.anuke.mindustry.world.Tile; -import io.anuke.mindustry.world.blocks.production.GenericCrafter.GenericCrafterEntity; -import io.anuke.mindustry.world.consumers.ConsumeLiquidBase; -import io.anuke.mindustry.world.consumers.ConsumeType; -import io.anuke.mindustry.world.meta.BlockStat; -import io.anuke.mindustry.world.meta.StatUnit; -import io.anuke.mindustry.world.meta.values.ItemFilterValue; +import io.anuke.mindustry.type.*; +import io.anuke.mindustry.world.*; +import io.anuke.mindustry.world.blocks.production.GenericCrafter.*; +import io.anuke.mindustry.world.consumers.*; +import io.anuke.mindustry.world.meta.*; +import io.anuke.mindustry.world.meta.values.*; /** * Extracts a random list of items from an input item and an input liquid. @@ -39,6 +33,7 @@ public class Separator extends Block{ hasLiquids = true; liquidRegion = reg("-liquid"); + entityType = GenericCrafterEntity::new; } @Override @@ -61,7 +56,7 @@ public class Separator extends Block{ } @Override - public boolean canProduce(Tile tile){ + public boolean shouldConsume(Tile tile){ return tile.entity.items.total() < itemCapacity; } @@ -123,9 +118,4 @@ public class Separator extends Block{ tryDump(tile); } } - - @Override - public TileEntity newEntity(){ - return new GenericCrafterEntity(); - } } 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 9f5c2bcc96..bb6cb397cf 100644 --- a/core/src/io/anuke/mindustry/world/blocks/production/SolidPump.java +++ b/core/src/io/anuke/mindustry/world/blocks/production/SolidPump.java @@ -30,6 +30,7 @@ public class SolidPump extends Pump{ public SolidPump(String name){ super(name); hasPower = true; + entityType = SolidPumpEntity::new; } @Override @@ -42,7 +43,7 @@ public class SolidPump extends Pump{ @Override public void drawPlace(int x, int y, int rotation, boolean valid){ if(attribute != null){ - drawPlaceText(Core.bundle.formatFloat("bar.efficiency", (sumAttribute(attribute, x, y) + 1f) * 100, 1), x, y, valid); + drawPlaceText(Core.bundle.formatFloat("bar.efficiency", (sumAttribute(attribute, x, y) + 1f) * 100 * percentSolid(x, y), 1), x, y, valid); } } @@ -51,7 +52,7 @@ public class SolidPump extends Pump{ super.setBars(); bars.add("efficiency", entity -> new Bar(() -> Core.bundle.formatFloat("bar.efficiency", - ((((SolidPumpEntity)entity).boost + 1f) * ((SolidPumpEntity)entity).warmup) * 100, 1), + ((((SolidPumpEntity)entity).boost + 1f) * ((SolidPumpEntity)entity).warmup) * 100 * percentSolid(entity.tile.x, entity.tile.y), 1), () -> Pal.ammo, () -> ((SolidPumpEntity)entity).warmup)); } @@ -101,7 +102,7 @@ public class SolidPump extends Pump{ fraction += entity.boost; if(tile.entity.cons.valid() && typeLiquid(tile) < liquidCapacity - 0.001f){ - float maxPump = Math.min(liquidCapacity - typeLiquid(tile), pumpAmount * entity.delta() * fraction * entity.power.satisfaction); + float maxPump = Math.min(liquidCapacity - typeLiquid(tile), pumpAmount * entity.delta() * fraction * entity.efficiency()); tile.entity.liquids.add(result, maxPump); entity.warmup = Mathf.lerpDelta(entity.warmup, 1f, 0.02f); if(Mathf.chance(entity.delta() * updateEffectChance)) @@ -134,11 +135,6 @@ public class SolidPump extends Pump{ return tile != null && !tile.floor().isLiquid; } - @Override - public TileEntity newEntity(){ - return new SolidPumpEntity(); - } - @Override public void onProximityAdded(Tile tile){ super.onProximityAdded(tile); 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 aebc81da2a..d38c9dc432 100644 --- a/core/src/io/anuke/mindustry/world/blocks/sandbox/ItemSource.java +++ b/core/src/io/anuke/mindustry/world/blocks/sandbox/ItemSource.java @@ -1,9 +1,9 @@ package io.anuke.mindustry.world.blocks.sandbox; import io.anuke.arc.*; -import io.anuke.arc.function.*; import io.anuke.arc.graphics.g2d.*; import io.anuke.arc.scene.ui.layout.*; +import io.anuke.arc.util.*; import io.anuke.mindustry.entities.traits.BuilderTrait.*; import io.anuke.mindustry.entities.type.*; import io.anuke.mindustry.type.*; @@ -25,6 +25,7 @@ public class ItemSource extends Block{ solid = true; group = BlockGroup.transportation; configurable = true; + entityType = ItemSourceEntity::new; } @Override @@ -91,11 +92,6 @@ public class ItemSource extends Block{ return false; } - @Override - public TileEntity newEntity(){ - return new ItemSourceEntity(); - } - public class ItemSourceEntity extends TileEntity{ Item outputItem; 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 03f1c0d82d..5513f462ec 100644 --- a/core/src/io/anuke/mindustry/world/blocks/sandbox/LiquidSource.java +++ b/core/src/io/anuke/mindustry/world/blocks/sandbox/LiquidSource.java @@ -2,11 +2,11 @@ package io.anuke.mindustry.world.blocks.sandbox; import io.anuke.arc.*; import io.anuke.arc.collection.*; -import io.anuke.arc.function.*; import io.anuke.arc.graphics.g2d.*; import io.anuke.arc.scene.style.*; import io.anuke.arc.scene.ui.*; import io.anuke.arc.scene.ui.layout.*; +import io.anuke.arc.util.*; import io.anuke.arc.util.ArcAnnotate.*; import io.anuke.mindustry.entities.traits.BuilderTrait.*; import io.anuke.mindustry.entities.type.*; @@ -31,6 +31,7 @@ public class LiquidSource extends Block{ liquidCapacity = 100f; configurable = true; outputsLiquid = true; + entityType = LiquidSourceEntity::new; } @Override @@ -106,11 +107,6 @@ public class LiquidSource extends Block{ table.add(cont); } - @Override - public TileEntity newEntity(){ - return new LiquidSourceEntity(); - } - @Override public void configured(Tile tile, Player player, int value){ tile.entity().source = value == -1 ? null : content.liquid(value); 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 045003a545..c164e7011e 100644 --- a/core/src/io/anuke/mindustry/world/blocks/storage/CoreBlock.java +++ b/core/src/io/anuke/mindustry/world/blocks/storage/CoreBlock.java @@ -3,7 +3,7 @@ package io.anuke.mindustry.world.blocks.storage; import io.anuke.annotations.Annotations.*; import io.anuke.arc.*; import io.anuke.arc.collection.*; -import io.anuke.arc.function.*; +import io.anuke.arc.func.*; import io.anuke.arc.graphics.g2d.*; import io.anuke.arc.math.*; import io.anuke.arc.math.geom.*; @@ -36,6 +36,7 @@ public class CoreBlock extends StorageBlock{ activeSound = Sounds.respawning; activeSoundVolume = 1f; layer = Layer.overlay; + entityType = CoreEntity::new; } @Remote(called = Loc.server) @@ -63,6 +64,11 @@ public class CoreBlock extends StorageBlock{ )); } + @Override + public void drawLight(Tile tile){ + renderer.lights.add(tile.drawx(), tile.drawy(), 30f * size, Pal.accent, 0.5f + Mathf.absin(20f, 0.1f)); + } + @Override public boolean acceptItem(Item item, Tile tile, Tile source){ return tile.entity.items.get(item) < getMaximumAccepted(tile, item); @@ -111,7 +117,7 @@ public class CoreBlock extends StorageBlock{ @Override public void drawSelect(Tile tile){ Lines.stroke(1f, Pal.accent); - Consumer outline = t -> { + Cons outline = t -> { for(int i = 0; i < 4; i++){ Point2 p = Geometry.d8edge[i]; float offset = -Math.max(t.block().size - 1, 0) / 2f * tilesize; @@ -119,7 +125,7 @@ public class CoreBlock extends StorageBlock{ } }; if(tile.entity.proximity().contains(e -> isContainer(e) && e.entity.items == tile.entity.items)){ - outline.accept(tile); + outline.get(tile); } tile.entity.proximity().each(e -> isContainer(e) && e.entity.items == tile.entity.items, outline); Draw.reset(); @@ -130,6 +136,14 @@ public class CoreBlock extends StorageBlock{ return tile.entity instanceof StorageBlockEntity; } + @Override + public float handleDamage(Tile tile, float amount){ + if(player != null && tile.getTeam() == player.getTeam()){ + Events.fire(Trigger.teamCoreDamage); + } + return amount; + } + @Override public boolean canBreak(Tile tile){ return false; @@ -216,11 +230,6 @@ public class CoreBlock extends StorageBlock{ return entity.spawnPlayer != null; } - @Override - public TileEntity newEntity(){ - return new CoreEntity(); - } - public class CoreEntity extends TileEntity implements SpawnerTrait{ protected Player spawnPlayer; protected float progress; 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 aa177b1caf..7746932916 100644 --- a/core/src/io/anuke/mindustry/world/blocks/storage/StorageBlock.java +++ b/core/src/io/anuke/mindustry/world/blocks/storage/StorageBlock.java @@ -11,6 +11,7 @@ public abstract class StorageBlock extends Block{ public StorageBlock(String name){ super(name); hasItems = true; + entityType = StorageBlockEntity::new; } @Override @@ -69,11 +70,6 @@ public abstract class StorageBlock extends Block{ } } - @Override - public TileEntity newEntity(){ - return new StorageBlockEntity(); - } - public class StorageBlockEntity extends TileEntity{ protected @Nullable Tile linkedCore; diff --git a/core/src/io/anuke/mindustry/world/blocks/storage/Unloader.java b/core/src/io/anuke/mindustry/world/blocks/storage/Unloader.java index 0b5c7d2079..f67701d4d5 100644 --- a/core/src/io/anuke/mindustry/world/blocks/storage/Unloader.java +++ b/core/src/io/anuke/mindustry/world/blocks/storage/Unloader.java @@ -1,9 +1,9 @@ package io.anuke.mindustry.world.blocks.storage; -import io.anuke.arc.function.*; import io.anuke.arc.graphics.*; import io.anuke.arc.graphics.g2d.*; import io.anuke.arc.scene.ui.layout.*; +import io.anuke.arc.util.*; import io.anuke.mindustry.entities.traits.BuilderTrait.*; import io.anuke.mindustry.entities.type.*; import io.anuke.mindustry.type.*; @@ -27,6 +27,7 @@ public class Unloader extends Block{ health = 70; hasItems = true; configurable = true; + entityType = UnloaderEntity::new; } @Override @@ -128,11 +129,6 @@ public class Unloader extends Block{ }); } - @Override - public TileEntity newEntity(){ - return new UnloaderEntity(); - } - public static class UnloaderEntity extends TileEntity{ public Item sortItem = null; 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 01487f6b44..d44b966493 100644 --- a/core/src/io/anuke/mindustry/world/blocks/units/CommandCenter.java +++ b/core/src/io/anuke/mindustry/world/blocks/units/CommandCenter.java @@ -36,6 +36,7 @@ public class CommandCenter extends Block{ destructible = true; solid = true; configurable = true; + entityType = CommandCenterEntity::new; } @Override @@ -122,11 +123,6 @@ public class CommandCenter extends Block{ Events.fire(new CommandIssueEvent(tile, command)); } - @Override - public TileEntity newEntity(){ - return new CommandCenterEntity(); - } - public class CommandCenterEntity extends TileEntity{ public UnitCommand command = UnitCommand.attack; 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 abe1f113b7..ef7314e00b 100644 --- a/core/src/io/anuke/mindustry/world/blocks/units/MechPad.java +++ b/core/src/io/anuke/mindustry/world/blocks/units/MechPad.java @@ -2,6 +2,7 @@ package io.anuke.mindustry.world.blocks.units; import io.anuke.annotations.Annotations.*; import io.anuke.arc.*; +import io.anuke.arc.collection.EnumSet; import io.anuke.arc.graphics.g2d.*; import io.anuke.arc.math.*; import io.anuke.arc.math.geom.*; @@ -24,7 +25,7 @@ import java.io.*; import static io.anuke.mindustry.Vars.*; public class MechPad extends Block{ - protected @NonNull Mech mech; + public @NonNull Mech mech; protected float buildTime = 60 * 5; public MechPad(String name){ @@ -33,6 +34,8 @@ public class MechPad extends Block{ solid = false; hasPower = true; layer = Layer.overlay; + flags = EnumSet.of(BlockFlag.mechPad); + entityType = MechFactoryEntity::new; } @Override @@ -42,11 +45,6 @@ public class MechPad extends Block{ stats.add(BlockStat.productionTime, buildTime / 60f, StatUnit.seconds); } - @Override - public boolean shouldConsume(Tile tile){ - return false; - } - @Remote(targets = Loc.both, called = Loc.server) public static void onMechFactoryTap(Player player, Tile tile){ if(player == null || !(tile.block() instanceof MechPad) || !checkValidTap(tile, player)) return; @@ -137,11 +135,6 @@ public class MechPad extends Block{ } } - @Override - public TileEntity newEntity(){ - return new MechFactoryEntity(); - } - public class MechFactoryEntity extends TileEntity implements SpawnerTrait{ Player player; boolean sameMech; 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 28c700caee..6c5e8698b2 100644 --- a/core/src/io/anuke/mindustry/world/blocks/units/RepairPoint.java +++ b/core/src/io/anuke/mindustry/world/blocks/units/RepairPoint.java @@ -36,6 +36,7 @@ public class RepairPoint extends Block{ layer2 = Layer.power; hasPower = true; outlineIcon = true; + entityType = RepairPointEntity::new; } @Override @@ -100,7 +101,7 @@ public class RepairPoint extends Block{ if(entity.target != null && (entity.target.isDead() || entity.target.dst(tile) > repairRadius || entity.target.health >= entity.target.maxHealth())){ entity.target = null; }else if(entity.target != null && entity.cons.valid()){ - entity.target.health += repairSpeed * Time.delta() * entity.strength * entity.power.satisfaction; + entity.target.health += repairSpeed * Time.delta() * entity.strength * entity.efficiency(); entity.target.clampHealth(); entity.rotation = Mathf.slerpDelta(entity.rotation, entity.angleTo(entity.target), 0.5f); targetIsBeingRepaired = true; @@ -126,11 +127,6 @@ public class RepairPoint extends Block{ return entity.target != null; } - @Override - public TileEntity newEntity(){ - return new RepairPointEntity(); - } - public class RepairPointEntity extends TileEntity{ public Unit target; public float strength, rotation = 90; 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 69e15f8309..678d43c10f 100644 --- a/core/src/io/anuke/mindustry/world/blocks/units/UnitFactory.java +++ b/core/src/io/anuke/mindustry/world/blocks/units/UnitFactory.java @@ -41,6 +41,7 @@ public class UnitFactory extends Block{ hasItems = true; solid = false; flags = EnumSet.of(BlockFlag.producer); + entityType = UnitFactoryEntity::new; } @Remote(called = Loc.server) @@ -159,8 +160,8 @@ public class UnitFactory extends Block{ } if(entity.cons.valid() || tile.isEnemyCheat()){ - entity.time += entity.delta() * entity.speedScl * Vars.state.rules.unitBuildSpeedMultiplier * entity.power.satisfaction; - entity.buildTime += entity.delta() * entity.power.satisfaction * Vars.state.rules.unitBuildSpeedMultiplier; + entity.time += entity.delta() * entity.speedScl * Vars.state.rules.unitBuildSpeedMultiplier * entity.efficiency(); + entity.buildTime += entity.delta() * entity.efficiency() * Vars.state.rules.unitBuildSpeedMultiplier; entity.speedScl = Mathf.lerpDelta(entity.speedScl, 1f, 0.05f); }else{ entity.speedScl = Mathf.lerpDelta(entity.speedScl, 0f, 0.05f); @@ -175,27 +176,18 @@ public class UnitFactory extends Block{ entity.cons.trigger(); } } + @Override public int getMaximumAccepted(Tile tile, Item item){ return capacities[item.id]; } @Override - public TileEntity newEntity(){ - return new UnitFactoryEntity(); - } - - @Override - public boolean canProduce(Tile tile){ + public boolean shouldConsume(Tile tile){ UnitFactoryEntity entity = tile.entity(); return entity.spawned < maxSpawn; } - @Override - public boolean shouldConsume(Tile tile){ - return canProduce(tile); - } - public static class UnitFactoryEntity extends TileEntity{ float buildTime; float time; diff --git a/core/src/io/anuke/mindustry/world/consumers/ConsumeItemFilter.java b/core/src/io/anuke/mindustry/world/consumers/ConsumeItemFilter.java index 89c78d7ca0..93e05c17aa 100644 --- a/core/src/io/anuke/mindustry/world/consumers/ConsumeItemFilter.java +++ b/core/src/io/anuke/mindustry/world/consumers/ConsumeItemFilter.java @@ -1,7 +1,7 @@ package io.anuke.mindustry.world.consumers; import io.anuke.arc.collection.*; -import io.anuke.arc.function.*; +import io.anuke.arc.func.*; import io.anuke.arc.scene.ui.layout.*; import io.anuke.arc.util.ArcAnnotate.*; import io.anuke.mindustry.entities.type.*; @@ -15,9 +15,10 @@ import io.anuke.mindustry.world.meta.values.*; import static io.anuke.mindustry.Vars.*; public class ConsumeItemFilter extends Consume{ - public final @NonNull Predicate filter; + public final @NonNull + Boolf filter; - public ConsumeItemFilter(Predicate item){ + public ConsumeItemFilter(Boolf item){ this.filter = item; } @@ -34,7 +35,7 @@ public class ConsumeItemFilter extends Consume{ @Override public void build(Tile tile, Table table){ MultiReqImage image = new MultiReqImage(); - content.items().each(i -> filter.test(i) && (!world.isZone() || data.isUnlocked(i)), item -> image.add(new ReqImage(new ItemImage(item.icon(Cicon.medium), 1), () -> tile.entity != null && tile.entity.items != null && tile.entity.items.has(item)))); + content.items().each(i -> filter.get(i) && (!world.isZone() || data.isUnlocked(i)), item -> image.add(new ReqImage(new ItemImage(item.icon(Cicon.medium), 1), () -> tile.entity != null && tile.entity.items != null && tile.entity.items.has(item)))); table.add(image).size(8 * 4); } @@ -53,7 +54,7 @@ public class ConsumeItemFilter extends Consume{ public void trigger(TileEntity entity){ for(int i = 0; i < content.items().size; i++){ Item item = content.item(i); - if(entity.items != null && entity.items.has(item) && this.filter.test(item)){ + if(entity.items != null && entity.items.has(item) && this.filter.get(item)){ entity.items.remove(item, 1); break; } @@ -64,7 +65,7 @@ public class ConsumeItemFilter extends Consume{ public boolean valid(TileEntity entity){ for(int i = 0; i < content.items().size; i++){ Item item = content.item(i); - if(entity.items != null && entity.items.has(item) && this.filter.test(item)){ + if(entity.items != null && entity.items.has(item) && this.filter.get(item)){ return true; } } diff --git a/core/src/io/anuke/mindustry/world/consumers/ConsumeLiquidFilter.java b/core/src/io/anuke/mindustry/world/consumers/ConsumeLiquidFilter.java index 5a58ca323f..1da3e86e50 100644 --- a/core/src/io/anuke/mindustry/world/consumers/ConsumeLiquidFilter.java +++ b/core/src/io/anuke/mindustry/world/consumers/ConsumeLiquidFilter.java @@ -1,7 +1,7 @@ package io.anuke.mindustry.world.consumers; import io.anuke.arc.collection.*; -import io.anuke.arc.function.Predicate; +import io.anuke.arc.func.Boolf; import io.anuke.arc.scene.ui.layout.Table; import io.anuke.mindustry.entities.type.TileEntity; import io.anuke.mindustry.type.Liquid; @@ -16,9 +16,9 @@ import io.anuke.mindustry.world.meta.values.LiquidFilterValue; import static io.anuke.mindustry.Vars.content; public class ConsumeLiquidFilter extends ConsumeLiquidBase{ - public final Predicate filter; + public final Boolf filter; - public ConsumeLiquidFilter(Predicate liquid, float amount){ + public ConsumeLiquidFilter(Boolf liquid, float amount){ super(amount); this.filter = liquid; } @@ -30,7 +30,7 @@ public class ConsumeLiquidFilter extends ConsumeLiquidBase{ @Override public void build(Tile tile, Table table){ - Array list = content.liquids().select(l -> !l.isHidden() && filter.test(l)); + Array list = content.liquids().select(l -> !l.isHidden() && filter.get(l)); MultiReqImage image = new MultiReqImage(); list.each(liquid -> image.add(new ReqImage(liquid.icon(Cicon.medium), () -> tile.entity != null && tile.entity.liquids != null && tile.entity.liquids.get(liquid) >= use(tile.entity)))); @@ -49,7 +49,7 @@ public class ConsumeLiquidFilter extends ConsumeLiquidBase{ @Override public boolean valid(TileEntity entity){ - return entity != null && entity.liquids != null && filter.test(entity.liquids.current()) && entity.liquids.currentAmount() >= use(entity); + return entity != null && entity.liquids != null && filter.get(entity.liquids.current()) && entity.liquids.currentAmount() >= use(entity); } @Override diff --git a/core/src/io/anuke/mindustry/world/consumers/ConsumePower.java b/core/src/io/anuke/mindustry/world/consumers/ConsumePower.java index d183b3969f..3343332fc4 100644 --- a/core/src/io/anuke/mindustry/world/consumers/ConsumePower.java +++ b/core/src/io/anuke/mindustry/world/consumers/ConsumePower.java @@ -1,5 +1,6 @@ package io.anuke.mindustry.world.consumers; +import io.anuke.arc.math.Mathf; import io.anuke.arc.scene.ui.layout.Table; import io.anuke.mindustry.entities.type.TileEntity; import io.anuke.mindustry.world.Tile; @@ -41,7 +42,7 @@ public class ConsumePower extends Consume{ @Override public void update(TileEntity entity){ - // Nothing to do since PowerGraph directly updates entity.power.satisfaction + // Nothing to do since PowerGraph directly updates entity.power.status } @Override @@ -49,7 +50,7 @@ public class ConsumePower extends Consume{ if(buffered){ return true; }else{ - return entity.power.satisfaction > 0f; + return entity.power.status > 0f; } } @@ -64,15 +65,20 @@ public class ConsumePower extends Consume{ /** * Retrieves the amount of power which is requested for the given block and entity. - * @param block The block which needs power. * @param entity The entity which contains the power module. * @return The amount of power which is requested per tick. */ public float requestedPower(TileEntity entity){ + if(entity.tile.entity == null) return 0f; if(buffered){ - return (1f-entity.power.satisfaction)*capacity; + return (1f-entity.power.status)*capacity; }else{ - return usage; + try{ + return usage * Mathf.num(entity.block.shouldConsume(entity.tile)); + }catch(Exception e){ + //HACK an error will only happen with a bar that is checking its requested power, and the entity is null/a different class + return 0; + } } } diff --git a/core/src/io/anuke/mindustry/world/consumers/Consumers.java b/core/src/io/anuke/mindustry/world/consumers/Consumers.java index 5693b759a5..2c66a03596 100644 --- a/core/src/io/anuke/mindustry/world/consumers/Consumers.java +++ b/core/src/io/anuke/mindustry/world/consumers/Consumers.java @@ -1,7 +1,7 @@ package io.anuke.mindustry.world.consumers; import io.anuke.arc.collection.*; -import io.anuke.arc.function.Predicate; +import io.anuke.arc.func.Boolf; import io.anuke.arc.util.Structs; import io.anuke.mindustry.Vars; import io.anuke.mindustry.entities.type.TileEntity; @@ -48,7 +48,7 @@ public class Consumers{ } /** Creates a consumer which only consumes power when the condition is met. */ - public ConsumePower powerCond(float usage, Predicate cons){ + public ConsumePower powerCond(float usage, Boolf cons){ return add(new ConditionalConsumePower(usage, cons)); } diff --git a/core/src/io/anuke/mindustry/world/meta/BlockBars.java b/core/src/io/anuke/mindustry/world/meta/BlockBars.java index 1e42281ba9..11706bc510 100644 --- a/core/src/io/anuke/mindustry/world/meta/BlockBars.java +++ b/core/src/io/anuke/mindustry/world/meta/BlockBars.java @@ -1,14 +1,14 @@ package io.anuke.mindustry.world.meta; import io.anuke.arc.collection.OrderedMap; -import io.anuke.arc.function.Function; +import io.anuke.arc.func.Func; import io.anuke.mindustry.entities.type.TileEntity; import io.anuke.mindustry.ui.Bar; public class BlockBars{ - private OrderedMap> bars = new OrderedMap<>(); + private OrderedMap> bars = new OrderedMap<>(); - public void add(String name, Function sup){ + public void add(String name, Func sup){ bars.put(name, sup); } @@ -18,7 +18,7 @@ public class BlockBars{ bars.remove(name); } - public Iterable> list(){ + public Iterable> list(){ return bars.values(); } } diff --git a/core/src/io/anuke/mindustry/world/meta/BlockFlag.java b/core/src/io/anuke/mindustry/world/meta/BlockFlag.java index ea5887abba..477d6a6ce6 100644 --- a/core/src/io/anuke/mindustry/world/meta/BlockFlag.java +++ b/core/src/io/anuke/mindustry/world/meta/BlockFlag.java @@ -13,7 +13,9 @@ public enum BlockFlag{ /** Only the command center block.*/ comandCenter, /** Repair point. */ - repair; + repair, + /** Upgrade pad. */ + mechPad; public final static BlockFlag[] all = values(); } diff --git a/core/src/io/anuke/mindustry/world/meta/BlockStat.java b/core/src/io/anuke/mindustry/world/meta/BlockStat.java index b32fb7d192..7cea1a1277 100644 --- a/core/src/io/anuke/mindustry/world/meta/BlockStat.java +++ b/core/src/io/anuke/mindustry/world/meta/BlockStat.java @@ -21,6 +21,7 @@ public enum BlockStat{ powerUse(StatCategory.power), powerDamage(StatCategory.power), powerRange(StatCategory.power), + powerConnections(StatCategory.power), basePowerGeneration(StatCategory.power), input(StatCategory.crafting), diff --git a/core/src/io/anuke/mindustry/world/meta/BuildVisibility.java b/core/src/io/anuke/mindustry/world/meta/BuildVisibility.java index 38c98aeaa2..6197312ebc 100644 --- a/core/src/io/anuke/mindustry/world/meta/BuildVisibility.java +++ b/core/src/io/anuke/mindustry/world/meta/BuildVisibility.java @@ -1,6 +1,6 @@ package io.anuke.mindustry.world.meta; -import io.anuke.arc.function.*; +import io.anuke.arc.func.*; import io.anuke.mindustry.*; public enum BuildVisibility{ @@ -8,15 +8,16 @@ public enum BuildVisibility{ shown(() -> true), debugOnly(() -> false), sandboxOnly(() -> Vars.state.rules.infiniteResources), - campaignOnly(() -> Vars.world.isZone()); + campaignOnly(() -> Vars.world.isZone()), + lightingOnly(() -> Vars.state.rules.lighting); - private final BooleanProvider visible; + private final Boolp visible; public boolean visible(){ return visible.get(); } - BuildVisibility(BooleanProvider visible){ + BuildVisibility(Boolp visible){ this.visible = visible; } } 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 86f51320b6..c531fabe45 100644 --- a/core/src/io/anuke/mindustry/world/meta/values/AmmoListValue.java +++ b/core/src/io/anuke/mindustry/world/meta/values/AmmoListValue.java @@ -41,9 +41,9 @@ public class AmmoListValue implements StatValue{ sep(bt, Core.bundle.format("bullet.splashdamage", (int)type.splashDamage, Strings.fixed(type.splashDamageRadius / tilesize, 1))); } - if(!Mathf.isEqual(type.ammoMultiplier, 1f)) + if(!Mathf.equal(type.ammoMultiplier, 1f)) sep(bt, Core.bundle.format("bullet.multiplier", (int)type.ammoMultiplier)); - if(!Mathf.isEqual(type.reloadMultiplier, 1f)) + if(!Mathf.equal(type.reloadMultiplier, 1f)) sep(bt, Core.bundle.format("bullet.reload", Strings.fixed(type.reloadMultiplier, 1))); if(type.knockback > 0){ 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 5fc06abd3e..4d1a867904 100644 --- a/core/src/io/anuke/mindustry/world/meta/values/BoosterListValue.java +++ b/core/src/io/anuke/mindustry/world/meta/values/BoosterListValue.java @@ -1,7 +1,7 @@ package io.anuke.mindustry.world.meta.values; import io.anuke.arc.*; -import io.anuke.arc.function.*; +import io.anuke.arc.func.*; import io.anuke.arc.scene.ui.layout.*; import io.anuke.arc.util.*; import io.anuke.mindustry.gen.*; @@ -14,9 +14,9 @@ import static io.anuke.mindustry.Vars.content; public class BoosterListValue implements StatValue{ protected float reload, maxUsed, multiplier; protected boolean baseReload; - protected Predicate filter; + protected Boolf filter; - public BoosterListValue(float reload, float maxUsed, float multiplier, boolean baseReload, Predicate filter){ + public BoosterListValue(float reload, float maxUsed, float multiplier, boolean baseReload, Boolf filter){ this.reload = reload; this.maxUsed = maxUsed; this.baseReload = baseReload; @@ -30,7 +30,7 @@ public class BoosterListValue implements StatValue{ table.row(); table.table(c -> { for(Liquid liquid : content.liquids()){ - if(!filter.test(liquid)) continue; + 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(); diff --git a/core/src/io/anuke/mindustry/world/meta/values/ItemFilterValue.java b/core/src/io/anuke/mindustry/world/meta/values/ItemFilterValue.java index 8bb1ecb6a0..2bdaa32377 100644 --- a/core/src/io/anuke/mindustry/world/meta/values/ItemFilterValue.java +++ b/core/src/io/anuke/mindustry/world/meta/values/ItemFilterValue.java @@ -1,7 +1,7 @@ package io.anuke.mindustry.world.meta.values; import io.anuke.arc.collection.Array; -import io.anuke.arc.function.Predicate; +import io.anuke.arc.func.Boolf; import io.anuke.arc.scene.ui.layout.Table; import io.anuke.mindustry.type.Item; import io.anuke.mindustry.ui.ItemDisplay; @@ -10,9 +10,9 @@ import io.anuke.mindustry.world.meta.StatValue; import static io.anuke.mindustry.Vars.content; public class ItemFilterValue implements StatValue{ - private final Predicate filter; + private final Boolf filter; - public ItemFilterValue(Predicate filter){ + public ItemFilterValue(Boolf filter){ this.filter = filter; } diff --git a/core/src/io/anuke/mindustry/world/meta/values/LiquidFilterValue.java b/core/src/io/anuke/mindustry/world/meta/values/LiquidFilterValue.java index e30c2b0ba5..99f6ea4a31 100644 --- a/core/src/io/anuke/mindustry/world/meta/values/LiquidFilterValue.java +++ b/core/src/io/anuke/mindustry/world/meta/values/LiquidFilterValue.java @@ -1,7 +1,7 @@ package io.anuke.mindustry.world.meta.values; import io.anuke.arc.collection.Array; -import io.anuke.arc.function.Predicate; +import io.anuke.arc.func.Boolf; import io.anuke.arc.scene.ui.layout.Table; import io.anuke.mindustry.type.Liquid; import io.anuke.mindustry.ui.LiquidDisplay; @@ -10,11 +10,11 @@ import io.anuke.mindustry.world.meta.StatValue; import static io.anuke.mindustry.Vars.content; public class LiquidFilterValue implements StatValue{ - private final Predicate filter; + private final Boolf filter; private final float amount; private final boolean perSecond; - public LiquidFilterValue(Predicate filter, float amount, boolean perSecond){ + public LiquidFilterValue(Boolf filter, float amount, boolean perSecond){ this.filter = filter; this.amount = amount; this.perSecond = perSecond; @@ -25,7 +25,7 @@ public class LiquidFilterValue implements StatValue{ Array list = new Array<>(); for(Liquid item : content.liquids()){ - if(!item.isHidden() && filter.test(item)) list.add(item); + if(!item.isHidden() && filter.get(item)) list.add(item); } for(int i = 0; i < list.size; i++){ diff --git a/core/src/io/anuke/mindustry/world/modules/ConsumeModule.java b/core/src/io/anuke/mindustry/world/modules/ConsumeModule.java index e4a08ec413..29252af34d 100644 --- a/core/src/io/anuke/mindustry/world/modules/ConsumeModule.java +++ b/core/src/io/anuke/mindustry/world/modules/ConsumeModule.java @@ -23,7 +23,7 @@ public class ConsumeModule extends BlockModule{ boolean prevValid = valid(); valid = true; optionalValid = true; - boolean docons = entity.block.shouldConsume(entity.tile); + boolean docons = entity.block.shouldConsume(entity.tile) && entity.block.productionValid(entity.tile); for(Consume cons : entity.block.consumes.all()){ if(cons.isOptional()) continue; @@ -51,7 +51,7 @@ public class ConsumeModule extends BlockModule{ } public boolean valid(){ - return valid && entity.block.canProduce(entity.tile); + return valid && entity.block.shouldConsume(entity.tile); } public boolean optionalValid(){ diff --git a/core/src/io/anuke/mindustry/world/modules/LiquidModule.java b/core/src/io/anuke/mindustry/world/modules/LiquidModule.java index 3eb50fc8e4..e597be1b66 100644 --- a/core/src/io/anuke/mindustry/world/modules/LiquidModule.java +++ b/core/src/io/anuke/mindustry/world/modules/LiquidModule.java @@ -1,5 +1,6 @@ package io.anuke.mindustry.world.modules; +import io.anuke.arc.math.*; import io.anuke.mindustry.type.Liquid; import java.io.*; @@ -11,6 +12,15 @@ public class LiquidModule extends BlockModule{ private float[] liquids = new float[content.liquids().size]; private float total; private Liquid current = content.liquid(0); + private float smoothLiquid; + + public void update(){ + smoothLiquid = Mathf.lerpDelta(smoothLiquid, currentAmount(), 0.1f); + } + + public float smoothAmount(){ + return smoothLiquid; + } /** Returns total amount of liquids. */ public float total(){ @@ -54,7 +64,7 @@ public class LiquidModule extends BlockModule{ add(liquid, -amount); } - public void forEach(LiquidConsumer cons){ + public void each(LiquidConsumer cons){ for(int i = 0; i < liquids.length; i++){ if(liquids[i] > 0){ cons.accept(content.liquid(i), liquids[i]); diff --git a/core/src/io/anuke/mindustry/world/modules/PowerModule.java b/core/src/io/anuke/mindustry/world/modules/PowerModule.java index ad82a5aedb..ad1a958fb7 100644 --- a/core/src/io/anuke/mindustry/world/modules/PowerModule.java +++ b/core/src/io/anuke/mindustry/world/modules/PowerModule.java @@ -13,7 +13,7 @@ public class PowerModule extends BlockModule{ * Blocks will work at a reduced efficiency if this is not equal to 1.0f. * In case of buffered consumers, this is the percentage of power stored in relation to the maximum capacity. */ - public float satisfaction = 0.0f; + public float status = 0.0f; public PowerGraph graph = new PowerGraph(); public IntArray links = new IntArray(); @@ -23,7 +23,7 @@ public class PowerModule extends BlockModule{ for(int i = 0; i < links.size; i++){ stream.writeInt(links.get(i)); } - stream.writeFloat(satisfaction); + stream.writeFloat(status); } @Override @@ -32,7 +32,7 @@ public class PowerModule extends BlockModule{ for(int i = 0; i < amount; i++){ links.add(stream.readInt()); } - satisfaction = stream.readFloat(); - if(Float.isNaN(satisfaction) || Float.isInfinite(satisfaction)) satisfaction = 0f; + status = stream.readFloat(); + if(Float.isNaN(status) || Float.isInfinite(status)) status = 0f; } } diff --git a/desktop/build.gradle b/desktop/build.gradle index 7aac76552a..f8af30311c 100644 --- a/desktop/build.gradle +++ b/desktop/build.gradle @@ -40,7 +40,7 @@ task dist(type: Jar, dependsOn: classes){ from {configurations.compile.collect {zipTree(it)}} from files(project.assetsDir) - archiveName = "${appName}.jar" + archiveFileName = "${appName}.jar" manifest{ attributes 'Main-Class': project.mainClassName @@ -144,6 +144,17 @@ PackrConfig.Platform.values().each{ platform -> } } + if(versionModifier.contains("steam")){ + copy{ + def lib = platform == PackrConfig.Platform.MacOS || platform == PackrConfig.Platform.Linux64 ? "lib" : "" + from zipTree(platform == PackrConfig.Platform.MacOS ? "build/packr/output/${appName}.app/Contents/Resources/desktop.jar" : "build/packr/output/jre/desktop.jar").matching{ + 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/" + } + } + copy{ from "build/packr/output" into "../deploy/${platform.toString()}" @@ -152,8 +163,8 @@ PackrConfig.Platform.values().each{ platform -> task "zip${platform.toString()}"(type: Zip){ from "build/packr/output" - archiveName "${generateDeployName(platform.toString())}.zip" - destinationDir(file("../deploy")) + archiveFileName = "${generateDeployName(platform.toString())}.zip" + destinationDirectory = (file("../deploy")) doLast{ delete{ diff --git a/desktop/src/io/anuke/mindustry/desktop/DesktopLauncher.java b/desktop/src/io/anuke/mindustry/desktop/DesktopLauncher.java index bcf4ddfb82..1bea20db40 100644 --- a/desktop/src/io/anuke/mindustry/desktop/DesktopLauncher.java +++ b/desktop/src/io/anuke/mindustry/desktop/DesktopLauncher.java @@ -8,7 +8,7 @@ import io.anuke.arc.backends.sdl.*; import io.anuke.arc.backends.sdl.jni.*; import io.anuke.arc.collection.*; import io.anuke.arc.files.*; -import io.anuke.arc.function.*; +import io.anuke.arc.func.*; import io.anuke.arc.input.*; import io.anuke.arc.math.*; import io.anuke.arc.scene.event.*; @@ -35,11 +35,11 @@ import java.util.*; import static io.anuke.mindustry.Vars.*; - public class DesktopLauncher extends ClientLauncher{ public final static String discordID = "610508934456934412"; - boolean useDiscord = OS.is64Bit, showConsole = OS.getPropertyNotNull("user.name").equals("anuke"); + boolean useDiscord = OS.is64Bit, loadError = false; + Throwable steamError; static{ if(!Charset.forName("US-ASCII").newEncoder().canEncode(System.getProperty("user.name", ""))){ @@ -91,67 +91,71 @@ public class DesktopLauncher extends ClientLauncher{ } } - if(showConsole){ - StringBuilder base = new StringBuilder(); - Log.setLogger(new LogHandler(){ - @Override - public void print(String text, Object... args){ - String out = Log.format(text, false, args); + 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"); - } - }); + 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)){ - 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(); + 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())); + }))); + } + }); try{ - try{ - SteamAPI.loadLibraries(); - }catch(Throwable t){ - logSteamError(t); - fallbackSteam(); - } + SteamAPI.loadLibraries(); if(!SteamAPI.init()){ + loadError = true; Log.err("Steam client not running."); }else{ initSteam(args); Vars.steam = true; } + + if(SteamAPI.restartAppIfNecessary(SVars.steamID)){ + System.exit(0); + } }catch(Throwable e){ steam = false; Log.err("Failed to load Steam native libraries."); @@ -161,6 +165,8 @@ public class DesktopLauncher extends ClientLauncher{ } void logSteamError(Throwable e){ + steamError = e; + loadError = true; Log.err(e); try(OutputStream s = new FileOutputStream(new File("steam-error-log-" + System.nanoTime() + ".txt"))){ String log = Strings.parseException(e, true); @@ -232,12 +238,12 @@ public class DesktopLauncher extends ClientLauncher{ } static void handleCrash(Throwable e){ - Consumer dialog = Runnable::run; + Cons dialog = Runnable::run; boolean badGPU = false; - if(e.getMessage() != null && (e.getMessage().contains("Couldn't create window") || e.getMessage().contains("OpenGL 2.0 or higher"))){ + if(e.getMessage() != null && (e.getMessage().contains("Couldn't create window") || e.getMessage().contains("OpenGL 2.0 or higher") || e.getMessage().toLowerCase().contains("pixel format"))){ - dialog.accept(() -> message( + dialog.get(() -> message( e.getMessage().contains("Couldn't create window") ? "A graphics initialization error has occured! Try to update your graphics drivers:\n" + e.getMessage() : "Your graphics card does not support OpenGL 2.0!\n" + "Try to update your graphics drivers.\n\n" + @@ -253,7 +259,7 @@ public class DesktopLauncher extends ClientLauncher{ if(fc == null) fc = Strings.getFinalCause(e); Throwable cause = fc; if(!fbgp){ - dialog.accept(() -> message("A crash has occured. It has been saved in:\n" + file.getAbsolutePath() + "\n" + cause.getClass().getSimpleName().replace("Exception", "") + (cause.getMessage() == null ? "" : ":\n" + cause.getMessage()))); + dialog.get(() -> message("A crash has occured. It has been saved in:\n" + file.getAbsolutePath() + "\n" + cause.getClass().getSimpleName().replace("Exception", "") + (cause.getMessage() == null ? "" : ":\n" + cause.getMessage()))); } }); } diff --git a/desktop/src/io/anuke/mindustry/desktop/steam/SNet.java b/desktop/src/io/anuke/mindustry/desktop/steam/SNet.java index 4e4e8e680b..526152a52e 100644 --- a/desktop/src/io/anuke/mindustry/desktop/steam/SNet.java +++ b/desktop/src/io/anuke/mindustry/desktop/steam/SNet.java @@ -6,7 +6,7 @@ import com.codedisaster.steamworks.SteamMatchmaking.*; import com.codedisaster.steamworks.SteamNetworking.*; import io.anuke.arc.*; import io.anuke.arc.collection.*; -import io.anuke.arc.function.*; +import io.anuke.arc.func.*; import io.anuke.arc.util.*; import io.anuke.arc.util.pooling.*; import io.anuke.mindustry.core.GameState.*; @@ -39,7 +39,7 @@ public class SNet implements SteamNetworkingCallback, SteamMatchmakingCallback, final IntMap steamConnections = new IntMap<>(); //maps steam ID -> valid net connection SteamID currentLobby, currentServer; - Consumer lobbyCallback; + Cons lobbyCallback; Runnable lobbyDoneCallback, joinCallback; public SNet(NetProvider provider){ @@ -64,7 +64,7 @@ public class SNet implements SteamNetworkingCallback, SteamMatchmakingCallback, try{ //accept users on request if(con == null){ - con = new SteamConnection(SteamID.createFromNativeHandle(SteamNativeHandle.getNativeHandle(from))); + con = new SteamConnection(SteamID.createFromNativeHandle(from.handle())); Connect c = new Connect(); c.addressTCP = "steam:" + from.getAccountID(); @@ -164,7 +164,7 @@ public class SNet implements SteamNetworkingCallback, SteamMatchmakingCallback, } @Override - public void discoverServers(Consumer callback, Runnable done){ + public void discoverServers(Cons callback, Runnable done){ smat.addRequestLobbyListResultCountFilter(32); smat.requestLobbyList(); lobbyCallback = callback; @@ -172,7 +172,7 @@ public class SNet implements SteamNetworkingCallback, SteamMatchmakingCallback, } @Override - public void pingHost(String address, int port, Consumer valid, Consumer failed){ + public void pingHost(String address, int port, Cons valid, Cons failed){ provider.pingHost(address, port, valid, failed); } @@ -315,7 +315,7 @@ public class SNet implements SteamNetworkingCallback, SteamMatchmakingCallback, SteamID lobby = smat.getLobbyByIndex(i); Host out = new Host( smat.getLobbyData(lobby, "name"), - "steam:" + SteamNativeHandle.getNativeHandle(lobby), + "steam:" + lobby.handle(), smat.getLobbyData(lobby, "mapname"), Strings.parseInt(smat.getLobbyData(lobby, "wave"), -1), smat.getNumLobbyMembers(lobby), diff --git a/desktop/src/io/anuke/mindustry/desktop/steam/SWorkshop.java b/desktop/src/io/anuke/mindustry/desktop/steam/SWorkshop.java index ee0b4652fd..170e014a18 100644 --- a/desktop/src/io/anuke/mindustry/desktop/steam/SWorkshop.java +++ b/desktop/src/io/anuke/mindustry/desktop/steam/SWorkshop.java @@ -6,7 +6,7 @@ import com.codedisaster.steamworks.SteamUGC.*; import io.anuke.arc.*; import io.anuke.arc.collection.*; import io.anuke.arc.files.*; -import io.anuke.arc.function.*; +import io.anuke.arc.func.*; import io.anuke.arc.scene.ui.*; import io.anuke.arc.util.*; import io.anuke.mindustry.game.*; @@ -22,8 +22,8 @@ public class SWorkshop implements SteamUGCCallback{ public final SteamUGC ugc = new SteamUGC(this); private ObjectMap, Array> workshopFiles = new ObjectMap<>(); - private ObjectMap, SteamResult>> detailHandlers = new ObjectMap<>(); - private Array> itemHandlers = new Array<>(); + private ObjectMap, SteamResult>> detailHandlers = new ObjectMap<>(); + private Array> itemHandlers = new Array<>(); private ObjectMap updatedHandlers = new ObjectMap<>(); public SWorkshop(){ @@ -76,21 +76,23 @@ public class SWorkshop implements SteamUGCCallback{ public void updateItem(Publishable p, String changelog){ String id = p.getSteamID(); long handle = Strings.parseLong(id, -1); - SteamPublishedFileID fid = new SteamPublishedFileID(handle); - update(p, fid, changelog); + update(p, new SteamPublishedFileID(handle), changelog); } /** Fetches info for an item, checking to make sure that it exists.*/ public void viewListing(Publishable p){ long handle = Strings.parseLong(p.getSteamID(), -1); SteamPublishedFileID id = new SteamPublishedFileID(handle); + Log.info("Handle = " + handle); ui.loadfrag.show(); query(ugc.createQueryUGCDetailsRequest(id), (detailsList, result) -> { ui.loadfrag.hide(); + Log.info("Fetch result = " + result); if(result == SteamResult.OK){ SteamUGCDetails details = detailsList.first(); + Log.info("Details result = " + details.getResult()); if(details.getResult() == SteamResult.OK){ if(details.getOwnerID().equals(SVars.user.user.getSteamID())){ @@ -113,6 +115,11 @@ public class SWorkshop implements SteamUGCCallback{ field.setMaxLength(400); buttons.defaults().size(120, 54).pad(4); buttons.addButton("$ok", () -> { + if(!p.prePublish()){ + Log.info("Rejecting due to pre-publish."); + return; + } + ui.loadfrag.show("$publishing"); updateItem(p, field.getText().replace("\r", "\n")); dialog.hide(); @@ -124,7 +131,7 @@ public class SWorkshop implements SteamUGCCallback{ }).size(210f, 64f); dialog.show(); }else{ - SVars.net.friends.activateGameOverlayToWebPage("steam://url/CommunityFilePage/" + SteamNativeHandle.getNativeHandle(details.getPublishedFileID())); + SVars.net.friends.activateGameOverlayToWebPage("steam://url/CommunityFilePage/" + details.getPublishedFileID().handle()); } }else if(details.getResult() == SteamResult.FileNotFound){ p.removeSteamID(); @@ -139,12 +146,12 @@ public class SWorkshop implements SteamUGCCallback{ } void viewListingID(SteamPublishedFileID id){ - SVars.net.friends.activateGameOverlayToWebPage("steam://url/CommunityFilePage/" + SteamNativeHandle.getNativeHandle(id)); + SVars.net.friends.activateGameOverlayToWebPage("steam://url/CommunityFilePage/" + id.handle()); } void update(Publishable p, SteamPublishedFileID id, String changelog){ - Log.info("Calling update({0})", p.steamTitle()); - String sid = SteamNativeHandle.getNativeHandle(id) + ""; + Log.info("Calling update({0}) {1}", p.steamTitle(), id.handle()); + String sid = id.handle() + ""; updateItem(id, h -> { if(p.steamDescription() != null){ @@ -169,7 +176,7 @@ public class SWorkshop implements SteamUGCCallback{ }, () -> p.addSteamID(sid)); } - void showPublish(Consumer published){ + void showPublish(Cons published){ FloatingDialog dialog = new FloatingDialog("$confirm"); dialog.setFillParent(false); dialog.cont.add("$publish.confirm").width(600f).wrap(); @@ -188,18 +195,18 @@ public class SWorkshop implements SteamUGCCallback{ dialog.show(); } - void query(SteamUGCQuery query, BiConsumer, SteamResult> handler){ + void query(SteamUGCQuery query, Cons2, SteamResult> handler){ Log.info("POST QUERY " + query); detailHandlers.put(query, handler); ugc.sendQueryUGCRequest(query); } - void updateItem(SteamPublishedFileID publishedFileID, Consumer tagger, Runnable updated){ + void updateItem(SteamPublishedFileID publishedFileID, Cons tagger, Runnable updated){ try{ SteamUGCUpdateHandle h = ugc.startItemUpdate(SVars.steamID, publishedFileID); - Log.info("begin updateItem({0})", publishedFileID.toString()); + Log.info("begin updateItem({0})", publishedFileID.handle()); - tagger.accept(h); + tagger.get(h); Log.info("Tagged."); ItemUpdateInfo info = new ItemUpdateInfo(); @@ -239,10 +246,10 @@ public class SWorkshop implements SteamUGCCallback{ details.add(new SteamUGCDetails()); ugc.getQueryUGCResult(query, i, details.get(i)); } - detailHandlers.get(query).accept(details, result); + detailHandlers.get(query).get(details, result); }else{ Log.info("Nothing found."); - detailHandlers.get(query).accept(new Array<>(), SteamResult.FileNotFound); + detailHandlers.get(query).get(new Array<>(), SteamResult.FileNotFound); } detailHandlers.remove(query); @@ -272,9 +279,9 @@ public class SWorkshop implements SteamUGCCallback{ if(!itemHandlers.isEmpty()){ if(result == SteamResult.OK){ Log.info("Passing to first handler."); - itemHandlers.first().accept(publishedFileID); + itemHandlers.first().get(publishedFileID); }else{ - ui.showErrorMessage(Core.bundle.format("publish.error ", result.name())); + ui.showErrorMessage(Core.bundle.format("publish.error", result.name())); } itemHandlers.remove(0); @@ -286,10 +293,10 @@ public class SWorkshop implements SteamUGCCallback{ @Override public void onSubmitItemUpdate(SteamPublishedFileID publishedFileID, boolean needsToAcceptWLA, SteamResult result){ ui.loadfrag.hide(); - Log.info("onsubmititemupdate {0} {1} {2}", publishedFileID, needsToAcceptWLA, result); + Log.info("onsubmititemupdate {0} {1} {2}", publishedFileID.handle(), needsToAcceptWLA, result); if(result == SteamResult.OK){ //redirect user to page for further updates - SVars.net.friends.activateGameOverlayToWebPage("steam://url/CommunityFilePage/" + SteamNativeHandle.getNativeHandle(publishedFileID)); + SVars.net.friends.activateGameOverlayToWebPage("steam://url/CommunityFilePage/" + publishedFileID.handle()); if(needsToAcceptWLA){ SVars.net.friends.activateGameOverlayToWebPage("https://steamcommunity.com/sharedfiles/workshoplegalagreement"); } @@ -298,9 +305,8 @@ public class SWorkshop implements SteamUGCCallback{ updatedHandlers.get(publishedFileID).run(); } }else{ - ui.showErrorMessage(Core.bundle.format("publish.error ", result.name())); + ui.showErrorMessage(Core.bundle.format("publish.error", result.name())); } - } @Override 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/ko-KR/changelogs/89.txt b/fastlane/metadata/android/ko-KR/changelogs/89.txt new file mode 100644 index 0000000000..6e34373cd9 --- /dev/null +++ b/fastlane/metadata/android/ko-KR/changelogs/89.txt @@ -0,0 +1,15 @@ +- IOS/안드로이드에서 멀티플레이어 기능이 고장나는 오류를 해결했습니다. +- Veins 맵이 실리콘의 재료를 반드시 포함하도록 수정되었습니다. +- 적 유닛이 잘못된 곳을 공격 예측지점으로 조준하는 오류를 해결했습니다. +- 서버 오류 송출을 수정했습니다. +- [PC] 마우스 휠 스크롤로 팬이 돌아가지 않던 오류를 해결했습니다. +- PVP 팀 배정 오류를 해결했습니다. +- '확인' 버튼을 누르지 않아도 ui scale이 바뀌는 오류를 해결했습니다. +- PVP 맵에서 주황색 팀이 없을경우 게임 시작이 안되는 오류를 해결했습니다. +- 맵 저장 후 서버 퇴장시 나오는 오류 메세지를 수정했습니다. +- 공격맵을 클리어했을 때 낮은 점수를 표시하는 오류를 해결했습니다. +- 맥의 시작 오류를 해결했습니다. +- UDP에서 TCP로 바꾸었습니다. - 실험적인 기능입니다. +- 버전이 달라 서버 접속을 하지 못할시의 메세지를 추가했습니다. +- 다수가 건설할시에 회전과 충돌이 좀 더 매끄러워졌습니다. +- 전력 노드의 최대 연결 수를 증가시켰습니다. diff --git a/fastlane/metadata/android/ko-KR/changelogs/93.txt b/fastlane/metadata/android/ko-KR/changelogs/93.txt new file mode 100644 index 0000000000..52dc74527a --- /dev/null +++ b/fastlane/metadata/android/ko-KR/changelogs/93.txt @@ -0,0 +1,11 @@ +- 플레이어 소환/부활 애니메이션에 진행도 바와 닉네임이 추가되었습니다. +- 플레이어 UUID에 기반한 서버 화이트리스트 기능이 추가되었습니다. +- 플러그인 api에 많은 이벤트들이 추가되었습니다. +- 코어 착륙 애니메이션이 추가되었습니다. +- 서버에 접속 플레이어 수 제한이 추가되었습니다. +- 서버/게임 저장 파일 상태에 게임모드가 추가되었습니다. +- 안드로이드에 새로운 파일선택기가 추가되고, 안드로이드 10에서 파일 접근 오류를 해결했습니다. +- 이제 코어의 최대 자원 보관량은 코어에 컨테이너 혹은 창고를 붙여 건설하는 것으로 증가가 가능합니다. +- 언로더가 이제 포탑을 뺀 모든 블럭에서 자원을 추출가능합니다. +- 투표 추방 기능이 좀 더 예민하게 바뀌었습니다. +- 많은 오류를 해결했습니다. diff --git a/fastlane/metadata/android/ko-KR/changelogs/94.txt b/fastlane/metadata/android/ko-KR/changelogs/94.txt new file mode 100644 index 0000000000..9f9884e549 --- /dev/null +++ b/fastlane/metadata/android/ko-KR/changelogs/94.txt @@ -0,0 +1,8 @@ +- PC의 튜토리얼이 안드로이드에 나타나는 오류를 해결했습니다. +- 일반적인 상태 효과와 관련되어 팅기는 오류를 해결했습니다. +- 발사대가 코어의 모든 자원을 출격시키는 오류를 해결했습니다. +- 새로운 맵이 오래된 맵을 덮어쓸 때 경고가 표시되지 않는 오류를 해결했습니다. +- 메타 컨베이어가 전력이 부족할 때도 작동하는 오류를 해결했습니다. +- 다이얼로그가 잘못된 내용을 표시하는 오류를 해결했습니다. +- 일부 팅기는 오류를 해결했습니다. +- 분배기의 역류제거가 롤백되었습니다. diff --git a/fastlane/metadata/android/ko-KR/changelogs/95.txt b/fastlane/metadata/android/ko-KR/changelogs/95.txt new file mode 100644 index 0000000000..6d56411169 --- /dev/null +++ b/fastlane/metadata/android/ko-KR/changelogs/95.txt @@ -0,0 +1,13 @@ +- 지역 점수를 불러오는 과정에서 생기는 오류 해결 +- [안드로이드] 파일선택기가 예전 버전으로 롤백되었습니다. +* 바뀌지 않은 기기가 있을 수도 있습니다. +- 유닛 경로 선택이 이제 멀티스레드로 작업합니다. +- 이제 생존 모드일 때 지휘소에서 공격명령을 내릴 경우 유닛들이 적 소환지점으로 이동합니다. +- 이제 투표로 추방당한 유저는 일정시간 해당 서버에 접속하지 못합니다. +- 지휘소에서 '순찰' 명령이 '집합' 명령으로 교체되었습니다. +- 안드로이드 키보드 기능이 추가되었습니다. 해당 기능이 활성화될 경우 대부분의 터치 기능들은 비활성화되고, 대신 키보드를 사용하여 조작할 수 있습니다. +- [Pc] 설계중일 때 방향을 회전시키는 기능이 추가되었습니다. [유저 Synray가 개발에 기여했습니다.] +- 투표추방 버튼이 추가되었습니다. +- 전력 상태 그래프에 전력 저장량이 추가되었습니다. +- 장갑 컨베이어들이 추가되었습니다. 기능 : 티타늄 컨베이어보다 더 많은 체력이 있지만, 컨베이어가 아닌 블럭이 옆에서 자원을 보낼 경우 그 자원을 받지 않습니다. +- 메모 블럭이 추가되었습니다. 기능 : 글을 적을 수 있습니다! diff --git a/fastlane/metadata/android/ko-KR/changelogs/99.6.txt b/fastlane/metadata/android/ko-KR/changelogs/99.6.txt new file mode 100644 index 0000000000..ca8395b39a --- /dev/null +++ b/fastlane/metadata/android/ko-KR/changelogs/99.6.txt @@ -0,0 +1 @@ +- 이제 안드로이드에서도 설계도 기능을 지원합니다. 건물들을 복사하여 설계도를 만들고 붙여넣어 보세요! diff --git a/fastlane/metadata/android/ko-KR/full_description.txt b/fastlane/metadata/android/ko-KR/full_description.txt new file mode 100644 index 0000000000..106409b4e8 --- /dev/null +++ b/fastlane/metadata/android/ko-KR/full_description.txt @@ -0,0 +1,16 @@ +민더스트리 Mindustry는 샌드박스형 타워디펜스 게임입니다. 정교한 컨베이어 벨트 공급망을 만들어 포탑에 탄약을 공급하고 건물에 사용할 재료를 생산하여 적의 공격으로부터 기지를 방어하십시오. 이 게임은 크로스플랫폼입니다. 데스크탑, 안드로이드, IOS, 리눅스 등 다양한 플랫폼을 지원합니다. 또한 멀티플레이어도 지원하므로, 대형 혹은 어려운 맵에서 협동을 통해 같이 플레이하시거나 팀 pvp를 통해 실력을 자랑해 보세요. + + +포함된 것들 : +- 24개의 맵들 +- 캠페인, 연구 기록, 잠겨진 지역들과 같은 해금 요소! +- 당신을 파괴하기 위한 강력한 보스 +- 전력, 액체, 자원 등의 수송 시스템 +- 19가지의 드론, 유닛, 플레이어 기체들 +- 120종류가 넘는 블럭들 +- 75가지가 넘는 환경 타일 및 블럭들 +- 크로스 플랫폼 : 데스크탑, IOS, 안드로이드, 리눅스 모든 플랫폼은 멀티가 가능합니다. +- 자유로운 멀티플레이어 : 로컬 멀티플레이어, 서버, VPN 등을 통해 자유로운 멀티플레이가 가능합니다! +- 사용자 정의 게임 규칙 : 블럭 재료 변경, 적 스텟 변경, 단계 대기시간 변경등 규칙 변경을 통해 어려운 모드에 도전해보시거나 쉽게 플레이해보세요. +- 다양한 기능이 있는 맵 에디터, 작업 도구들을 이용해 맵을 무작위로 생성하거나 아름답게 꾸며 보세요. 인-게임 에디터에서 멀티플레이어를 통해 친구와 같이 맵을 만들수도 있습니다! +- 모드 : 새로운 모드를 제작하여 새로운 유닛, 블럭, 타일 등 자유로운 커스터마이징이 가능합니다. diff --git a/fastlane/metadata/android/ko-KR/short_description.txt b/fastlane/metadata/android/ko-KR/short_description.txt new file mode 100644 index 0000000000..2990a8dd79 --- /dev/null +++ b/fastlane/metadata/android/ko-KR/short_description.txt @@ -0,0 +1 @@ +공장에 기반한 샌드박스형 타워디펜스 게임입니다! diff --git a/fastlane/metadata/android/ko-KR/summary.txt b/fastlane/metadata/android/ko-KR/summary.txt new file mode 100644 index 0000000000..757ae13cbc --- /dev/null +++ b/fastlane/metadata/android/ko-KR/summary.txt @@ -0,0 +1 @@ +공장에 기반한 샌드박스 타워디펜스 게임입니다! diff --git a/fastlane/metadata/android/ko-KR/title.txt b/fastlane/metadata/android/ko-KR/title.txt new file mode 100644 index 0000000000..e2842b447a --- /dev/null +++ b/fastlane/metadata/android/ko-KR/title.txt @@ -0,0 +1 @@ +Mindustry diff --git a/fastlane/metadata/steam/english/description.txt b/fastlane/metadata/steam/english/description.txt index 8e0d524ea3..ff9dfca4d7 100644 --- a/fastlane/metadata/steam/english/description.txt +++ b/fastlane/metadata/steam/english/description.txt @@ -28,6 +28,7 @@ Create elaborate supply chains of conveyor belts to feed ammo into your turrets, [h2][h2]Gamemodes[/h2][/h2] +[list] [*] [b]Survival[/b]: Build turrets to defend from enemies in tower-defense based gameplay. Survive as long as possible, optionally launching your core to use your collected resources for research. Prepare your base for intermittent attacks from airborne bosses. [*] [b]Attack[/b]: Build factories for units to destroy the enemy cores, while simultaneously defending your base from waves of enemy units. Create a variety of different types of support and offensive unit to assist you in your goals. [*] [b]PvP[/b]: Compete with other players on up to 4 different teams to destroy each other's cores. Create units, or attack other bases directly with your mechs. diff --git a/fastlane/metadata/steam/korean/achievements.vdf b/fastlane/metadata/steam/korean/achievements.vdf new file mode 100644 index 0000000000..4d274ee96b --- /dev/null +++ b/fastlane/metadata/steam/korean/achievements.vdf @@ -0,0 +1,109 @@ +"lang" +{ + "Language" "korean" + "Tokens" + { + "NEW_ACHIEVEMENT_20_0_NAME" "인증된 플레이어" + "NEW_ACHIEVEMENT_20_0_DESC" "튜토리얼을 수료하세요." + "NEW_ACHIEVEMENT_20_1_NAME" "분쇄자" + "NEW_ACHIEVEMENT_20_1_DESC" "적 유닛을 1000기 사살하세요" + "NEW_ACHIEVEMENT_20_2_NAME" "파괴자" + "NEW_ACHIEVEMENT_20_2_DESC" "적 유닛을 100,000기 사살하세요." + "NEW_ACHIEVEMENT_20_3_NAME" "공중 교통 시스템" + "NEW_ACHIEVEMENT_20_3_DESC" "자원을 총 10,000개 출격시키세요." + "NEW_ACHIEVEMENT_20_5_NAME" "무한의 배달부" + "NEW_ACHIEVEMENT_20_5_DESC" "자원을 총 1,000,000개 출격시키세요." + "NEW_ACHIEVEMENT_20_6_NAME" "정복자" + "NEW_ACHIEVEMENT_20_6_DESC" "캠페인의 미션:적 코어 파괴인 지역에서 10번 승리하세요." + "NEW_ACHIEVEMENT_20_7_NAME" "챔피언" + "NEW_ACHIEVEMENT_20_7_DESC" "멀티플레이어 PvP 매치에서 10번 승리하세요." + "NEW_ACHIEVEMENT_20_8_NAME" "진격!" + "NEW_ACHIEVEMENT_20_8_DESC" "캠페인의 미션:적 코어 파괴인 지역에서 5단계 이상일 때 적의 코어를 파괴하세요." + "NEW_ACHIEVEMENT_20_9_NAME" "하늘에서 코어의 비가 쏟아진다!" + "NEW_ACHIEVEMENT_20_9_DESC" "캠페인 지역에 30번 도전하세요." + "NEW_ACHIEVEMENT_20_10_NAME" "끈질긴" + "NEW_ACHIEVEMENT_20_10_DESC" "100 단계를 생존하세요." + "NEW_ACHIEVEMENT_20_11_NAME" "바퀴벌레" + "NEW_ACHIEVEMENT_20_11_DESC" "500 단계를 생존하세요." + "NEW_ACHIEVEMENT_20_12_NAME" "연구원" + "NEW_ACHIEVEMENT_20_12_DESC" "연구 기록의 모든 것을 연구하세요" + "NEW_ACHIEVEMENT_20_13_NAME" "형상변환자" + "NEW_ACHIEVEMENT_20_13_DESC" "캠페인 지역에서 모든 기체로 변신하여 모든 기체를 해금하세요." + "NEW_ACHIEVEMENT_20_14_NAME" "과충전" + "NEW_ACHIEVEMENT_20_14_DESC" "물에 젖은 적을 전기로 지져버리세요." + "NEW_ACHIEVEMENT_20_15_NAME" "무지개 반사" + "NEW_ACHIEVEMENT_20_15_DESC" "적의 탄환을 반사해서 적을 사살하세요." + "NEW_ACHIEVEMENT_20_17_NAME" "한 중대한 실수" + "NEW_ACHIEVEMENT_20_17_DESC" "분배기를 연구하세요." + "NEW_ACHIEVEMENT_20_18_NAME" "창조" + "NEW_ACHIEVEMENT_20_18_DESC" "블럭 10,000를 설치하세요." + "NEW_ACHIEVEMENT_20_19_NAME" "잿더미" + "NEW_ACHIEVEMENT_20_19_DESC" "적 블럭을 1,000개 파괴하세요." + "NEW_ACHIEVEMENT_20_20_NAME" "폭발은 예술이다!" + "NEW_ACHIEVEMENT_20_20_DESC" "토륨 원자로를 폭발시키세요." + "NEW_ACHIEVEMENT_20_21_NAME" "맵퍼" + "NEW_ACHIEVEMENT_20_21_DESC" "새로운 맵을 10개 만드세요." + "NEW_ACHIEVEMENT_20_22_NAME" "브라우저" + "NEW_ACHIEVEMENT_20_22_DESC" "워크샵에서 맵을 1개 내려받으세요." + "NEW_ACHIEVEMENT_20_23_NAME" "Mindustry 크리에이터" + "NEW_ACHIEVEMENT_20_23_DESC" "워크샵에 맵을 1개 올리세요." + "NEW_ACHIEVEMENT_20_24_NAME" "슬레이어" + "NEW_ACHIEVEMENT_20_24_DESC" "보스를 처치하세요." + "NEW_ACHIEVEMENT_20_25_NAME" "탐험가" + "NEW_ACHIEVEMENT_20_25_DESC" "캠페인의 모든 지역을 해금하세요." + "NEW_ACHIEVEMENT_20_26_NAME" "완벽주의자" + "NEW_ACHIEVEMENT_20_26_DESC" "모든 캠페인 지역에서 시작자원 설정 기능을 해금시키세요." + "NEW_ACHIEVEMENT_20_29_NAME" "자원 연구 II" + "NEW_ACHIEVEMENT_20_29_DESC" "토륨을 해금하세요." + "NEW_ACHIEVEMENT_20_31_NAME" "자원 연구 I" + "NEW_ACHIEVEMENT_20_31_DESC" "티타늄을 해금하세요." + "NEW_ACHIEVEMENT_21_0_NAME" "공포의 자폭 분대" + "NEW_ACHIEVEMENT_21_0_DESC" "당신의 기체를 폭발성이 있는 자원으로 채우고 사망하여 폭발을 일으키세요." + "NEW_ACHIEVEMENT_21_1_NAME" "이제 시작이야" + "NEW_ACHIEVEMENT_21_1_DESC" "대거 공장을 건설하세요." + "NEW_ACHIEVEMENT_21_2_NAME" "폭격 명령" + "NEW_ACHIEVEMENT_21_2_DESC" "지휘소에서 공격 명령을 내리세요." + "NEW_ACHIEVEMENT_21_3_NAME" "물량" + "NEW_ACHIEVEMENT_21_3_DESC" "100기의 유닛을 한 게임에서 활성화시키세요." + "NEW_ACHIEVEMENT_21_4_NAME" "추종자들" + "NEW_ACHIEVEMENT_21_4_DESC" "팬텀 건설 드론을 한 게임에서 10기 활성화시키세요." + "NEW_ACHIEVEMENT_21_5_NAME" "예민한 군대" + "NEW_ACHIEVEMENT_21_5_DESC" "크롤러 50기를 한 게임에서 활성화시키세요." + "NEW_ACHIEVEMENT_21_6_NAME" "군단" + "NEW_ACHIEVEMENT_21_6_DESC" "유닛을 총 1000기 생산하세요." + "NEW_ACHIEVEMENT_21_7_NAME" "강력한" + "NEW_ACHIEVEMENT_21_7_DESC" "캠페인 지역에서 S 랭크를 획득하세요." + "NEW_ACHIEVEMENT_21_8_NAME" "매우 강력한!" + "NEW_ACHIEVEMENT_21_8_DESC" "캠페인 지역에서 SS 랭크를 획득하세요." + "NEW_ACHIEVEMENT_21_9_NAME" "당신은 사시입니다." + "NEW_ACHIEVEMENT_21_9_DESC" "적 소환 구역에서 사망하세요." + "NEW_ACHIEVEMENT_21_10_NAME" "제발 Shift 버튼좀 눌러" + "NEW_ACHIEVEMENT_21_10_DESC" "익사하세요, 어떻게든" + "NEW_ACHIEVEMENT_21_11_NAME" "수집가" + "NEW_ACHIEVEMENT_21_11_DESC" "캠페인 지역에서 코어에 넣을 수 있는 자원을 최대치로 넣으세요." + "NEW_ACHIEVEMENT_21_12_NAME" "왕관" + "NEW_ACHIEVEMENT_21_12_DESC" "서버를 열고 10명 이상의 플레이어를 유지하세요." + "NEW_ACHIEVEMENT_21_13_NAME" "진입 불가" + "NEW_ACHIEVEMENT_21_13_DESC" "멜트다운과 스펙터를 건설하세요." + "NEW_ACHIEVEMENT_21_14_NAME" "출격!" + "NEW_ACHIEVEMENT_21_14_DESC" "발사대를 사용하세요." + "NEW_ACHIEVEMENT_21_15_NAME" "성급한" + "NEW_ACHIEVEMENT_21_15_DESC" "2단계 이상을 스킵하고, 당신의 코어를 적에게 파괴당하세요." + "NEW_ACHIEVEMENT_21_16_NAME" "2단" + "NEW_ACHIEVEMENT_21_16_DESC" "분배기를 2개 붙여서 건설하세요." + "NEW_ACHIEVEMENT_21_17_NAME" "고독한 수호자" + "NEW_ACHIEVEMENT_21_17_DESC" "캠페인 지역에서 10단계 이상을 아무 블럭도 설치하지 않고 생존하세요." + "NEW_ACHIEVEMENT_21_18_NAME" "인화성" + "NEW_ACHIEVEMENT_21_18_DESC" "포탑에 파이라타이트를 사용하세요." + "NEW_ACHIEVEMENT_21_19_NAME" "효율성" + "NEW_ACHIEVEMENT_21_19_DESC" "포탑을 물 혹은 냉각수를 사용하여 가속하세요." + "NEW_ACHIEVEMENT_21_20_NAME" "클래식 모드" + "NEW_ACHIEVEMENT_21_20_DESC" "픽셀화를 활성화시키세요." + "NEW_ACHIEVEMENT_21_21_NAME" "학자" + "NEW_ACHIEVEMENT_21_21_DESC" "게임내에서 위키를 여세요." + "NEW_ACHIEVEMENT_21_22_NAME" "힘찬 시작" + "NEW_ACHIEVEMENT_21_22_DESC" "캠페인 지역을 10000개 혹은 그 이상의 시작자원을 설정하고 시작하세요." + "NEW_ACHIEVEMENT_21_23_NAME" "점화" + "NEW_ACHIEVEMENT_21_23_DESC" "핵융합로를 활성화시키세요." + } +} diff --git a/fastlane/metadata/steam/korean/description.txt b/fastlane/metadata/steam/korean/description.txt new file mode 100644 index 0000000000..129c98613b --- /dev/null +++ b/fastlane/metadata/steam/korean/description.txt @@ -0,0 +1,60 @@ + 정교한 컨베이어 시스템을 설계하여 포탑의 탄약을 준비하고, 건물에 재료를 공급하여 당신의 구조물을 적으로부터 방어하세요. 크로스플랫폼 멀티플레이어 기능을 이용하여 친구와 협동하여 플레이하거나 팀 기반 PvP가 가능합니다. + +[img]{STEAM_APP_IMAGE}/extras/ezgif-4-0e70c282f775.gif[/img] + +[h2]게임플레이[/h2] + +[list] +[*] 드릴을 설치해 자원을 채광하고 컨베이어를 사용하여 자원을 코어로 옮기세요. +[*] 생산 건물을 사용하여 고급 자원을 조합하세요. +[*] 드론을 생산하여 자원을 자동으로 채광하거나, 당신의 기지 보호를 돕게끔 해보세요. +[*] 화재가 났을때 액체를 사용해보세요. +[*] 액체를 활용하여 공장을 활성화하고, 포탑을 가속하거나, 발전기를 냉각해보세요. +[/list] + +[h2]캠페인[/h2] + +[list] +[*] 재도전 가능한 12개의 지역을 무작위 시작 위치에서 도전해보세요. +[*] 자원들을 출격시켜서 모으세요. +[*] 고급 연료의 사용을 위해 새로운 블럭을 연구하세요. +[*] 캠페인 지역에서 일정 조건을 달성시 각 지역의 시작자원을 편집할 수 있습니다. +[*] 다양한 지역 임무가 준비되어 있습니다. +[*] 친구를 초대해 지역을 같이 클리어할 수 있습니다. +[*] 120개가 넘는 블럭들을 연구해보세요. +[*] 19가지 종류의 드론, 유닛, 기체들이 준비되어 있습니다. +[*] 50개가 넘는 도전과제들을 달성해보세요. +[/list] + +[h2][h2]게임모드[/h2][/h2] + +[*] [b]생존[/b]: 포탑을 건설하고, 적의 공격을 방어하는 기본적인 타워디펜스 모드입니다. 더욱 길게 생존하여 연구하기 위한 자원을 모으고 출격하는 것도 가능합니다. 공중 보스의 기습 공격에 대비하세요. +[*] [b]공격[/b]: 공장을 건설하여 적의 코어를 파괴하기 위한 유닛들을 생산하고, 동시에 적의 유닛을 방어하기 위한 방어건물도 건설하세요. 당신의 목표를 돕기 위한 다양한 유닛들을 생산하세요. +[*] [b]PvP[/b]: 당신을 빼고 총 4개의 팀과의 경쟁이 가능합니다. 다른 팀의 코어를 부숴 승리를 거머쥐세요. 유닛을 생성하고, 당신의 기체를 활용해 적의 기지를 공격하세요. +[*] [b]샌드박스[/b]: 무한한 자원을 사용하여 자유롭게 건설이 가능합니다. 무한 자원, 전기, 액체와 같은 샌드박스 모드 전용의 블럭들이 준비되어 있으며, 적들은 당신이 요구하기 전까지 출현하지 않습니다. 궁금한 것들을 마음껏 실험해보세요. +[/list] + +[h2]사용자 정의 게임 & 크로스플랫폼 멀티플레이어[/h2] + +[list] +[*] 캠페인에 더하여 12개의 추가적인 맵들이 준비되어 있습니다. +[*] 생존, PvP, 샌드박스 등을 플레이해보세요! +[*] 유저들이 운영하는 공개되어있는 공용서버에 접속하거나, 당신만의 비공개서버를 만들고 친구들을 초대해보세요. +[*] 자유로운 게임 규칙: 블럭의 재료 요구량 변경, 적의 능력 수치변경, 시작자원 변경, 단계 대기시간 변경 등 많은 것을 직접 설정할 수 있습니다. +[*] 게임모드 혼합!: PvP와 PvE를 합쳐 새로운 컨텐츠를 만들어보세요. +[/list] + +[h2]사용자 정의 맵 에디터[/h2] + +[list] +[*] 에디터 ui를 사용하여 지형을 그려보세요. +[*] 인-게임 에디터를 사용하여 맵 미리보기와 수정도 가능합니다. +[*] 자유로운 도구 활용: 편집 도구의 모드를 바꿔 사용이 가능합니다. +[*] 다양한 타입의 필터와 지형 생성 조건을 설정하고, 강력한 맵 생성 시스템을 사용하여 맵을 만들어보세요. +[*] 뿌리기, 왜곡, 매끄러움, 침식, 균형, 자원 생성 그리고 지형 무작위 생성 등을 당신의 맵에 적용해보세요. +[*] 자원, 강, 사막, 포자지대 등 지형을 무작위로 생성해보세요. +[*] 소환되는 적들도 에디터 내의 맵 규칙에서 편집이 가능합니다! +[*] 맵을 제작한 뒤에는 맵을 추출하여 파일로 공유하거나 워크샵에도 올릴 수 있습니다. +[*] 맵의 규칙을 내 마음대로 바꿔보세요. +[*] 75개가 넘는 지형 타일, 블럭이 준비되어있습니다. +[/list] diff --git a/fastlane/metadata/steam/korean/short-description.txt b/fastlane/metadata/steam/korean/short-description.txt new file mode 100644 index 0000000000..45fb3d476a --- /dev/null +++ b/fastlane/metadata/steam/korean/short-description.txt @@ -0,0 +1 @@ +자원 관리에 초점을 맞춘 엔드리스 타워디펜스 게임입니다. diff --git a/fastlane/metadata/steam/portuguese-brazil/achievements.vdf b/fastlane/metadata/steam/portuguese-brazil/achievements.vdf new file mode 100644 index 0000000000..caa3a26319 --- /dev/null +++ b/fastlane/metadata/steam/portuguese-brazil/achievements.vdf @@ -0,0 +1,109 @@ +"lang" +{ + "Language" "portuguese-brazil" + "Tokens" + { + "NEW_ACHIEVEMENT_20_0_NAME" "Verificado" + "NEW_ACHIEVEMENT_20_0_DESC" "Complete o tutorial" + "NEW_ACHIEVEMENT_20_1_NAME" "Sucateiro" + "NEW_ACHIEVEMENT_20_1_DESC" "Destrua 1000 unidades inimigas." + "NEW_ACHIEVEMENT_20_2_NAME" "Expurgo" + "NEW_ACHIEVEMENT_20_2_DESC" "Destrua 100.000 unidades inimigas." + "NEW_ACHIEVEMENT_20_3_NAME" "Transporte atmosférico" + "NEW_ACHIEVEMENT_20_3_DESC" "Lance 10.000 itens no total." + "NEW_ACHIEVEMENT_20_5_NAME" "Transportes Sem Fim" + "NEW_ACHIEVEMENT_20_5_DESC" "Lance 1.000.000 itens no total." + "NEW_ACHIEVEMENT_20_6_NAME" "Conquistador" + "NEW_ACHIEVEMENT_20_6_DESC" "Vença 10 partidas no modo de ataque." + "NEW_ACHIEVEMENT_20_7_NAME" "Campeão" + "NEW_ACHIEVEMENT_20_7_DESC" "Vença 10 partidas PvP multi-jogador." + "NEW_ACHIEVEMENT_20_8_NAME" "Blitz" + "NEW_ACHIEVEMENT_20_8_DESC" "Destrua o núcleo inimigo na zona de ataque em 5 hordas ou menos." + "NEW_ACHIEVEMENT_20_9_NAME" "Chuva de núcleos" + "NEW_ACHIEVEMENT_20_9_DESC" "Lance seu núcleo em uma zona 10 vezes." + "NEW_ACHIEVEMENT_20_10_NAME" "Persistente" + "NEW_ACHIEVEMENT_20_10_DESC" "Sobreviva 100 hordas" + "NEW_ACHIEVEMENT_20_11_NAME" "Invicto" + "NEW_ACHIEVEMENT_20_11_DESC" "Sobreviva 500 hordas." + "NEW_ACHIEVEMENT_20_12_NAME" "Pesquisador" + "NEW_ACHIEVEMENT_20_12_DESC" "Pesquise tudo." + "NEW_ACHIEVEMENT_20_13_NAME" "Metamorfose Ambulante" + "NEW_ACHIEVEMENT_20_13_DESC" "Desbloqueie e transforme-se em todos os mechas no jogo." + "NEW_ACHIEVEMENT_20_14_NAME" "Sobrecarga" + "NEW_ACHIEVEMENT_20_14_DESC" "Atinja um inimigo coberto de água com eletricidade." + "NEW_ACHIEVEMENT_20_15_NAME" "Deflexão" + "NEW_ACHIEVEMENT_20_15_DESC" "Destrua uma unidade com suas proprias balas refletidas." + "NEW_ACHIEVEMENT_20_17_NAME" "Um Erro Grave" + "NEW_ACHIEVEMENT_20_17_DESC" "Pesquise o roteador." + "NEW_ACHIEVEMENT_20_18_NAME" "Crie" + "NEW_ACHIEVEMENT_20_18_DESC" "Coloque 10.000 blocos." + "NEW_ACHIEVEMENT_20_19_NAME" "Arraso" + "NEW_ACHIEVEMENT_20_19_DESC" "Destrua 1.000 blocos inimigos." + "NEW_ACHIEVEMENT_20_20_NAME" "Um desastre espetacular." + "NEW_ACHIEVEMENT_20_20_DESC" "Faça com que um reator de tório superaqueça e exploda." + "NEW_ACHIEVEMENT_20_21_NAME" "Cartógrafo" + "NEW_ACHIEVEMENT_20_21_DESC" "Faça um mapa novo 10 vezes." + "NEW_ACHIEVEMENT_20_22_NAME" "Navegador" + "NEW_ACHIEVEMENT_20_22_DESC" "Baixe um mapa da Oficina." + "NEW_ACHIEVEMENT_20_23_NAME" "Criador" + "NEW_ACHIEVEMENT_20_23_DESC" "Publique um mapa na Oficina." + "NEW_ACHIEVEMENT_20_24_NAME" "Matador" + "NEW_ACHIEVEMENT_20_24_DESC" "Derrote um chefe." + "NEW_ACHIEVEMENT_20_25_NAME" "Explorador" + "NEW_ACHIEVEMENT_20_25_DESC" "Desbloqueie todas as zonas na campanha." + "NEW_ACHIEVEMENT_20_26_NAME" "Completador" + "NEW_ACHIEVEMENT_20_26_DESC" "Alcance a horda requerida para configuração em todas as zonas." + "NEW_ACHIEVEMENT_20_29_NAME" "Material II" + "NEW_ACHIEVEMENT_20_29_DESC" "Desbloqueie Tório." + "NEW_ACHIEVEMENT_20_31_NAME" "Material I" + "NEW_ACHIEVEMENT_20_31_DESC" "Desbloqueie Titânio." + "NEW_ACHIEVEMENT_21_0_NAME" "Kamikaze" + "NEW_ACHIEVEMENT_21_0_DESC" "Encha o seu mecha com materiais explosivos e morra, criando uma explosão." + "NEW_ACHIEVEMENT_21_1_NAME" "Assim Começa" + "NEW_ACHIEVEMENT_21_1_DESC" "Construa uma fábrica de Dagger." + "NEW_ACHIEVEMENT_21_2_NAME" "Ataque direto" + "NEW_ACHIEVEMENT_21_2_DESC" "Emita o comando de Ataque usando o Centro de Comando." + "NEW_ACHIEVEMENT_21_3_NAME" "Enchame" + "NEW_ACHIEVEMENT_21_3_DESC" "Tenha 100 unidades ativas ao mesmo tempo." + "NEW_ACHIEVEMENT_21_4_NAME" "Rebanho" + "NEW_ACHIEVEMENT_21_4_DESC" "Tenha 10 drones Phantom ativos ao mesmo tempo." + "NEW_ACHIEVEMENT_21_5_NAME" "Exército Volátil" + "NEW_ACHIEVEMENT_21_5_DESC" "Tenha 50 unidades Crawler ativas ao mesmo tempo." + "NEW_ACHIEVEMENT_21_6_NAME" "Legiões" + "NEW_ACHIEVEMENT_21_6_DESC" "Construa 1000 unidades no total." + "NEW_ACHIEVEMENT_21_7_NAME" "Super" + "NEW_ACHIEVEMENT_21_7_DESC" "Conquiste o rank S em qualquer zona." + "NEW_ACHIEVEMENT_21_8_NAME" "Super Super" + "NEW_ACHIEVEMENT_21_8_DESC" "Conquiste o rank SS em qualquer zona." + "NEW_ACHIEVEMENT_21_9_NAME" "Você Devia Ter Escutado" + "NEW_ACHIEVEMENT_21_9_DESC" "Morra na zona de exclusão do ponto de spawn." + "NEW_ACHIEVEMENT_21_10_NAME" "Só Aperte Shift" + "NEW_ACHIEVEMENT_21_10_DESC" "Afogue, de algum modo." + "NEW_ACHIEVEMENT_21_11_NAME" "Colecionador" + "NEW_ACHIEVEMENT_21_11_DESC" "Encha o núcleo até a capacidade máxima com todos os tipos de materiais." + "NEW_ACHIEVEMENT_21_12_NAME" "Galera" + "NEW_ACHIEVEMENT_21_12_DESC" "Hospede um servidor com 10 pessoas nele." + "NEW_ACHIEVEMENT_21_13_NAME" "Invulnerável" + "NEW_ACHIEVEMENT_21_13_DESC" "Construa o Meltdown e o Spectre." + "NEW_ACHIEVEMENT_21_14_NAME" "Decolagem" + "NEW_ACHIEVEMENT_21_14_DESC" "Use a Plataforma de Lançamento." + "NEW_ACHIEVEMENT_21_15_NAME" "Complacência" + "NEW_ACHIEVEMENT_21_15_DESC" "Pule o lançamento duas vezes, então tenha o seu núcleo destruído pelo inimigo." + "NEW_ACHIEVEMENT_21_16_NAME" "Heresia" + "NEW_ACHIEVEMENT_21_16_DESC" "Construa dois roteadores, um do lado do outro." + "NEW_ACHIEVEMENT_21_17_NAME" "Guardião Solitário" + "NEW_ACHIEVEMENT_21_17_DESC" "Sobreviva 10 hordas em qualquer zona, sem colocar qualquer bloco." + "NEW_ACHIEVEMENT_21_18_NAME" "Incinere" + "NEW_ACHIEVEMENT_21_18_DESC" "Use Piratita em qualquer torreta." + "NEW_ACHIEVEMENT_21_19_NAME" "Eficiência" + "NEW_ACHIEVEMENT_21_19_DESC" "Refirgere uma torreta com água ou crio fluido." + "NEW_ACHIEVEMENT_21_20_NAME" "Modo Clássico" + "NEW_ACHIEVEMENT_21_20_DESC" "Habilite pixelização." + "NEW_ACHIEVEMENT_21_21_NAME" "Sábio" + "NEW_ACHIEVEMENT_21_21_DESC" "Abra a Wiki do jogo." + "NEW_ACHIEVEMENT_21_22_NAME" "Vantagem" + "NEW_ACHIEVEMENT_21_22_DESC" "Entre em uma zona com 10.000 itens ou mais já configurados." + "NEW_ACHIEVEMENT_21_23_NAME" "Ignição" + "NEW_ACHIEVEMENT_21_23_DESC" "Ligue um Reator de Impacto." + } +} diff --git a/fastlane/metadata/steam/portuguese-brazil/description.txt b/fastlane/metadata/steam/portuguese-brazil/description.txt new file mode 100644 index 0000000000..0efa240dc0 --- /dev/null +++ b/fastlane/metadata/steam/portuguese-brazil/description.txt @@ -0,0 +1,61 @@ +Crie correntes de suprimentos elaboradas com correias transportadoras para alimentar suas torretas com munição, produza minerais para usar em construção, e defenda suas estruturas de hordas inimigas. Jogue com seus amigos em jogos cooperativos multi-jogadores multi-plataformas, ou desafie-os em partidas PvP de times. + +[img]{STEAM_APP_IMAGE}/extras/ezgif-4-0e70c282f775.gif[/img] + +[h2]Gameplay[/h2] + +[list] +[*] Crie brocas e correntes transportadoras para mover recursos para o seu Núcleo. +[*] Use blocos de produção para criar materiais avançados. +[*] Construa drones para minerar recursos automaticamente, ajudar na construção e proteger a sua base. +[*] Distribua líquidos e enfrente surtos de fogo. +[*] Melhore a produção suprimindo refrigerantes e lubrificantes opcionais para os seus blocos de defesa e produção. +[/list] + +[h2]Campanha[/h2] + +[list] +[*] Avance através de 12 zonas re-jogáveis com pontos de spawn aleatórios +[*] Colete e lance recursos +[*] Pesquise novos blocos para abastecer o progresso +[*] Configure loadout antes do lançamento para levar recursos para cada zona +[*] Variedade de missões com objetivos e metas +[*] Convide seus amigos para completar missões juntos +[*] Mais de 120 blocos de tecnologia para dominar +[*] 19 tipos de drones, mechas e naves diferentes +[*] Mais de 50 conquistas para completar +[/list] + +[h2][h2]Modos de jogo[/h2][/h2] + +[list] +[*] [b]Sobrevivência[/b]: Construa torretas para defender de inimigos no gameplay de tower-defense. Sobreviva o máximo possível, opcionalmente lançando o seu núcleo para usar os recursos coletados para pesquisa. Prepare a sua base para ataques intermitentes de chefes aéreos. +[*] [b]Ataque[/b]: Construa fábricas para unidades destruírem núcleos inimidos, enquanto simultaneamente defendendo sua base de hordas de unidades inimigas. Crie uma variedade de tipos diferentes de unidades de suporte o defesa para auxiliar você em seus objetivos. +[*] [b]PvP[/b]: Dispute com outros jogadores em até 4 times diferentes, para destruir o núcleo dos outros. Crie unidades, ou ataque outras bases diretamente com seus mechas. +[*] [b]Sandbox[/b]: Brinque com recursos infinitos e sem ameaça inimiga. Use itens específicos do modo e fontes de líquidos para testar designs, e sumone inimigos à vontade. +[/list] + +[h2]Jogos Personalizados & Multi-jogador Multi-plataforma[/h2] + +[list] +[*] 12 mapas embutidos para jogos personalizados, além da campanha +[*] Jogue Cooperativo, PvP, ou sandbox +[*] Entre em um servidor público dedicado, ou convide amigos para a sua própria sessão privada +[*] Regras do jogo personalizáveis: Mude custo dos blocos, estatísticas de inimigos, itens iniciais, tempo entre as hordas e mais +[*] Misture modos de jogo: Combine modos de jogo PvP e PvE +[/list] + +[h2]Editor de mapa[/h2] + +[list] +[*] Pinte terreno com um editor +[*] Edite e visualize estruturas em jogo +[*] Modos de ferramentas configuráveis: Mude como cada ferramenta funciona +[*] Sistema gerador de mapa poderoso, com muitos tipos diferentes de filtros para manipulação procedural de terreno +[*] Aplique ruído, distorção, suavização, erosão, simetria, geração de minérios e terreno aleatório aos seus mapas +[*] Aleatorize e configure geração de minérios, assim como localização de rios e recursos +[*] Configure o layout de hordas inimigas +[*] Compartilhe mapas exportados na Oficina da Steam +[*] Modifique regras básicas do mapa +[*] Use mais de 75 blocos de ambientação diferentes +[/list] diff --git a/fastlane/metadata/steam/portuguese-brazil/short-description.txt b/fastlane/metadata/steam/portuguese-brazil/short-description.txt new file mode 100644 index 0000000000..c6ad92da31 --- /dev/null +++ b/fastlane/metadata/steam/portuguese-brazil/short-description.txt @@ -0,0 +1 @@ +Um jogo de fim aberto de tower-defense com um foco em gerenciamento de recursos. diff --git a/gradle.properties b/gradle.properties index cbc49eb9de..a7d2f776c4 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,3 +1,3 @@ org.gradle.daemon=true org.gradle.jvmargs=-Xms256m -Xmx1024m -archash=6ca636f2f51352022b2c770deafc3b549eb0421c +archash=e9f5ea632c36a9890d6a96c7e9f1cef62ad92b54 diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar index 94336fcae9..5c2d1cf016 100644 Binary files a/gradle/wrapper/gradle-wrapper.jar and b/gradle/wrapper/gradle-wrapper.jar differ diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index b0acbdcd73..6ce793f21e 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,5 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-5.5-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-6.0-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/gradlew b/gradlew index 383f0901c9..8e25e6c19d 100755 --- a/gradlew +++ b/gradlew @@ -1,4 +1,20 @@ -#!/usr/bin/env bash +#!/usr/bin/env sh + +# +# Copyright 2015 the original author or authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ############################################################################## ## @@ -28,7 +44,7 @@ APP_NAME="Gradle" APP_BASE_NAME=`basename "$0"` # Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -DEFAULT_JVM_OPTS="" +DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' # Use the maximum available, or set MAX_FD != -1 to use that value. MAX_FD="maximum" diff --git a/gradlew.bat b/gradlew.bat index e95643d6a2..9618d8d960 100644 --- a/gradlew.bat +++ b/gradlew.bat @@ -1,84 +1,100 @@ -@if "%DEBUG%" == "" @echo off -@rem ########################################################################## -@rem -@rem Gradle startup script for Windows -@rem -@rem ########################################################################## - -@rem Set local scope for the variables with windows NT shell -if "%OS%"=="Windows_NT" setlocal - -set DIRNAME=%~dp0 -if "%DIRNAME%" == "" set DIRNAME=. -set APP_BASE_NAME=%~n0 -set APP_HOME=%DIRNAME% - -@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -set DEFAULT_JVM_OPTS= - -@rem Find java.exe -if defined JAVA_HOME goto findJavaFromJavaHome - -set JAVA_EXE=java.exe -%JAVA_EXE% -version >NUL 2>&1 -if "%ERRORLEVEL%" == "0" goto init - -echo. -echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. -echo. -echo Please set the JAVA_HOME variable in your environment to match the -echo location of your Java installation. - -goto fail - -:findJavaFromJavaHome -set JAVA_HOME=%JAVA_HOME:"=% -set JAVA_EXE=%JAVA_HOME%/bin/java.exe - -if exist "%JAVA_EXE%" goto init - -echo. -echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% -echo. -echo Please set the JAVA_HOME variable in your environment to match the -echo location of your Java installation. - -goto fail - -:init -@rem Get command-line arguments, handling Windows variants - -if not "%OS%" == "Windows_NT" goto win9xME_args - -:win9xME_args -@rem Slurp the command line arguments. -set CMD_LINE_ARGS= -set _SKIP=2 - -:win9xME_args_slurp -if "x%~1" == "x" goto execute - -set CMD_LINE_ARGS=%* - -:execute -@rem Setup the command line - -set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar - -@rem Execute Gradle -"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% - -:end -@rem End local scope for the variables with windows NT shell -if "%ERRORLEVEL%"=="0" goto mainEnd - -:fail -rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of -rem the _cmd.exe /c_ return code! -if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 -exit /b 1 - -:mainEnd -if "%OS%"=="Windows_NT" endlocal - -:omega +@rem +@rem Copyright 2015 the original author or authors. +@rem +@rem Licensed under the Apache License, Version 2.0 (the "License"); +@rem you may not use this file except in compliance with the License. +@rem You may obtain a copy of the License at +@rem +@rem https://www.apache.org/licenses/LICENSE-2.0 +@rem +@rem Unless required by applicable law or agreed to in writing, software +@rem distributed under the License is distributed on an "AS IS" BASIS, +@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +@rem See the License for the specific language governing permissions and +@rem limitations under the License. +@rem + +@if "%DEBUG%" == "" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +set DIRNAME=%~dp0 +if "%DIRNAME%" == "" set DIRNAME=. +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if "%ERRORLEVEL%" == "0" goto init + +echo. +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto init + +echo. +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:init +@rem Get command-line arguments, handling Windows variants + +if not "%OS%" == "Windows_NT" goto win9xME_args + +:win9xME_args +@rem Slurp the command line arguments. +set CMD_LINE_ARGS= +set _SKIP=2 + +:win9xME_args_slurp +if "x%~1" == "x" goto execute + +set CMD_LINE_ARGS=%* + +:execute +@rem Setup the command line + +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% + +:end +@rem End local scope for the variables with windows NT shell +if "%ERRORLEVEL%"=="0" goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 +exit /b 1 + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega 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 72588f1296..1a46baf921 100644 --- a/ios/src/io/anuke/mindustry/IOSLauncher.java +++ b/ios/src/io/anuke/mindustry/IOSLauncher.java @@ -3,7 +3,7 @@ package io.anuke.mindustry; import com.badlogic.gdx.backends.iosrobovm.*; import io.anuke.arc.*; import io.anuke.arc.files.*; -import io.anuke.arc.function.*; +import io.anuke.arc.func.*; import io.anuke.arc.scene.ui.layout.*; import io.anuke.arc.util.*; import io.anuke.arc.util.io.*; @@ -12,7 +12,6 @@ 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.dispatch.*; import org.robovm.apple.foundation.*; import org.robovm.apple.uikit.*; import org.robovm.objc.block.*; @@ -36,12 +35,12 @@ public class IOSLauncher extends IOSApplication.Delegate{ Scl.setAddition(-0.5f); } - //IOSApplicationConfiguration config = new IOSApplicationConfiguration(); return new IOSApplication(new ClientLauncher(){ @Override - public void showFileChooser(boolean open, String extension, Consumer cons){ - UIDocumentBrowserViewController cont = new UIDocumentBrowserViewController((NSArray)null); + public void showFileChooser(boolean open, String extension, Cons cons){ + UIDocumentBrowserViewController cont = new UIDocumentBrowserViewController((NSArray)null); + NSArray arr = new NSArray<>(new UIBarButtonItem(Core.bundle.get("cancel"), UIBarButtonItemStyle.Plain, uiBarButtonItem -> cont.dismissViewController(true, () -> {}))); @@ -59,8 +58,31 @@ public class IOSLauncher extends IOSApplication.Delegate{ public void didPickDocumentsAtURLs(UIDocumentBrowserViewController controller, NSArray documentURLs){ if(documentURLs.size() < 1) return; + NSURL url = documentURLs.first(); + NSFileCoordinator coord = new NSFileCoordinator(null); + url.startAccessingSecurityScopedResource(); + try{ + coord.coordinateReadingItem(url, NSFileCoordinatorReadingOptions.ForUploading, result -> { + + FileHandle src = Core.files.absolute(result.getAbsoluteURL().getPath()); + FileHandle dst = Core.files.absolute(getDocumentsDirectory()).child(src.name()); + src.copyTo(dst); + + Core.app.post(() -> { + try{ + cons.get(dst); + }catch(Throwable t){ + ui.showException(t); + } + }); + }); + }catch(Throwable e){ + ui.showException(e); + } + + url.stopAccessingSecurityScopedResource(); + cont.dismissViewController(true, () -> {}); - controller.importDocument(documentURLs.get(0), new NSURL(getDocumentsDirectory() + "/document"), UIDocumentBrowserImportMode.Copy, (url, error) -> cons.accept(Core.files.absolute(url.getPath()))); } @Override @@ -70,7 +92,6 @@ public class IOSLauncher extends IOSApplication.Delegate{ @Override public void didImportDocument(UIDocumentBrowserViewController controller, NSURL sourceURL, NSURL destinationURL){ - cons.accept(Core.files.absolute(destinationURL.getAbsoluteString())); } @Override @@ -91,25 +112,22 @@ public class IOSLauncher extends IOSApplication.Delegate{ cont.setDelegate(new ChooserDelegate()); - // DispatchQueue.getMainQueue().sync(() -> { UIApplication.getSharedApplication().getKeyWindow().getRootViewController().presentViewController(cont, true, () -> {}); - // }); } @Override public void shareFile(FileHandle file){ - Log.info("Attempting to share file " + file); - FileHandle to = Core.files.absolute(getDocumentsDirectory()).child(file.name()); - file.copyTo(to); + try{ + Log.info("Attempting to share file " + file); + FileHandle to = Core.files.absolute(getDocumentsDirectory()).child(file.name()); + file.copyTo(to); - NSURL url = new NSURL(to.file()); - UIActivityViewController p = new UIActivityViewController(Collections.singletonList(url), null); - //p.getPopoverPresentationController().setSourceView(UIApplication.getSharedApplication().getKeyWindow().getRootViewController().getView()); - - //DispatchQueue.getMainQueue().sync(() -> { - UIApplication.getSharedApplication().getKeyWindow().getRootViewController() - .presentViewController(p, true, () -> Log.info("Success! Presented {0}", to)); - //}); + 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)); + }catch(Throwable t){ + ui.showException(t); + } } @Override @@ -136,7 +154,6 @@ public class IOSLauncher extends IOSApplication.Delegate{ @Override public boolean openURL(UIApplication app, NSURL url, UIApplicationOpenURLOptions options){ - System.out.println("Opened URL: " + url.getPath()); openURL(url); return false; } @@ -146,7 +163,6 @@ public class IOSLauncher extends IOSApplication.Delegate{ boolean b = super.didFinishLaunching(application, options); if(options != null && options.has(UIApplicationLaunchOptions.Keys.URL())){ - System.out.println("Opened URL at launch: " + ((NSURL)options.get(UIApplicationLaunchOptions.Keys.URL())).getPath()); openURL(((NSURL)options.get(UIApplicationLaunchOptions.Keys.URL()))); } diff --git a/server/build.gradle b/server/build.gradle index 7b2fb63159..26fe08a653 100644 --- a/server/build.gradle +++ b/server/build.gradle @@ -51,8 +51,8 @@ task dist(type: Jar){ task dzip(type: Zip){ from getServerFolder() - archiveName "${generateDeployName('server')}.zip" - destinationDir(file("../deploy/")) + archiveFileName = "${generateDeployName('server')}.zip" + destinationDirectory = file("../deploy/") finalizedBy 'cleanup' } diff --git a/server/src/io/anuke/mindustry/server/ServerControl.java b/server/src/io/anuke/mindustry/server/ServerControl.java index 4240ce65d2..570d3a8414 100644 --- a/server/src/io/anuke/mindustry/server/ServerControl.java +++ b/server/src/io/anuke/mindustry/server/ServerControl.java @@ -5,9 +5,12 @@ import io.anuke.arc.collection.*; import io.anuke.arc.collection.Array.*; import io.anuke.arc.files.*; import io.anuke.arc.util.*; +import io.anuke.arc.util.ArcAnnotate.*; import io.anuke.arc.util.Timer; import io.anuke.arc.util.CommandHandler.*; import io.anuke.arc.util.Timer.*; +import io.anuke.arc.util.serialization.*; +import io.anuke.arc.util.serialization.JsonValue.*; import io.anuke.mindustry.*; import io.anuke.mindustry.core.GameState.*; import io.anuke.mindustry.core.*; @@ -19,6 +22,7 @@ import io.anuke.mindustry.gen.*; import io.anuke.mindustry.io.*; import io.anuke.mindustry.maps.Map; import io.anuke.mindustry.maps.*; +import io.anuke.mindustry.maps.Maps.*; import io.anuke.mindustry.mod.Mods.*; import io.anuke.mindustry.net.Administration.*; import io.anuke.mindustry.net.Packets.*; @@ -46,6 +50,7 @@ public class ServerControl implements ApplicationListener{ private boolean inExtraRound; private Task lastTask; private Gamemode lastMode = Gamemode.survival; + private @Nullable Map nextMapOverride; private Thread socketThread; private PrintWriter socketOutput; @@ -55,11 +60,12 @@ public class ServerControl implements ApplicationListener{ "shufflemode", "normal", "bans", "", "admins", "", - "shuffle", true, + "shufflemode", "all", "crashreport", false, "port", port, "logging", true, - "socket", false + "socket", false, + "globalrules", "{reactorExplosions: false}" ); Log.setLogger(new LogHandler(){ @@ -139,33 +145,34 @@ public class ServerControl implements ApplicationListener{ warn("&lyIt is highly advised to specify which version you're using by building with gradle args &lc-Pbuildversion=&lm&ly."); } + //set up default shuffle mode + try{ + maps.setShuffleMode(ShuffleMode.valueOf(Core.settings.getString("shufflemode"))); + }catch(Exception e){ + maps.setShuffleMode(ShuffleMode.all); + } + Events.on(GameOverEvent.class, event -> { if(inExtraRound) return; - info("Game over!"); + if(state.rules.waves){ + info("&lcGame over! Reached wave &ly{0}&lc with &ly{1}&lc players online on map &ly{2}&lc.", state.wave, playerGroup.size(), Strings.capitalize(world.getMap().name())); + }else{ + info("&lcGame over! Team &ly{0}&lc is victorious with &ly{1}&lc players online on map &ly{2}&lc.", event.winner.name(), playerGroup.size(), Strings.capitalize(world.getMap().name())); + } - if(Core.settings.getBool("shuffle")){ - if(maps.all().size > 0){ - Array maps = Array.with(Vars.maps.customMaps().size == 0 ? Vars.maps.defaultMaps() : Vars.maps.customMaps()); - maps.shuffle(); + //set next map to be played + Map map = nextMapOverride != null ? nextMapOverride : maps.getNextMap(world.getMap()); + nextMapOverride = null; + if(map != null){ + Call.onInfoMessage((state.rules.pvp + ? "[YELLOW]The " + event.winner.name() + " team is victorious![]" : "[SCARLET]Game over![]") + + "\nNext selected map:[accent] " + map.name() + "[]" + + (map.tags.containsKey("author") && !map.tags.get("author").trim().isEmpty() ? " by[accent] " + map.author() + "[]" : "") + "." + + "\nNew game begins in " + roundExtraTime + "[] seconds."); - Map previous = world.getMap(); - Map map = maps.find(m -> m != previous || maps.size == 1); + info("Selected next map to be {0}.", map.name()); - if(map != null){ - - Call.onInfoMessage((state.rules.pvp - ? "[YELLOW]The " + event.winner.name() + " team is victorious![]" : "[SCARLET]Game over![]") - + "\nNext selected map:[accent] " + map.name() + "[]" - + (map.tags.containsKey("author") && !map.tags.get("author").trim().isEmpty() ? " by[accent] " + map.author() + "[]" : "") + "." + - "\nNew game begins in " + roundExtraTime + "[] seconds."); - - info("Selected next map to be {0}.", map.name()); - - play(true, () -> world.loadMap(map, map.applyRules(lastMode))); - }else{ - Log.err("No suitable map found."); - } - } + play(true, () -> world.loadMap(map, map.applyRules(lastMode))); }else{ netServer.kickAll(KickReason.gameover); state.set(State.menu); @@ -211,19 +218,26 @@ public class ServerControl implements ApplicationListener{ info("Stopped server."); }); - handler.register("host", " [mode]", "Open the server with a specific map.", arg -> { + handler.register("host", "[mapname] [mode]", "Open the server. Will default to survival and a random map if not specified.", arg -> { if(state.is(State.playing)){ err("Already hosting. Type 'stop' to stop hosting first."); return; } if(lastTask != null) lastTask.cancel(); + + Map result; + if(arg.length > 0){ + result = maps.all().find(map -> map.name().equalsIgnoreCase(arg[0].replace('_', ' ')) || map.name().equalsIgnoreCase(arg[0])); - Map result = maps.all().find(map -> map.name().equalsIgnoreCase(arg[0].replace('_', ' ')) || map.name().equalsIgnoreCase(arg[0])); - - if(result == null){ - err("No map with name &y'{0}'&lr found.", arg[0]); - return; + if(result == null){ + err("No map with name &y'{0}'&lr found.", arg[0]); + return; + } + }else{ + Array maps = Vars.maps.customMaps().size == 0 ? Vars.maps.defaultMaps() : Vars.maps.customMaps(); + result = maps.random(); + info("Randomized next map to be {0}.", result.name()); } Gamemode preset = Gamemode.survival; @@ -242,8 +256,9 @@ public class ServerControl implements ApplicationListener{ logic.reset(); lastMode = preset; try{ - world.loadMap(result, result.applyRules(lastMode)); + world.loadMap(result, result.applyRules(lastMode)); state.rules = result.applyRules(preset); + applyRules(); logic.play(); info("Map loaded."); @@ -362,6 +377,58 @@ public class ServerControl implements ApplicationListener{ } }); + handler.register("rules", "[remove/add] [name] [value...]", "List, remove or add global rules. These will apply regardless of map.", arg -> { + String rules = Core.settings.getString("globalrules"); + JsonValue base = JsonIO.json().fromJson(null, rules); + + if(arg.length == 0){ + Log.info("&lyRules:\n{0}", JsonIO.print(rules)); + }else if(arg.length == 1){ + Log.err("Invalid usage. Specify which rule to remove or add."); + }else{ + if(!(arg[0].equals("remove") || arg[0].equals("add"))){ + Log.err("Invalid usage. Either add or remove rules."); + return; + } + + boolean remove = arg[0].equals("remove"); + if(remove){ + if(base.has(arg[1])){ + Log.info("Rule &lc'{0}'&lg removed.", arg[1]); + base.remove(arg[1]); + }else{ + Log.err("Rule not defined, so not removed."); + return; + } + }else{ + if(arg.length < 3){ + Log.err("Missing last argument. Specify which value to set the rule to."); + return; + } + + try{ + JsonValue value = new JsonReader().parse(arg[2]); + value.name = arg[1]; + + JsonValue parent = new JsonValue(ValueType.object); + parent.addChild(value); + + JsonIO.json().readField(state.rules, value.name, parent); + if(base.has(value.name)){ + base.remove(value.name); + } + base.addChild(arg[1], value); + Log.info("Changed rule: &ly{0}", value.toString().replace("\n", " ")); + }catch(Throwable e){ + Log.err("Error parsing rule JSON", e); + } + } + + Core.settings.putSave("globalrules", base.toString()); + Call.onSetRules(state.rules); + } + }); + handler.register("fillitems", "[team]", "Fill the core with items.", arg -> { if(!state.is(State.playing)){ err("Not playing. Host first."); @@ -511,14 +578,29 @@ public class ServerControl implements ApplicationListener{ } }); - handler.register("shuffle", "", "Set map shuffling.", arg -> { - if(!arg[0].equals("on") && !arg[0].equals("off")){ - err("Invalid shuffle mode."); - return; + handler.register("shuffle", "[none/all/custom/builtin]", "Set map shuffling mode.", arg -> { + if(arg.length == 0){ + info("Shuffle mode current set to &ly'{0}'&lg.", maps.getShuffleMode()); + }else{ + try{ + ShuffleMode mode = ShuffleMode.valueOf(arg[0]); + Core.settings.putSave("shufflemode", mode.name()); + maps.setShuffleMode(mode); + info("Shuffle mode set to &ly'{0}'&lg.", arg[0]); + }catch(Exception e){ + err("Invalid shuffle mode."); + } + } + }); + + handler.register("nextmap", "", "Set the next map to be played after a game-over. Overrides shuffling.", arg -> { + Map res = maps.all().find(map -> map.name().equalsIgnoreCase(arg[0].replace('_', ' ')) || map.name().equalsIgnoreCase(arg[0])); + if(res != null){ + nextMapOverride = res; + Log.info("Next map set to &ly'{0}'.", res.name()); + }else{ + Log.err("No map '{0}' found.", arg[0]); } - Core.settings.put("shuffle", arg[0].equals("on")); - Core.settings.save(); - info("Shuffle mode set to '{0}'.", arg[0]); }); handler.register("kick", "", "Kick a person by name.", arg -> { @@ -717,7 +799,7 @@ public class ServerControl implements ApplicationListener{ handler.register("gameover", "Force a game over.", arg -> { if(state.is(State.menu)){ - info("Not playing a map."); + err("Not playing a map."); return; } @@ -758,6 +840,15 @@ public class ServerControl implements ApplicationListener{ mods.each(p -> p.registerClientCommands(netServer.clientCommands)); } + private void applyRules(){ + try{ + JsonValue value = JsonIO.json().fromJson(null, Core.settings.getString("globalrules")); + JsonIO.json().readFields(state.rules, value); + }catch(Throwable t){ + Log.err("Error applying custom rules, proceeding without them.", t); + } + } + private void readCommands(){ Scanner scan = new Scanner(System.in); @@ -812,6 +903,7 @@ public class ServerControl implements ApplicationListener{ run.run(); logic.play(); state.rules = world.getMap().applyRules(lastMode); + applyRules(); for(Player p : players){ if(p.con == null) continue; diff --git a/tests/src/test/java/ApplicationTests.java b/tests/src/test/java/ApplicationTests.java index 83f6ed971b..a9ed831fbc 100644 --- a/tests/src/test/java/ApplicationTests.java +++ b/tests/src/test/java/ApplicationTests.java @@ -60,6 +60,7 @@ public class ApplicationTests{ super.init(); begins[0] = true; testMap = maps.loadInternalMap("groundZero"); + Thread.currentThread().interrupt(); } }; @@ -216,15 +217,24 @@ public class ApplicationTests{ } @Test - void loadOldSave(){ + void load77Save(){ resetWorld(); - SaveIO.load(Core.files.internal("build77.msav")); + SaveIO.load(Core.files.internal("77.msav")); //just tests if the map was loaded properly and didn't crash, no validity checks currently assertEquals(276, world.width()); assertEquals(10, world.height()); } + @Test + void load85Save(){ + resetWorld(); + SaveIO.load(Core.files.internal("85.msav")); + + assertEquals(250, world.width()); + assertEquals(300, world.height()); + } + @Test void arrayIterators(){ Array arr = Array.with("a", "b" , "c", "d", "e", "f"); diff --git a/tests/src/test/java/IOTests.java b/tests/src/test/java/IOTests.java index 7a75b81d16..7771b33dde 100644 --- a/tests/src/test/java/IOTests.java +++ b/tests/src/test/java/IOTests.java @@ -1,3 +1,4 @@ +import io.anuke.mindustry.game.*; import io.anuke.mindustry.io.TypeIO; import org.junit.jupiter.api.Test; @@ -32,4 +33,21 @@ public class IOTests{ assertNull(TypeIO.readString(buffer)); } + @Test + void writeRules(){ + ByteBuffer buffer = ByteBuffer.allocate(500); + + Rules rules = new Rules(); + rules.attackMode = true; + rules.buildSpeedMultiplier = 99f; + + TypeIO.writeRules(buffer, rules); + buffer.position(0); + Rules res = TypeIO.readRules(buffer); + + assertEquals(rules.buildSpeedMultiplier, res.buildSpeedMultiplier); + assertEquals(rules.attackMode, res.attackMode); + } + + } diff --git a/tests/src/test/java/ZoneTests.java b/tests/src/test/java/ZoneTests.java index d919e0fa47..eee1de8708 100644 --- a/tests/src/test/java/ZoneTests.java +++ b/tests/src/test/java/ZoneTests.java @@ -42,7 +42,7 @@ public class ZoneTests{ e.printStackTrace(); return; } - zone.rules.accept(state.rules); + zone.rules.get(state.rules); ObjectSet resources = new ObjectSet<>(); boolean hasSpawnPoint = false; diff --git a/tests/src/test/java/power/DirectConsumerTests.java b/tests/src/test/java/power/DirectConsumerTests.java index 7fdc9ef612..89ed331c8b 100644 --- a/tests/src/test/java/power/DirectConsumerTests.java +++ b/tests/src/test/java/power/DirectConsumerTests.java @@ -50,6 +50,6 @@ public class DirectConsumerTests extends PowerTestFixture{ consumerTile.entity.update(); graph.update(); - assertEquals(expectedSatisfaction, consumerTile.entity.power.satisfaction); + assertEquals(expectedSatisfaction, consumerTile.entity.power.status); } } diff --git a/tests/src/test/java/power/ItemLiquidGeneratorTests.java b/tests/src/test/java/power/ItemLiquidGeneratorTests.java index a4c0c78608..e6bc2a20de 100644 --- a/tests/src/test/java/power/ItemLiquidGeneratorTests.java +++ b/tests/src/test/java/power/ItemLiquidGeneratorTests.java @@ -1,18 +1,18 @@ package power; -import io.anuke.arc.util.Time; -import io.anuke.mindustry.content.Items; -import io.anuke.mindustry.content.Liquids; -import io.anuke.mindustry.type.Item; -import io.anuke.mindustry.type.Liquid; -import io.anuke.mindustry.world.Tile; -import io.anuke.mindustry.world.blocks.power.ItemLiquidGenerator; +import io.anuke.arc.util.*; +import io.anuke.mindustry.*; +import io.anuke.mindustry.content.*; +import io.anuke.mindustry.core.*; +import io.anuke.mindustry.game.*; +import io.anuke.mindustry.type.*; +import io.anuke.mindustry.world.*; +import io.anuke.mindustry.world.blocks.power.*; import org.junit.jupiter.api.*; -import java.util.ArrayList; +import java.util.*; -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertTrue; +import static org.junit.jupiter.api.Assertions.*; import static org.junit.jupiter.api.DynamicTest.dynamicTest; /** @@ -20,7 +20,7 @@ import static org.junit.jupiter.api.DynamicTest.dynamicTest; * All tests are run with a fixed delta of 0.5 so delta considerations can be tested as well. * Additionally, each PowerGraph::update() call will have its own thread frame, i.e. the method will never be called twice within the same frame. * Both of these constraints are handled by FakeThreadHandler within PowerTestFixture. - * Any expected power amount (produced, consumed, buffered) should be affected by FakeThreadHandler.fakeDelta but satisfaction should not! + * Any expected power amount (produced, consumed, buffered) should be affected by FakeThreadHandler.fakeDelta but status should not! */ public class ItemLiquidGeneratorTests extends PowerTestFixture{ @@ -31,6 +31,8 @@ public class ItemLiquidGeneratorTests extends PowerTestFixture{ private final float maximumLiquidUsage = 0.5f; public void createGenerator(InputType inputType){ + Vars.state = new GameState(); + Vars.state.rules = new Rules(); generator = new ItemLiquidGenerator(inputType != InputType.liquids, inputType != InputType.items, "fakegen"){ { powerProduction = 0.1f; diff --git a/tests/src/test/java/power/PowerTests.java b/tests/src/test/java/power/PowerTests.java index 3c6e20e288..6b253e4f29 100644 --- a/tests/src/test/java/power/PowerTests.java +++ b/tests/src/test/java/power/PowerTests.java @@ -16,7 +16,7 @@ import static org.junit.jupiter.api.DynamicTest.dynamicTest; * All tests are run with a fixed delta of 0.5 so delta considerations can be tested as well. * Additionally, each PowerGraph::update() call will have its own thread frame, i.e. the method will never be called twice within the same frame. * Both of these constraints are handled by FakeThreadHandler within PowerTestFixture. - * Any power amount (produced, consumed, buffered) should be affected by Time.delta() but satisfaction should not! + * Any power amount (produced, consumed, buffered) should be affected by Time.delta() but status should not! */ public class PowerTests extends PowerTestFixture{ @@ -29,9 +29,9 @@ public class PowerTests extends PowerTestFixture{ class PowerGraphTests{ /** - * Tests the satisfaction of a single consumer after a single update of the power graph which contains a single producer. + * Tests the status of a single consumer after a single update of the power graph which contains a single producer. *

- * Assumption: When the consumer requests zero power, satisfaction does not change. Default is 0.0f. + * Assumption: When the consumer requests zero power, status does not change. Default is 0.0f. */ @TestFactory DynamicTest[] directConsumerSatisfactionIsAsExpected(){ @@ -61,13 +61,13 @@ public class PowerTests extends PowerTestFixture{ assertEquals(producedPower * Time.delta(), powerGraph.getPowerProduced(), Mathf.FLOAT_ROUNDING_ERROR); assertEquals(requiredPower * Time.delta(), powerGraph.getPowerNeeded(), Mathf.FLOAT_ROUNDING_ERROR); - // Update and check for the expected power satisfaction of the consumer + // Update and check for the expected power status of the consumer powerGraph.update(); - assertEquals(expectedSatisfaction, directConsumerTile.entity.power.satisfaction, Mathf.FLOAT_ROUNDING_ERROR, parameterDescription + ": Satisfaction of direct consumer did not match"); + assertEquals(expectedSatisfaction, directConsumerTile.entity.power.status, Mathf.FLOAT_ROUNDING_ERROR, parameterDescription + ": Satisfaction of direct consumer did not match"); } /** - * Tests the satisfaction of a single direct consumer after a single update of the power graph which contains a single producer and a single battery. + * Tests the status of a single direct consumer after a single update of the power graph which contains a single producer and a single battery. * The used battery is created with a maximum capacity of 100 and receives ten power per tick. */ @TestFactory @@ -101,14 +101,14 @@ public class PowerTests extends PowerTestFixture{ } float maxCapacity = 100f; Tile batteryTile = createFakeTile(0, 2, createFakeBattery(maxCapacity)); - batteryTile.entity.power.satisfaction = initialBatteryCapacity / maxCapacity; + batteryTile.entity.power.status = initialBatteryCapacity / maxCapacity; powerGraph.add(batteryTile); powerGraph.update(); - assertEquals(expectedBatteryCapacity / maxCapacity, batteryTile.entity.power.satisfaction, Mathf.FLOAT_ROUNDING_ERROR, parameterDescription + ": Expected battery satisfaction did not match"); + assertEquals(expectedBatteryCapacity / maxCapacity, batteryTile.entity.power.status, Mathf.FLOAT_ROUNDING_ERROR, parameterDescription + ": Expected battery status did not match"); if(directConsumerTile != null){ - assertEquals(expectedSatisfaction, directConsumerTile.entity.power.satisfaction, Mathf.FLOAT_ROUNDING_ERROR, parameterDescription + ": Satisfaction of direct consumer did not match"); + assertEquals(expectedSatisfaction, directConsumerTile.entity.power.status, Mathf.FLOAT_ROUNDING_ERROR, parameterDescription + ": Satisfaction of direct consumer did not match"); } } @@ -124,13 +124,13 @@ public class PowerTests extends PowerTestFixture{ powerGraph.add(consumerTile); powerGraph.update(); - assertEquals(1.0f, consumerTile.entity.power.satisfaction, Mathf.FLOAT_ROUNDING_ERROR); + assertEquals(1.0f, consumerTile.entity.power.status, Mathf.FLOAT_ROUNDING_ERROR); powerGraph.remove(producerTile); powerGraph.add(consumerTile); powerGraph.update(); - assertEquals(0.0f, consumerTile.entity.power.satisfaction, Mathf.FLOAT_ROUNDING_ERROR); + 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())); diff --git a/tests/src/test/resources/build77.msav b/tests/src/test/resources/77.msav similarity index 100% rename from tests/src/test/resources/build77.msav rename to tests/src/test/resources/77.msav diff --git a/tests/src/test/resources/85.msav b/tests/src/test/resources/85.msav new file mode 100644 index 0000000000..085f9ec247 Binary files /dev/null and b/tests/src/test/resources/85.msav differ diff --git a/tools/src/io/anuke/mindustry/BundleLauncher.java b/tools/src/io/anuke/mindustry/BundleLauncher.java index 69b0e525b9..3888f641da 100644 --- a/tools/src/io/anuke/mindustry/BundleLauncher.java +++ b/tools/src/io/anuke/mindustry/BundleLauncher.java @@ -2,7 +2,7 @@ package io.anuke.mindustry; import io.anuke.arc.collection.Array; import io.anuke.arc.collection.OrderedMap; -import io.anuke.arc.function.BiFunction; +import io.anuke.arc.func.Func2; import io.anuke.arc.util.Log; import io.anuke.arc.util.Strings; import io.anuke.arc.util.io.PropertiesUtils; @@ -50,7 +50,7 @@ public class BundleLauncher{ } } - BiFunction processor = (key, value) -> (key + " = " + value).replace("\\", "\\\\").replace("\n", "\\n") + "\n"; + Func2 processor = (key, value) -> (key + " = " + value).replace("\\", "\\\\").replace("\n", "\\n") + "\n"; Path output = child.resolveSibling("output/" + child.getFileName());