diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md index cf3bd34e0e..bfdc7f59f1 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.md +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -3,10 +3,10 @@ name: Bug report about: Create a report to help fix an issue. --- -**Platform**: (Android/iOS/Mac/Windows/Linux) +**Platform**: *Android/iOS/Mac/Windows/Linux* -**Build**: (The build number under the title in the main menu. Required.) +**Build**: *The build number under the title in the main menu. Required.* -**Issue**: (Explain your issue in detail.) +**Issue**: *Explain your issue in detail.* -**Steps to reproduce**: (How you happened across the issue, and what you were doing at the time.) +**Steps to reproduce**: *How you happened across the issue, and what you were doing at the time.* 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/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/.travis.yml b/.travis.yml index 9df31f3301..fb5295ac57 100644 --- a/.travis.yml +++ b/.travis.yml @@ -10,7 +10,7 @@ script: - git clone --depth=1 --branch=master https://github.com/Anuken/MindustryBuilds ../MindustryBuilds - cd ../MindustryBuilds - echo ${TRAVIS_TAG} -- if [ -n "$TRAVIS_TAG" ]; then echo versionName=4-fdroid-${TRAVIS_TAG:1}$'\n'versionCode=${TRAVIS_TAG:1} > version_fdroid.txt; git add .; git commit -m "Updating to build ${TRAVIS_TAG}"; fi +- if [ -n "$TRAVIS_TAG" ]; then echo versionName=5-fdroid-${TRAVIS_TAG:1}$'\n'versionCode=${TRAVIS_TAG:1} > version_fdroid.txt; git add .; git commit -m "Updating to build ${TRAVIS_TAG}"; fi - git tag ${TRAVIS_BUILD_NUMBER} - git config --global user.name "Build Uploader" - if [ "$TRAVIS_PULL_REQUEST" = "false" ]; then git push https://Anuken:${GH_PUSH_TOKEN}@github.com/Anuken/MindustryBuilds ${TRAVIS_BUILD_NUMBER}; git push https://Anuken:${GH_PUSH_TOKEN}@github.com/Anuken/MindustryBuilds; fi diff --git a/README.md b/README.md index 4dce34be64..4794ccbf73 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ ![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. @@ -45,6 +45,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/src/io/anuke/mindustry/AndroidLauncher.java b/android/src/io/anuke/mindustry/AndroidLauncher.java index 2cc928d322..627a782dd3 100644 --- a/android/src/io/anuke/mindustry/AndroidLauncher.java +++ b/android/src/io/anuke/mindustry/AndroidLauncher.java @@ -12,12 +12,13 @@ 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.*; import io.anuke.mindustry.game.Saves.*; import io.anuke.mindustry.io.*; +import io.anuke.mindustry.mod.*; import io.anuke.mindustry.ui.dialogs.*; import java.io.*; @@ -69,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); @@ -80,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{ @@ -105,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); } }); @@ -134,14 +135,11 @@ public class AndroidLauncher extends AndroidApplication{ setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_USER); } - @Override - public boolean canDonate(){ - return true; - } }, new AndroidApplicationConfiguration(){{ useImmersiveMode = true; depth = 0; hideStatusBar = true; + errorHandler = ModCrashHandler::handle; }}); checkFiles(getIntent()); } diff --git a/annotations/src/main/java/io/anuke/annotations/AssetsAnnotationProcessor.java b/annotations/src/main/java/io/anuke/annotations/AssetsAnnotationProcessor.java index 0eb1ce32d4..3c28c83cea 100644 --- a/annotations/src/main/java/io/anuke/annotations/AssetsAnnotationProcessor.java +++ b/annotations/src/main/java/io/anuke/annotations/AssetsAnnotationProcessor.java @@ -35,8 +35,8 @@ public class AssetsAnnotationProcessor extends AbstractProcessor{ try{ path = Paths.get(Utils.filer.createResource(StandardLocation.CLASS_OUTPUT, "no", "no") - .toUri().toURL().toString().substring(System.getProperty("os.name").contains("Windows") ? 6 : "file:".length())) - .getParent().getParent().getParent().getParent().getParent().getParent().toString(); + .toUri().toURL().toString().substring(System.getProperty("os.name").contains("Windows") ? 6 : "file:".length())) + .getParent().getParent().getParent().getParent().getParent().getParent().toString(); path = path.replace("%20", " "); processSounds("Sounds", path + "/assets/sounds", "io.anuke.arc.audio.Sound"); diff --git a/build.gradle b/build.gradle index 1aaf194da3..af39641b49 100644 --- a/build.gradle +++ b/build.gradle @@ -5,12 +5,13 @@ buildscript{ google() maven{ url "https://oss.sonatype.org/content/repositories/snapshots/" } jcenter() + maven{ url 'https://jitpack.io' } } dependencies{ - classpath 'com.mobidevelop.robovm:robovm-gradle-plugin:2.3.7' + classpath 'com.mobidevelop.robovm:robovm-gradle-plugin:2.3.8-SNAPSHOT' classpath "com.badlogicgames.gdx:gdx-tools:1.9.10" - classpath "com.badlogicgames.packr:packr:2.1-SNAPSHOT" + classpath "com.github.anuken:packr:-SNAPSHOT" } } @@ -20,13 +21,13 @@ allprojects{ group = 'com.github.Anuken' ext{ - versionNumber = '4' + versionNumber = '5' if(!project.hasProperty("versionModifier")) versionModifier = 'release' if(!project.hasProperty("versionType")) versionType = 'official' appName = 'Mindustry' gdxVersion = '1.9.10' - roboVMVersion = '2.3.7' - steamworksVersion = '1.8.0' + roboVMVersion = '2.3.8-SNAPSHOT' + steamworksVersion = '891ed912791e01fe9ee6237a6497e5212b85c256' arcHash = null debugged = { @@ -148,8 +149,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' @@ -166,13 +166,14 @@ project(":ios"){ def props = new Properties() if(vfile.exists()){ props.load(new FileInputStream(vfile)) + }else{ + props['app.id'] = 'io.anuke.mindustry' + props['app.version'] = '5.0' + props['app.mainclass'] = 'io.anuke.mindustry.IOSLauncher' + props['app.executable'] = 'IOSLauncher' + props['app.name'] = 'Mindustry' } - - props['app.id'] = 'io.anuke.mindustry' - props['app.version'] = '4.2.1' - props['app.mainclass'] = 'io.anuke.mindustry.IOSLauncher' - props['app.executable'] = 'IOSLauncher' - props['app.name'] = 'Mindustry' + props['app.build'] = (!props.containsKey("app.build") ? 40 : props['app.build'].toInteger() + 1) + "" props.store(vfile.newWriter(), null) } @@ -194,7 +195,7 @@ project(":core"){ apply plugin: "java" task preGen{ - outputs.upToDateWhen{ false } + outputs.upToDateWhen{ false } generateLocales() writeVersion() } diff --git a/core/assets-raw/sprites/blocks/extra/rubble-5-0.png b/core/assets-raw/sprites/blocks/extra/rubble-5-0.png new file mode 100644 index 0000000000..8b22b6fc14 Binary files /dev/null and b/core/assets-raw/sprites/blocks/extra/rubble-5-0.png differ diff --git a/core/assets-raw/sprites/blocks/extra/rubble-5-1.png b/core/assets-raw/sprites/blocks/extra/rubble-5-1.png new file mode 100644 index 0000000000..8b22b6fc14 Binary files /dev/null and b/core/assets-raw/sprites/blocks/extra/rubble-5-1.png differ diff --git a/core/assets-raw/sprites/blocks/extra/rubble-6-0.png b/core/assets-raw/sprites/blocks/extra/rubble-6-0.png new file mode 100644 index 0000000000..3f3fb19086 Binary files /dev/null and b/core/assets-raw/sprites/blocks/extra/rubble-6-0.png differ diff --git a/core/assets-raw/sprites/blocks/extra/rubble-6-1.png b/core/assets-raw/sprites/blocks/extra/rubble-6-1.png new file mode 100644 index 0000000000..3f3fb19086 Binary files /dev/null and b/core/assets-raw/sprites/blocks/extra/rubble-6-1.png differ diff --git a/core/assets-raw/sprites/blocks/extra/rubble-7-0.png b/core/assets-raw/sprites/blocks/extra/rubble-7-0.png new file mode 100644 index 0000000000..ba3fb3f3af Binary files /dev/null and b/core/assets-raw/sprites/blocks/extra/rubble-7-0.png differ diff --git a/core/assets-raw/sprites/blocks/extra/rubble-7-1.png b/core/assets-raw/sprites/blocks/extra/rubble-7-1.png new file mode 100644 index 0000000000..ba3fb3f3af Binary files /dev/null and b/core/assets-raw/sprites/blocks/extra/rubble-7-1.png differ diff --git a/core/assets-raw/sprites/blocks/extra/rubble-8-0.png b/core/assets-raw/sprites/blocks/extra/rubble-8-0.png new file mode 100644 index 0000000000..5db796476d Binary files /dev/null and b/core/assets-raw/sprites/blocks/extra/rubble-8-0.png differ diff --git a/core/assets-raw/sprites/blocks/extra/rubble-8-1.png b/core/assets-raw/sprites/blocks/extra/rubble-8-1.png new file mode 100644 index 0000000000..5db796476d Binary files /dev/null and b/core/assets-raw/sprites/blocks/extra/rubble-8-1.png differ diff --git a/core/assets-raw/sprites/blocks/walls/insulator-wall-large.png b/core/assets-raw/sprites/blocks/walls/insulator-wall-large.png new file mode 100644 index 0000000000..b1084b553b Binary files /dev/null and b/core/assets-raw/sprites/blocks/walls/insulator-wall-large.png differ diff --git a/core/assets-raw/sprites/blocks/walls/insulator-wall.png b/core/assets-raw/sprites/blocks/walls/insulator-wall.png new file mode 100644 index 0000000000..64913542e3 Binary files /dev/null and b/core/assets-raw/sprites/blocks/walls/insulator-wall.png differ diff --git a/core/assets-raw/sprites/blocks/walls/plastanium-wall-large.png b/core/assets-raw/sprites/blocks/walls/plastanium-wall-large.png new file mode 100644 index 0000000000..6ec6b6f615 Binary files /dev/null and b/core/assets-raw/sprites/blocks/walls/plastanium-wall-large.png differ diff --git a/core/assets-raw/sprites/blocks/walls/plastanium-wall.png b/core/assets-raw/sprites/blocks/walls/plastanium-wall.png new file mode 100644 index 0000000000..1dade2db43 Binary files /dev/null and b/core/assets-raw/sprites/blocks/walls/plastanium-wall.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/ui/icons/icon-reddit.png b/core/assets-raw/sprites/ui/icons/icon-reddit.png new file mode 100644 index 0000000000..16be9726df Binary files /dev/null and b/core/assets-raw/sprites/ui/icons/icon-reddit.png differ diff --git a/core/assets-raw/sprites/ui/scroll-knob-vertical-thin.png b/core/assets-raw/sprites/ui/scroll-knob-vertical-thin.png new file mode 100644 index 0000000000..540a1bcfca Binary files /dev/null and b/core/assets-raw/sprites/ui/scroll-knob-vertical-thin.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 ffe37ca6a1..8eb100143c 100644 --- a/core/assets/bundles/bundle.properties +++ b/core/assets/bundles/bundle.properties @@ -3,6 +3,7 @@ credits = Credits contributors = Translators and Contributors discord = Join the Mindustry Discord! link.discord.description = The official Mindustry Discord chatroom +link.reddit.description = The Mindustry subreddit link.github.description = Game source code link.changelog.description = List of update changes link.dev-builds.description = Unstable development builds @@ -28,6 +29,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 @@ -82,6 +84,7 @@ 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.alpha = [accent](Alpha) @@ -89,9 +92,13 @@ 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 @@ -228,7 +235,7 @@ data.export = Export Data data.import = Import Data data.exported = Data exported. data.invalid = This isn't valid game data. -data.import.confirm = Importing external data will erase[scarlet] all[] your current game data.\n[accent]This cannot be undone![]\n\nOnce the data is imported, your game will exit immediately. +data.import.confirm = Importing external data will overwrite[scarlet] all[] your current game data.\n[accent]This cannot be undone![]\n\nOnce the data is imported, your game will exit immediately. classic.export = Export Classic Data classic.export.text = [accent]Mindustry[] has just had a major update.\nClassic (v3.5 build 40) save or map data has been detected. Would you like to export these saves to your phone's home folder, for use in the Mindustry Classic app? quit.confirm = Are you sure you want to quit? @@ -261,13 +268,15 @@ map.invalid = Error loading map: corrupted or invalid map file. 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! -map.menu = Select what you would like to do with this map. +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} +steam.error = Failed to initialize Steam services.\nError: {0} editor.brush = Brush editor.openin = Open In Editor @@ -408,7 +417,6 @@ tutorial = Tutorial tutorial.retake = Re-Take Tutorial editor = Editor mapeditor = Map Editor -donate = Donate abandon = Abandon abandon.text = This zone and all its resources will be lost to the enemy. @@ -516,6 +524,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 @@ -538,6 +547,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} @@ -584,8 +594,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)[] @@ -606,12 +618,14 @@ 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.fullscreen.name = Fullscreen setting.borderlesswindow.name = Borderless Window[lightgray] (may require restart) -setting.fps.name = Show FPS +setting.fps.name = Show FPS & Ping setting.vsync.name = VSync setting.pixelate.name = Pixelate[lightgray] (disables animations) setting.minimap.name = Show Minimap @@ -640,14 +654,13 @@ category.multiplayer.name = Multiplayer command.attack = Attack command.rally = Rally command.retreat = Retreat -keybind.gridMode.name = Block Select -keybind.gridModeShift.name = Category Select 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.mouse_move.name = Follow Mouse keybind.schematic_select.name = Select Region keybind.schematic_menu.name = Schematic Menu keybind.schematic_flip_x.name = Flip Schematic X @@ -853,6 +866,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 @@ -991,7 +1006,8 @@ 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 = 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.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.[] @@ -1076,6 +1092,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. @@ -1095,10 +1113,10 @@ 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. +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. @@ -1111,7 +1129,7 @@ block.liquid-junction.description = Acts as a bridge for two crossing conduits. block.bridge-conduit.description = Advanced liquid transport block. Allows transporting liquids over up to 3 tiles of any terrain or building. block.phase-conduit.description = Advanced liquid transport block. Uses power to teleport liquids to a connected phase conduit over several tiles. block.power-node.description = Transmits power to connected nodes. The node will receive power from or supply power to any adjacent blocks. -block.power-node-large.description = An advanced power node with greater range and more connections. +block.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.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. diff --git a/core/assets/bundles/bundle_cs.properties b/core/assets/bundles/bundle_cs.properties index c8210aeefa..3efab82fc0 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 @@ -16,11 +17,29 @@ screenshot.invalid = Mapa je moc velká, nemusí být dost paměti pro snímek o gameover = Konec hry gameover.pvp = [accent] {0}[] Tým Vyhrál! highscore = [accent]Nový rekord! +copied = Copied. load.sound = Zvuky load.map = Mapy load.image = Obrázky load.content = Obsah load.system = System +load.mod = Mods +schematic = Schematic +schematic.add = Save Schematic... +schematics = Schematics +schematic.replace = A schematic by that name already exists. Replace it? +schematic.import = Import Schematic... +schematic.exportfile = Export File +schematic.importfile = Import File +schematic.browseworkshop = Browse Workshop +schematic.copy = Copy to Clipboard +schematic.copy.import = Import from Clipboard +schematic.shareworkshop = Share on Workshop +schematic.flip = [accent][[{0}][]/[accent][[{1}][]: Flip Schematic +schematic.saved = Schematic saved. +schematic.delete.confirm = This schematic will be utterly eradicated. +schematic.rename = Rename Schematic +schematic.info = {0}x{1}, {2} blocks stat.wave = Vln poraženo:[accent] {0} stat.enemiesDestroyed = Nepřátel zničeno:[accent] {0} stat.built = Budov postaveno:[accent] {0} @@ -29,6 +48,7 @@ stat.deconstructed = Budov rozebráno:[accent] {0} stat.delivered = Materiálu odesláno: stat.rank = Závěrečné hodnocení: [accent]{0} launcheditems = [accent]Odeslané předměty +launchinfo = [unlaunched][[LAUNCH] your core to obtain the items indicated in blue. map.delete = Jsi si jistý že chceš smazat mapu "[accent]{0}[]"? level.highscore = Nejvyšší skóre: [accent]{0} level.select = Výběr levelu @@ -40,26 +60,50 @@ database = Databáze objektů savegame = Uložit hru loadgame = Načíst hru joingame = Připojit se ke hře -addplayers = Přidat/Odebrat hráče customgame = Vlastní hra newgame = Nová hra none = <žádný> minimap = Minimapa +position = Position close = Zavřít website = Web. stránky quit = Ukončit -save.quit = Save & Quit +save.quit = Uložit a ukončit maps = Mapy -maps.browse = Browse Maps +maps.browse = Procházet mapy continue = Pokračovat maps.none = [LIGHT_GRAY]Žádné mapy nebyly nalezeny! -invalid = Invalid -preparingconfig = Preparing Config -preparingcontent = Preparing Content -uploadingcontent = Uploading Content -uploadingpreviewfile = Uploading Preview File -committingchanges = Comitting Changes -done = Done +invalid = Neplatné +preparingconfig = Připravuji Config +preparingcontent = Připravuji obsah +uploadingcontent = Nahrávám obsah +uploadingpreviewfile = Nahrávám prohlížecí soubor +committingchanges = Provádím změny +done = Hotovo +feature.unsupported = Your device does not support this feature. +mods.alphainfo = Keep in mind that mods are in alpha, and[scarlet] may be very buggy[].\nReport any issues you find to the Mindustry Github or Discord. +mods.alpha = [accent](Alpha) +mods = Mods +mods.none = [LIGHT_GRAY]No mods found! +mods.guide = Modding Guide +mods.report = Report Bug +mods.openfolder = Open Mod Folder +mod.enabled = [lightgray]Enabled +mod.disabled = [scarlet]Disabled +mod.disable = Disable +mod.delete.error = Unable to delete mod. File may be in use. +mod.missingdependencies = [scarlet]Missing dependencies: {0} +mod.nowdisabled = [scarlet]Mod '{0}' is missing dependencies:[accent] {1}\n[lightgray]These mods need to be downloaded first.\nThis mod will be automatically disabled. +mod.enable = Enable +mod.requiresrestart = The game will now close to apply the mod changes. +mod.reloadrequired = [scarlet]Reload Required +mod.import = Import Mod +mod.import.github = Import Github Mod +mod.remove.confirm = This mod will be deleted. +mod.author = [LIGHT_GRAY]Author:[] {0} +mod.missing = This save contains mods that you have recently updated or no longer have installed. Save corruption may occur. Are you sure you want to load it?\n[lightgray]Mods:\n{0} +mod.preview.missing = Before publishing this mod in the workshop, you must add an image preview.\nPlace an image named[accent] preview.png[] into the mod's folder and try again. +mod.folder.missing = Only mods in folder form can be published on the workshop.\nTo convert any mod into a folder, simply unzip its file into a folder and delete the old zip, then restart your game or reload your mods. about.button = O hře name = Jméno: noname = Nejdřív si vyber[accent] herní jméno[]. @@ -68,20 +112,20 @@ unlocked = Nový blok odemknut! completed = [accent]Dokončeno techtree = Technologie research.list = [LIGHT_GRAY]Výzkum: -research = Zkoumej +research = Výzkum researched = [LIGHT_GRAY]{0} vyzkoumán(o). players = {0} hráčů online players.single = {0} hráč online server.closing = [accent]Zavírám server... server.kicked.kick = Byl jsi vykopnut ze serveru! -server.kicked.whitelist = You are not whitelisted here. +server.kicked.whitelist = Na server ti nebyl udělen přístup. server.kicked.serverClose = Server je zavřený. -server.kicked.vote = You have been vote-kicked. Goodbye. +server.kicked.vote = Byl jsi odhlasován a vykopnut. Sbohem. server.kicked.clientOutdated = Zastaralý klient hry! Aktualizuj si hru! server.kicked.serverOutdated = Zastaralý server! Řekni hostiteli o aktualizaci! server.kicked.banned = Jsi zabanován na tomto serveru. -server.kicked.typeMismatch = This server is not compatible with your build type. -server.kicked.playerLimit = This server is full. Wait for an empty slot. +server.kicked.typeMismatch = Tento server není kompatibilní s verzí tvého klienta +server.kicked.playerLimit = Tento server je plný, vyčkej na volné místo. server.kicked.recentKick = Před nedávnem jsi byl vykopnut.\nPočkej než se znovu připojíš. server.kicked.nameInUse = Někdo se stejným jménem\nje aktuálně na serveru. server.kicked.nameEmpty = Tvé jméno je neplatné. @@ -92,13 +136,13 @@ server.versions = Verze klienta:[accent] {0}[]\nVerze serveru:[accent] {1}[] host.info = [accent]hostitel[] hostuje server na portu [scarlet]6567[]. \nKdokoliv na stejné [LIGHT_GRAY]wifi nebo místní síti[] by měl vidět server ve svém listu serverů.\n\nJestli chcete aby se uživatelé připojovali odkudkoliv pomocí IP, [accent]přesměrování portů[] je nutné.\n\n[LIGHT_GRAY]Poznámka: Jestli někdo má problém s připojením ke své LAN hře, ujistěte se že má Mindustry povolený přístup k místní síti v nastavení Firewallu. join.info = Tady můžeš vložit [accent]IP serveru[] ke kterému se chceš připojit, nebo objevit [accent]Servery Místní sítě[] ke kterým se chceš připojit.\nLAN i Multiplayer jsou podporovány.\n\n[LIGHT_GRAY]Poznámka: Není žádný globální seznam serverů; Pokud se budeš chtít připojit k někomu pomocí IP, budeš jí muset znát od hostitele. hostserver = Hostovat hru -invitefriends = Invite Friends +invitefriends = Pozvat přátele hostserver.mobile = Hostovat\nHru host = Hostitel hosting = [accent]Otevírám server... hosts.refresh = Obnovit hosts.discovering = Hledám hry LAN -hosts.discovering.any = Discovering games +hosts.discovering.any = Hledám hry server.refreshing = Obnovuji servery hosts.none = [lightgray]Žádné místní hry nebyly nalezeny! host.invalid = [scarlet]Nejde se připojit k hostiteli. @@ -106,7 +150,7 @@ trace = Vystopovat hráče trace.playername = Jméno hráče: [accent]{0} trace.ip = IP: [accent]{0} trace.id = Unikátní ID: [accent]{0} -trace.mobile = Mobile Client: [accent]{0} +trace.mobile = Mobilní klient: [accent]{0} trace.modclient = Vlastní Klient: [accent]{0} invalidid = Neplatná IP klienta! Poslat zprávu o chybě. server.bans = Bany. @@ -122,25 +166,24 @@ server.version = [lightgray]Verze: {0} {1} server.custombuild = [yellow]Vlastní verze confirmban = Jsi si jistý že chceš zabanovat tohoto hráče? confirmkick = Jsi si jistý že chceš vykopnout tohoto hráče? -confirmvotekick = Are you sure you want to vote-kick this player? +confirmvotekick = Jsi si jistý že chceš hlasovat pro vykopnutí tohoto hráče? confirmunban = Jsi si jistý že chceš odbanovat tohoto hráče confirmadmin = Jsi si jistý že chceš tohoto hráče pasovat na admina? confirmunadmin = Jsi si jistý že chceš odebrat práva tomuto hráči? joingame.title = Připojit se ke hře joingame.ip = Adresa: disconnect = Odpojen. -disconnect.error = Connection error. -disconnect.closed = Connection closed. -disconnect.timeout = Timed out. +disconnect.error = Chyba připojení. +disconnect.closed = Připojení bylo uzavřeno. +disconnect.timeout = Vypršel čas pro připojení. disconnect.data = Chyba načtení dat světa! -cantconnect = Unable to join game ([accent]{0}[]). +cantconnect = Není možno připojit se ke hře ([accent]{0}[]). connecting = [accent]Připojuji se... connecting.data = [accent]Načítám data světa... server.port = Port: server.addressinuse = Adresu již někdo používá! server.invalidport = Neplatné číslo portu! server.error = [crimson]Chyba při hostování serveru: [accent]{0} -save.old = Tato uložená pozice je pro starší verzi hry a již není možno jí použít.\n\n[LIGHT_GRAY]Zpětná kompatibilita bude implementována v plné verzi 4.0. save.new = Nové uložení save.overwrite = Jsi si jistý že chceš přepsat\ntento ukládaci slot? overwrite = Přepsat @@ -159,7 +202,7 @@ save.rename = Přejmenovat save.rename.text = Nové jméno: selectslot = Vyber uložení. slot = [accent]Slot {0} -editmessage = Edit Message +editmessage = Upravit zprávu save.corrupted = [accent]Uložení je poškozené nebo neplatné\nPokud jsi právě aktualizoval svou hru, je to možná změnou formátu pro ukládání a [scarlet]NE[] chyba hry. empty = on = On @@ -167,13 +210,14 @@ off = Off save.autosave = Automatické uložení: {0} save.map = Mapa: {0} save.wave = Vlna {0} -save.mode = Gamemode: {0} +save.mode = Herní mod: {0} save.date = Naposledy uloženo: {0} save.playtime = Herní čas: {0} warning = Varování. confirm = Potvrdit delete = Smazat -view.workshop = View In Workshop +view.workshop = Prohlédnout ve workshopu +workshop.listing = Edit Workshop Listing ok = OK open = Otevřít customize = Přizpůsobit @@ -187,11 +231,16 @@ data.exported = Data exportována. data.invalid = Neplatná herní data. data.import.confirm = Import externích dat smaže[scarlet] všechna[] vaše současná herní data.\n[accent]To nelze vrátit zpět![]\n\nPo importu data se hra ukončí. classic.export = Exportovat klasická data -classic.export.text = [accent]Mindustry[] has just had a major update.\nClassic (v3.5 build 40) save or map data has been detected. Would you like to export these saves to your phone's home folder, for use in the Mindustry Classic app? +classic.export.text = [accent]Mindustry[] právě mělo významně velkou aktualizaci.\nKlasické (v3.5 build 40) uložení nebo mapa byly detekovány. Chtěl by jsi exportovat toto uložení do domácího adresáře tvého zařízení , pro pozdější použití v klasické verzi Mindustry ? quit.confirm = Jsi si jistý že chceš ukončit ? quit.confirm.tutorial = Jste si vážně jist?\nTutoriál se dá znovu spustit v[accent] Nastavení->Hra->Spusť Tutoriál.[] loading = [accent]Načítám... +reloading = [accent]Reloading Mods... saving = [accent]Ukládám... +cancelbuilding = [accent][[{0}][] to clear plan +selectschematic = [accent][[{0}][] to select+copy +pausebuilding = [accent][[{0}][] to pause building +resumebuilding = [scarlet][[{0}][] to resume building wave = [accent]Vlna {0} wave.waiting = [LIGHT_GRAY]Vlna za {0} wave.waveInProgress = [LIGHT_GRAY]Vlna v pohybu @@ -210,11 +259,18 @@ map.nospawn = Tato mapa nemá žádné jádro pro hráče ke spawnutí! Přidej map.nospawn.pvp = Tato mapa nemá žádné nepřátelské jádro pro druhého hráče! Přidej v editoru do této mapy[SCARLET] červené[] jádro. map.nospawn.attack = Tato mapa nemá žádná nepřátelská jádra ke zničení! Přidej v editoru do této mapy [SCARLET] červené[] jádro. map.invalid = Chyba v načítání mapy: poškozený nebo neplatný soubor mapy. -map.publish.error = Error publishing map: {0} -map.publish.confirm = Are you sure you want to publish this map?\n\n[lightgray]Make sure you agree to the Workshop EULA first, or your maps will not show up! -eula = Steam EULA -map.publish = Map published. -map.publishing = [accent]Publishing map... +workshop.update = Update Item +workshop.error = Error fetching workshop details: {0} +map.publish.confirm = Jsi si jistý že chceš publikovat tuto mapu?\n\n[lightgray]Ujisti se že jsi nejprve souhlasil se smluvními podmínkami workshopu, tvá mapa se jinak nezobrazí. +workshop.menu = Select what you would like to do with this item. +workshop.info = Item Info +changelog = Changelog (optional): +eula = Smluvní podmínky 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} +steam.error = Failed to initialize Steam services.\nError: {0} editor.brush = Štětec editor.openin = Otevřít v editoru. editor.oregen = Generovat nerostné zdroje. @@ -222,46 +278,46 @@ editor.oregen.info = Generování nerostných zdrojů: editor.mapinfo = Informace o mapě editor.author = Autor: editor.description = Popis: -editor.nodescription = A map must have a description of at least 4 characters before being published. +editor.nodescription = Tvá mapa musí mít popisek minimálně o 4 znacích aby mohla být publikována editor.waves = Vln: editor.rules = Pravidla: -editor.generation = Generation: -editor.ingame = Edit In-Game -editor.publish.workshop = Publish On Workshop +editor.generation = Generace: +editor.ingame = Upravit ve hře +editor.publish.workshop = Publikovat na workshop editor.newmap = Nová mapa workshop = Workshop -waves.title = Waves -waves.remove = Remove -waves.never = -waves.every = every -waves.waves = wave(s) -waves.perspawn = per spawn -waves.to = to -waves.boss = Boss -waves.preview = Preview -waves.edit = Edit... -waves.copy = Copy to Clipboard -waves.load = Load from Clipboard -waves.invalid = Invalid waves in clipboard. -waves.copied = Waves copied. -waves.none = No enemies defined.\nNote that empty wave layouts will automatically be replaced with the default layout. -editor.default = [LIGHT_GRAY] -details = Details... -edit = Edit... +waves.title = Vln +waves.remove = Odebrat +waves.never = +waves.every = každých +waves.waves = vln(y) +waves.perspawn = za zrození +waves.to = do +waves.boss = Bosse +waves.preview = Prohlížet +waves.edit = Upravit.... +waves.copy = Uložit do schránky +waves.load = Načíst ze schránky +waves.invalid = Neplatné vlny ve schránce +waves.copied = Vln zkopírováno. +waves.none = Žádní nepřátelé definováni.\nPřipomínka toho že prázdné rozložení vln se automaticky změní na výchozí nastavení. +editor.default = [LIGHT_GRAY] +details = Detaily... +edit = Upravit editor.name = Jméno: -editor.spawn = Spawn Unit -editor.removeunit = Remove Unit +editor.spawn = Zrodit jednotku. +editor.removeunit = Odebrat jednotku. editor.teams = Týmy -editor.errorload = Error loading file:\n[accent]{0} -editor.errorsave = Error saving file:\n[accent]{0} -editor.errorimage = That's an image, not a map. Don't go around changing extensions expecting it to work.\n\nIf you want to import a legacy map, use the 'import legacy map' button in the editor. -editor.errorlegacy = This map is too old, and uses a legacy map format that is no longer supported. -editor.errornot = This is not a map file. -editor.errorheader = This map file is either not valid or corrupt. -editor.errorname = Map has no name defined. -editor.update = Update -editor.randomize = Randomize -editor.apply = Apply +editor.errorload = Chyba při načítání souboru:\n[accent]{0} +editor.errorsave = Chyba při ukládání souboru:\n[accent]{0} +editor.errorimage = Toto je obrázek a ne mapa,nemysli si že změnou formátu souboru tohle obejdeš s tím že to bude fungovat.\n\nJestli chceš použít legacy mapu, použij 'importovat legacy mapu' v menu editoru. +editor.errorlegacy = Tato mapa je příliš stará a užití legacy formátu již dávno není podporováno. +editor.errornot = Toto není soubor mapy. +editor.errorheader = Tento soubor mapy je buď neplatný a nebo poškozen. +editor.errorname = Mapa nemá definované jméno. +editor.update = Aktualizovat +editor.randomize = Náhodně +editor.apply = Aplikovat editor.generate = Generovat editor.resize = Změnit velikost editor.loadmap = Načíst mapu @@ -289,96 +345,98 @@ editor.resizemap = Změnit velikost mapy editor.mapname = Jméno mapy: editor.overwrite = [accent]Varování!\nToto přepíše již existující mapu. editor.overwrite.confirm = [scarlet]Varování![] Mapa s tímto jménem již existuje. Jsi si jistý že ji chceš přepsat? -editor.exists = A map with this name already exists. +editor.exists = Mapa s tímto jménem již existuje. editor.selectmap = Vyber mapu k načtení: -toolmode.replace = Replace -toolmode.replace.description = Draws only on solid blocks. -toolmode.replaceall = Replace All -toolmode.replaceall.description = Replace all blocks in map. -toolmode.orthogonal = Orthogonal -toolmode.orthogonal.description = Draws only orthogonal lines. -toolmode.square = Square -toolmode.square.description = Square brush. -toolmode.eraseores = Erase Ores -toolmode.eraseores.description = Erase only ores. -toolmode.fillteams = Fill Teams -toolmode.fillteams.description = Fill teams instead of blocks. -toolmode.drawteams = Draw Teams -toolmode.drawteams.description = Draw teams instead of blocks. -filters.empty = [LIGHT_GRAY]No filters! Add one with the button below. -filter.distort = Distort -filter.noise = Noise -filter.median = Median -filter.oremedian = Ore Median -filter.blend = Blend -filter.defaultores = Default Ores -filter.ore = Ore -filter.rivernoise = River Noise -filter.mirror = Mirror -filter.clear = Clear -filter.option.ignore = Ignore -filter.scatter = Scatter -filter.terrain = Terrain -filter.option.scale = Scale -filter.option.chance = Chance -filter.option.mag = Magnitude -filter.option.threshold = Threshold -filter.option.circle-scale = Circle Scale -filter.option.octaves = Octaves -filter.option.falloff = Falloff -filter.option.angle = Angle -filter.option.block = Block -filter.option.floor = Floor -filter.option.flooronto = Target Floor -filter.option.wall = Wall -filter.option.ore = Ore -filter.option.floor2 = Secondary Floor -filter.option.threshold2 = Secondary Threshold -filter.option.radius = Radius -filter.option.percentile = Percentile +toolmode.replace = Nahradit. +toolmode.replace.description = Kreslí jen na pevných blocích. +toolmode.replaceall = Nahradit vše +toolmode.replaceall.description = Nahradit všechny bloky na mapě. +toolmode.orthogonal = Ortogonální +toolmode.orthogonal.description = Kreslí jen Ortogonální linie. +toolmode.square = Čtverec +toolmode.square.description = Čtvercový štětec. +toolmode.eraseores = Maže rudy. +toolmode.eraseores.description = Maže jen rudy. +toolmode.fillteams = Doplnit skupinu +toolmode.fillteams.description = Doplní hromadně namísto po blocích. +toolmode.drawteams = Kreslí skupiny +toolmode.drawteams.description = Kreslí skupiny namísto po blocích. +filters.empty = [LIGHT_GRAY]Žádné filtry! Přidej ho tlačítkem níže. +filter.distort = Distorze +filter.noise = Hluk +filter.median = Medián +filter.oremedian = Medián rud +filter.blend = Splynutí +filter.defaultores = Výchozí bloky +filter.ore = Rudy +filter.rivernoise = Hluk řek +filter.mirror = Zrcadlit +filter.clear = Vyčistit +filter.option.ignore = Ignorovat +filter.scatter = Rozházet +filter.terrain = Terén +filter.option.scale = Měřítko +filter.option.chance = Šance +filter.option.mag = Velikost +filter.option.threshold = Práh +filter.option.circle-scale = Měřítko kruhu +filter.option.octaves = Octávy +filter.option.falloff = Spád +filter.option.angle = Úhel +filter.option.block = Blok +filter.option.floor = Podlaha +filter.option.flooronto = Cílová podlaha +filter.option.wall = Stěna +filter.option.ore = Ruda +filter.option.floor2 = Sekundární podlaží +filter.option.threshold2 = Sekundární podlaží +filter.option.radius = Poloměr +filter.option.percentile = Percentil width = Šířka: height = Výška: menu = Hlavní menu play = Hrát -campaign = Campaign +campaign = Kampaň load = Načíst save = Uložit fps = FPS: {0} -tps = TPS: {0} ping = Odezva: {0}ms language.restart = Prosím restartuj hru aby se provedla změna jazyka! settings = Nastavení tutorial = Tutoriál -tutorial.retake = Re-Take Tutorial +tutorial.retake = Zopáknout si výuku. editor = Editor mapeditor = Editor map -donate = Darovat -abandon = Abandon -abandon.text = This zone and all its resources will be lost to the enemy. -locked = Locked -complete = [LIGHT_GRAY]Complete: -zone.requirement = Wave {0} in zone {1} -resume = Resume Zone:\n[LIGHT_GRAY]{0} -bestwave = [LIGHT_GRAY]Best: {0} -launch = Launch -launch.title = Launch Successful -launch.next = [LIGHT_GRAY]next opportunity at wave {0} -launch.unable2 = [scarlet]Unable to LAUNCH.[] -launch.confirm = This will launch all resources in your core.\nYou will not be able to return to this base. -launch.skip.confirm = If you skip now, you will not be able to launch until later waves. -uncover = Uncover -configure = Configure Loadout -configure.locked = [LIGHT_GRAY]Reach wave {0}\nto configure loadout. -configure.invalid = Amount must be a number between 0 and {0}. -zone.unlocked = [LIGHT_GRAY]{0} unlocked. -zone.requirement.complete = Wave {0} reached:\n{1} zone requirements met. -zone.config.complete = Wave {0} reached:\nLoadout config unlocked. -zone.resources = Resources Detected: -zone.objective = [lightgray]Objective: [accent]{0} -zone.objective.survival = Survive -zone.objective.attack = Destroy Enemy Core -add = Add... -boss.health = Boss Health +abandon = Opustit +abandon.text = Tato zóna a všechny její zdroje připadnou nepříteli. +locked = Zamčeno +complete = [LIGHT_GRAY]Hotovo: +requirement.wave = Reach Wave {0} in {1} +requirement.core = Destroy Enemy Core in {0} +requirement.unlock = Unlock {0} +resume = Zpět k zóně:\n[LIGHT_GRAY]{0} +bestwave = [LIGHT_GRAY]Nejlepší: {0} +launch = Vyslat +launch.title = Vyslání úspěšné +launch.next = [LIGHT_GRAY]další možnost až ve vlně {0} +launch.unable2 = [scarlet]Není možno vyslat.[] +launch.confirm = Toto vyšle veškeré suroviny ve tvém jádru .\nJiž se na tuto základnu nebudeš moci vrátit. +launch.skip.confirm = Jestli teď zůstaneš, budeš moci odejít až v pozdější fázi. +uncover = Odkrýt +configure = Přizpůsobit vybavení +bannedblocks = Banned Blocks +addall = Add All +configure.locked = [LIGHT_GRAY]Dosáhni vlny {0}\nk nastavení svého vybavení. +configure.invalid = Hodnota musí být mezi 0 a{0}. +zone.unlocked = [LIGHT_GRAY]{0} odemčeno. +zone.requirement.complete = Vlna {0} dosažena:\n{1} podmínky zóny splněny. +zone.config.unlocked = Loadout unlocked:[lightgray]\n{0} +zone.resources = Suroviny detekovány: +zone.objective = [lightgray]Cíl: [accent]{0} +zone.objective.survival = Přežij +zone.objective.attack = Znič nepřátelské jádro +add = Přidat +boss.health = Životy bosse connectfail = [crimson]Nepovedlo se připojení k serveru:\n\n[accent]{0} error.unreachable = Server je nedostupný.\nJe adresa napsaná správně? error.invalidaddress = Neplatná adresa. @@ -386,39 +444,39 @@ error.timedout = Čas vypršel!\nUjisti se že hostitel má nastavené přesměr error.mismatch = Chyba Packetu:\nKlient/Verze serveru se neshodují.\nUjisti se že máš nejnovější verzi Mindustry! error.alreadyconnected = Již připojeno. error.mapnotfound = Soubor mapy nebyl nalezen! -error.io = Network I/O error. +error.io = Chyba I/O sítě. error.any = neznámá chyba sítě. -error.bloom = Failed to initialize bloom.\nYour device may not support it. -zone.groundZero.name = Ground Zero -zone.desertWastes.name = Desert Wastes -zone.craters.name = The Craters -zone.frozenForest.name = Frozen Forest -zone.ruinousShores.name = Ruinous Shores -zone.stainedMountains.name = Stained Mountains -zone.desolateRift.name = Desolate Rift -zone.nuclearComplex.name = Nuclear Production Complex -zone.overgrowth.name = Overgrowth -zone.tarFields.name = Tar Fields -zone.saltFlats.name = Salt Flats -zone.impact0078.name = Impact 0078 -zone.crags.name = Crags -zone.fungalPass.name = Fungal Pass -zone.groundZero.description = The optimal location to begin once more. Low enemy threat. Few resources.\nGather as much lead and copper as possible.\nMove on. -zone.frozenForest.description = Even here, closer to mountains, the spores have spread. The fridgid temperatures cannot contain them forever.\n\nBegin the venture into power. Build combustion generators. Learn to use menders. -zone.desertWastes.description = These wastes are vast, unpredictable, and criss-crossed with derelict sector structures.\nCoal is present in the region. Burn it for power, or synthesize graphite.\n\n[lightgray]This landing location cannot be guaranteed. -zone.saltFlats.description = On the outskirts of the desert lie the Salt Flats. Few resources can be found in this location.\n\nThe enemy has erected a resource storage complex here. Eradicate their core. Leave nothing standing. -zone.craters.description = Water has accumulated in this crater, relic of the old wars. Reclaim the area. Collect sand. Smelt metaglass. Pump water to cool turrets and drills. -zone.ruinousShores.description = Past the wastes, is the shoreline. Once, this location housed a coastal defense array. Not much of it remains. Only the most basic defense structures have remained unscathed, everything else reduced to scrap.\nContinue the expansion outwards. Rediscover the technology. -zone.stainedMountains.description = Further inland lie the mountains, yet untainted by spores.\nExtract the abundant titanium in this area. Learn how to use it.\n\nThe enemy presence is greater here. Do not give them time to send their strongest units. -zone.overgrowth.description = This area is overgrown, closer to the source of the spores.\nThe enemy has established an outpost here. Build dagger units. Destroy it. Reclaim that which was lost. -zone.tarFields.description = The outskirts of an oil production zone, between the mountains and desert. One of the few areas with usable tar reserves.\nAlthough abandoned, this area has some dangerous enemy forces nearby. Do not underestimate them.\n\n[lightgray]Research oil processing technology if possible. -zone.desolateRift.description = An extremely dangerous zone. Plentiful resources, but little space. High risk of destruction. Leave as soon as possible. Do not be fooled by the long spacing between enemy attacks. -zone.nuclearComplex.description = A former facility for the production and processing of thorium, reduced to ruins.\n[lightgray]Research the thorium and its many uses.\n\nThe enemy is present here in great numbers, constantly scouting for attackers. -zone.fungalPass.description = A transition area between high mountains and lower, spore-ridden lands. A small enemy reconnaissance base is located here.\nDestroy it.\nUse Dagger and Crawler units. Take out the two cores. -zone.impact0078.description = -zone.crags.description = +error.bloom = Chyba inicializace bloomu.\nTvé zařízení ho nemusí podporovat. +zone.groundZero.name = Zóna dopadu +zone.desertWastes.name = Pouštní Odpady +zone.craters.name = Krátery +zone.frozenForest.name = Zmrzlý les +zone.ruinousShores.name = Zničující pobřeží +zone.stainedMountains.name = Poskvrněné hory +zone.desolateRift.name = Trhlina pustoty +zone.nuclearComplex.name = Komplex nukleární produkce +zone.overgrowth.name = Porost +zone.tarFields.name = Tarová pole +zone.saltFlats.name = Solné nížiny +zone.impact0078.name = Dopad 0078 +zone.crags.name = Praskliny +zone.fungalPass.name = Houbový průsmyk +zone.groundZero.description = Optimální lokace kde znovu začít. Nízký výskyt nepřátel. Pár surovin.\nPosbírej co nejvíce olova a mědi.\nBěž dál. +zone.frozenForest.description = Dokonce tady, blíž k horám se spóry dokázaly rozrůst. Tyto mrazivé teploty je nemohou zadržet navěky.\n\nZačni pracovat s pomocí energie. Stav spalovací generátory. Nauč se jak používat opravovací věže. +zone.desertWastes.description = Tyto odpadní zóny jsou rozsáhlé, nepředvídatelné a skrz naskrz se hemží opuštěnými budovami.\nV této oblasti se hojně vyskytuje uhlí. Spal ho v generátorech na energii nebo syntetizuj na Grafit.\n\n[lightgray]Tato výsadková zóna není garantovaná. +zone.saltFlats.description = Na okraji pouště leží Solné nížiny. V této lokaci se nachází nemnoho surovin.\n\nNepřítel zde vybudoval zásobovací komplex. Znič jeho jádro. Nenechej kámen na kameni. +zone.craters.description = V těchto kráterech jenž jsou relikvie starých válek,se nahromadilo velké množství vody. Zmocni se této oblasti. Sbírej písek. Vyrob z něj sklo. Použij vodu k chlazení svých vrtů a střílen. +zone.ruinousShores.description = Za odpadní zónou se nachází pobřeží. Kdysi tuto oblast obýval pobřežní obranný sytém. Moc z něj nezbylo. Jen ty nejprimitivnější struktůry zůstaly nerozprášeny, zbytek padl jen v kusy oceli.\nPokračuj ve své expanzi hlouběji. Objev ztracenou technologii. +zone.stainedMountains.description = Dále ve vnitrozemí leží hory, dosud neposkvrněny spóry.\nVytěž tuto oblast oplývající titániem. Nauč se ho používat.\n\nPřítomnost nepřátelských jednotek je zde větší. Nedej jim čas na vytasení jejich největšího kalibru. +zone.overgrowth.description = Tato přerostlá džungle se nachází blíže ke zdroji spór.\nNepřítel zde zbudoval základnu. Postav jednotky Dagger a znič ji. Získej to co mělo být dávno ztraceno. +zone.tarFields.description = Hranice produkční ropné oblasti mezi horami a pouští. Jedna z mála oblastí kde se stále nachází Tar.\nAčkoliv se oblast zdá opuštěná, stále se zde nachází nepřátelské jednotky s velkou silou. Není radno je podcenit.\n\n[lightgray]Vyzkoumej technologii na produkci surovin z ropy. +zone.desolateRift.description = Extrémně nebezpečná zóna. Za cenu prostoru se zde nachází přehršel surovin. Vysoká šance na sebedestrukci. Opusť tuto oblast co nejdříve to půjde. Nenech se zmást dlouhými prodlevami mezi vlnami nepřátel. +zone.nuclearComplex.description = Bývalá továrna na zpracování thoria, dnes leží v troskách.\n[lightgray]Objev thorium a jeho široké využití.\n\nNepřátelské jednotky se zde nacházejí v hojném počtu, neustále prohledává okolí kvůli útočníkůn. +zone.fungalPass.description = Přechodová oblast mezi vysokými horami a spóry nasycenou zemí. Nachází se zde malá průzkumná základna tvého nepřítele.\nZnič ji.\nPoužij Dagger a Crawler jednotky. Znič obě nepřátelské já. +zone.impact0078.description = +zone.crags.description = settings.language = Jazyk -settings.data = Game Data +settings.data = Data hry settings.reset = nastavit výchozí settings.rebind = Přenastavit settings.controls = Ovládání @@ -428,74 +486,75 @@ settings.graphics = Zobrazení settings.cleardata = Resetovat data hry... settings.clear.confirm = Jsi si jistý že chceš resetovat obsah hry?\nTento krok je nevratný! settings.clearall.confirm = [scarlet]Varování![]\nToto vyresetuje všechna data, včetně uložení, map, odemykatelných a nastavení ovládání.\nJakmile stiskneš 'ok' data se vymažou a hra se automaticky ukončí. -settings.clearunlocks = Vymazání odemykatelných -settings.clearall = Vymazat všechno paused = [accent]< Pauza > +clear = Clear +banned = [scarlet]Banned yes = Ano no = Ne info.title = Informace error.title = [crimson]Objevila se chyba error.crashtitle = Objevila se chyba -attackpvponly = [scarlet]Only available in Attack/PvP modes -blocks.input = Input -blocks.output = Output +blocks.input = Vstup +blocks.output = Výstup blocks.booster = Booster block.unknown = [LIGHT_GRAY]??? blocks.powercapacity = Kapacita energie blocks.powershot = Energie na výstřel -blocks.damage = Damage +blocks.damage = Poškození blocks.targetsair = Zaměřuje vzdušné jednotky -blocks.targetsground = Targets Ground -blocks.itemsmoved = Move Speed -blocks.launchtime = Time Between Launches +blocks.targetsground = Zaměřuje pozemní jednotky +blocks.itemsmoved = Rychlost pohybu +blocks.launchtime = Čas mezi vysláním 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ů blocks.basepowergeneration = Základní generování energie -blocks.productiontime = Production Time -blocks.repairtime = Block Full Repair Time -blocks.speedincrease = Speed Increase -blocks.range = Range +blocks.productiontime = Čas produkce +blocks.repairtime = Čas do úplné opravy +blocks.speedincrease = Zvýšení rychlosti +blocks.range = Dosah blocks.drilltier = Vrtatelné blocks.drillspeed = Základní rychlost vrtu -blocks.boosteffect = Boost Effect -blocks.maxunits = Max Active Units +blocks.boosteffect = Efekt boostu +blocks.maxunits = Max. počet jednotek blocks.health = Životy -blocks.buildtime = Build Time -blocks.buildcost = Build Cost +blocks.buildtime = Čas stavby +blocks.buildcost = Cena stavby blocks.inaccuracy = Nepřesnost/výchylka blocks.shots = Střely blocks.reload = Střely za sekundu -blocks.ammo = Ammo -bar.drilltierreq = Better Drill Required -bar.drillspeed = Drill Speed: {0}/s -bar.efficiency = Efficiency: {0}% -bar.powerbalance = Power: {0} -bar.powerstored = Stored: {0}/{1} -bar.poweramount = Power: {0} -bar.poweroutput = Power Output: {0} -bar.items = Items: {0} -bar.capacity = Capacity: {0} -bar.liquid = Liquid -bar.heat = Heat -bar.power = Power -bar.progress = Build Progress -bar.spawned = Units: {0}/{1} -bullet.damage = [stat]{0}[lightgray] dmg -bullet.splashdamage = [stat]{0}[lightgray] area dmg ~[stat] {1}[lightgray] tiles -bullet.incendiary = [stat]incendiary -bullet.homing = [stat]homing -bullet.shock = [stat]shock -bullet.frag = [stat]frag -bullet.knockback = [stat]{0}[lightgray] knockback -bullet.freezing = [stat]freezing -bullet.tarred = [stat]tarred -bullet.multiplier = [stat]{0}[lightgray]x ammo multiplier -bullet.reload = [stat]{0}[lightgray]x reload +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} +bar.poweramount = Energie celkem: {0} +bar.poweroutput = Výstup energie: {0} +bar.items = Předměty: {0} +bar.capacity = Kpacita: {0} +bar.liquid = Tekutiny +bar.heat = Teplo +bar.power = Energie +bar.progress = Proces stavby +bar.spawned = Jednotek: {0}/{1} +bullet.damage = [stat]{0}[lightgray] poškození +bullet.splashdamage = [stat]{0}[lightgray] AOE ~[stat] {1}[lightgray] bloků +bullet.incendiary = [stat]zápalné +bullet.homing = [stat]samonaváděcí +bullet.shock = [stat]šokové +bullet.frag = [stat]trhavé +bullet.knockback = [stat]{0}[lightgray] odhození +bullet.freezing = [stat]ledové +bullet.tarred = [stat]tarové +bullet.multiplier = [stat]{0}[lightgray]x násobič střeliva +bullet.reload = [stat]{0}[lightgray]x nabití unit.blocks = Bloky unit.powersecond = jednotek energie/sekunda unit.liquidsecond = jednotek tekutin/sekundu @@ -504,8 +563,8 @@ unit.liquidunits = jednotek tekutin unit.powerunits = jednotek energie unit.degrees = úhly unit.seconds = sekundy -unit.persecond = /sec -unit.timesspeed = x speed +unit.persecond = /sek +unit.timesspeed = x rychlost unit.percent = % unit.items = předměty category.general = Všeobecné @@ -515,21 +574,23 @@ category.items = Předměty category.crafting = Vyžaduje category.shooting = Střílí category.optional = Volitelné vylepšení -setting.landscape.name = Lock Landscape -setting.shadows.name = Shadows -setting.linear.name = Linear Filtering -setting.animatedwater.name = Animated Water -setting.animatedshields.name = Animated Shields -setting.antialias.name = Antialias[LIGHT_GRAY] (requires restart)[] +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 +setting.animatedshields.name = Animované štíty +setting.antialias.name = Antialias[LIGHT_GRAY] (vyžaduje restart)[] setting.indicators.name = Indikátor pro spojence setting.autotarget.name = Automaticky zaměřuje -setting.keyboard.name = Mouse+Keyboard Controls -setting.touchscreen.name = Touchscreen Controls +setting.keyboard.name = Ovládání myš+klávesnice +setting.touchscreen.name = Ovládání dotykovým displejem setting.fpscap.name = Max FPS setting.fpscap.none = žádný setting.fpscap.text = {0} FPS -setting.uiscale.name = UI Scaling[lightgray] (require restart)[] -setting.swapdiagonal.name = Always Diagonal Placement +setting.uiscale.name = Škálování rozhraní[lightgray] (vyžaduje restart)[] +setting.swapdiagonal.name = Vždy pokládat diagonálně setting.difficulty.training = Trénink setting.difficulty.easy = lehká setting.difficulty.normal = normální @@ -538,15 +599,18 @@ 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 setting.fullscreen.name = Celá obrazovka -setting.borderlesswindow.name = Borderless Window[LIGHT_GRAY] (may require restart) +setting.borderlesswindow.name = Bezokrajové okno[LIGHT_GRAY] (může vyžadovat restart) setting.fps.name = Ukázat snímky/sekundu setting.vsync.name = Vertikální synchronizace -setting.pixelate.name = Pixelate [LIGHT_GRAY](may decrease performance) +setting.pixelate.name = Pixelizovat [LIGHT_GRAY](může snížit výkon) setting.minimap.name = Ukázat minimapu +setting.position.name = Show Player Position setting.musicvol.name = Hlasitost hudby setting.ambientvol.name = Ambient Volume setting.mutemusic.name = Ztišit hudbu @@ -558,8 +622,10 @@ setting.publichost.name = Public Game Visibility setting.chatopacity.name = Chat Opacity setting.lasersopacity.name = Power Laser Opacity setting.playerchat.name = Display In-Game Chat +public.confirm = Do you want to make your game public?\n[accent]Anyone will be able to join your games.\n[lightgray]This can be changed later in Settings->Game->Public Game Visibility. +public.beta = Note that beta versions of the game cannot make public lobbies. uiscale.reset = UI scale has been changed.\nPress "OK" to confirm this scale.\n[scarlet]Reverting and exiting in[accent] {0}[] settings... -uiscale.cancel = Cancel & Exit +uiscale.cancel = Ukončit a odejít setting.bloom.name = Bloom keybind.title = Přenastavit klávesy keybinds.mobile = [scarlet]Most keybinds here are not functional on mobile. Only basic movement is supported. @@ -569,13 +635,16 @@ category.multiplayer.name = Multiplayer command.attack = Útok command.rally = Rally command.retreat = Ústup -keybind.gridMode.name = Výběr bloků -keybind.gridModeShift.name = Výběr kategorie +keybind.clear_building.name = Clear Building keybind.press = Stiskni klívesu... keybind.press.axis = Stiskni osu nebo klávesu... keybind.screenshot.name = Sníměk mapy keybind.move_x.name = Pohyb na X keybind.move_y.name = Pohyb na 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 = Toggle Fullscreen keybind.select.name = Vybrat/Střílet keybind.diagonal_placement.name = Diagonal Placement @@ -587,12 +656,14 @@ keybind.zoom_hold.name = Přiblížení-podržení keybind.zoom.name = přiblížení keybind.menu.name = Hlavní nabídka keybind.pause.name = pauza +keybind.pause_building.name = Pause/Resume Building keybind.minimap.name = Minimap keybind.dash.name = Sprint keybind.chat.name = Chat keybind.player_list.name = Seznam hráčů keybind.console.name = Konzole keybind.rotate.name = Otočit +keybind.rotateplaced.name = Rotate Existing (Hold) keybind.toggle_menus.name = Přepínání nabídek keybind.chat_history_prev.name = Předchozí historie chatu keybind.chat_history_next.name = Další historie chatu @@ -604,6 +675,7 @@ mode.survival.name = Survival mode.survival.description = The normal mode. Limited resources and automatic incoming waves. mode.sandbox.name = Sandbox mode.sandbox.description = Nekonečné zdroje a žádný čas pro vlny nepřátel. +mode.editor.name = Editor mode.pvp.name = PvP mode.pvp.description = Bojuj proti ostatním hráčům v lokální síti. mode.attack.name = Útok @@ -654,7 +726,7 @@ item.spore-pod.name = Spore Pod item.sand.name = Písek item.blast-compound.name = Výbušná směs item.pyratite.name = Pyratite -item.metaglass.name = Metaglass +item.metaglass.name = Tvrzené sklo item.scrap.name = Scrap liquid.water.name = Voda liquid.slag.name = Slag @@ -771,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 @@ -790,6 +864,7 @@ block.junction.name = Křižovatka block.router.name = Směrovač block.distributor.name = Distributor block.sorter.name = Dělička +block.inverted-sorter.name = Inverted Sorter block.message.name = Message block.overflow-gate.name = Brána přetečení block.silicon-smelter.name = Silicon Smelter @@ -908,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.[] @@ -991,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é. @@ -1010,6 +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.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 c67d09a7b2..7b28a0c840 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) @@ -16,11 +17,29 @@ screenshot.invalid = Karte zu groß! Eventuell nicht ausreichend Arbeitsspeicher gameover = Der Kern wurde zerstört. gameover.pvp = Das[accent] {0}[] Team ist siegreich! highscore = [YELLOW] Neuer Highscore! +copied = Copied. load.sound = Sounds load.map = Maps load.image = Images load.content = Content load.system = System +load.mod = Mods +schematic = Schematic +schematic.add = Save Schematic... +schematics = Schematics +schematic.replace = A schematic by that name already exists. Replace it? +schematic.import = Import Schematic... +schematic.exportfile = Export File +schematic.importfile = Import File +schematic.browseworkshop = Browse Workshop +schematic.copy = Copy to Clipboard +schematic.copy.import = Import from Clipboard +schematic.shareworkshop = Share on Workshop +schematic.flip = [accent][[{0}][]/[accent][[{1}][]: Flip Schematic +schematic.saved = Schematic saved. +schematic.delete.confirm = This schematic will be utterly eradicated. +schematic.rename = Rename Schematic +schematic.info = {0}x{1}, {2} blocks stat.wave = Wellen besiegt:[accent] {0} stat.enemiesDestroyed = Gegner zerstört:[accent] {0} stat.built = Gebäude gebaut:[accent] {0} @@ -29,6 +48,7 @@ stat.deconstructed = Gebäude abgebaut:[accent] {0} stat.delivered = Übertragene Ressourcen: stat.rank = Finaler Rang: [accent]{0} launcheditems = [accent]Übertragene Items +launchinfo = [unlaunched][[LAUNCH] your core to obtain the items indicated in blue. map.delete = Bist du sicher, dass du die Karte "[accent]{0}[]" löschen möchtest? level.highscore = Highscore: [accent]{0} level.select = Level-Auswahl @@ -40,11 +60,11 @@ database = Kern-Datenbank savegame = Spiel speichern loadgame = Spiel laden joingame = Spiel beitreten -addplayers = Hinzufügen/Entfernen von Spielern customgame = Benutzerdefiniertes Spiel newgame = Neues Spiel none = minimap = Minimap +position = Position close = Schließen website = Website quit = Verlassen @@ -60,6 +80,30 @@ 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.alpha = [accent](Alpha) +mods = Mods +mods.none = [LIGHT_GRAY]No mods found! +mods.guide = Modding Guide +mods.report = Report Bug +mods.openfolder = Open Mod Folder +mod.enabled = [lightgray]Enabled +mod.disabled = [scarlet]Disabled +mod.disable = Disable +mod.delete.error = Unable to delete mod. File may be in use. +mod.missingdependencies = [scarlet]Missing dependencies: {0} +mod.nowdisabled = [scarlet]Mod '{0}' is missing dependencies:[accent] {1}\n[lightgray]These mods need to be downloaded first.\nThis mod will be automatically disabled. +mod.enable = Enable +mod.requiresrestart = The game will now close to apply the mod changes. +mod.reloadrequired = [scarlet]Reload Required +mod.import = Import Mod +mod.import.github = Import Github Mod +mod.remove.confirm = This mod will be deleted. +mod.author = [LIGHT_GRAY]Author:[] {0} +mod.missing = This save contains mods that you have recently updated or no longer have installed. Save corruption may occur. Are you sure you want to load it?\n[lightgray]Mods:\n{0} +mod.preview.missing = Before publishing this mod in the workshop, you must add an image preview.\nPlace an image named[accent] preview.png[] into the mod's folder and try again. +mod.folder.missing = Only mods in folder form can be published on the workshop.\nTo convert any mod into a folder, simply unzip its file into a folder and delete the old zip, then restart your game or reload your mods. about.button = Info name = Name: noname = Wähle zuerst einen[accent] Spielernamen[]. @@ -140,7 +184,6 @@ server.port = Port: server.addressinuse = Adresse bereits in Verwendung! server.invalidport = Falscher Port! server.error = [crimson] Fehler beim Hosten des Servers: [accent] {0} -save.old = Dieser Spielstand ist von einer älteren Version des Spiels, und kann nicht mehr verwendet werden.\n\n[LIGHT_GRAY]Abwärtskompatibilität von Speicherständen wird in der 4.0 Vollversion hinzugefügt. save.new = Neuer Spielstand save.overwrite = Möchtest du diesen Spielstand wirklich überschreiben? overwrite = Überschreiben @@ -174,6 +217,7 @@ warning = Warnung. confirm = Bestätigen delete = Löschen view.workshop = View In Workshop +workshop.listing = Edit Workshop Listing ok = OK open = Öffnen customize = Anpassen @@ -191,7 +235,12 @@ classic.export.text = [accent]Mindustry[] has just had a major update.\nClassic quit.confirm = Willst du wirklich aufhören? quit.confirm.tutorial = Are you sure you know what you're doing?\nThe tutorial can be re-taken in[accent] Settings->Game->Re-Take Tutorial.[] loading = [accent]Wird geladen... +reloading = [accent]Reloading Mods... saving = [accent]Speichere... +cancelbuilding = [accent][[{0}][] to clear plan +selectschematic = [accent][[{0}][] to select+copy +pausebuilding = [accent][[{0}][] to pause building +resumebuilding = [scarlet][[{0}][] to resume building wave = [accent]Welle {0} wave.waiting = Welle in {0} wave.waveInProgress = [LIGHT_GRAY]Welle im Gange @@ -210,11 +259,18 @@ map.nospawn = Diese Karte hat keine Kerne in denen die Spieler beginnen können! map.nospawn.pvp = Diese Karte hat keine gegnerischen Kerne wo Gegner starten könnten! Füge über den Editor [SCARLET] rote[] Kerne zu dieser Karte hinzu. map.nospawn.attack = Diese Karte hat keine gengnerischen Kerne, die Spieler angreifen können! Füge über den Editor [SCARLET] rote[] Kerne zu dieser Karte hinzu. map.invalid = Fehler beim Laden der Karte: Beschädigtes oder ungültige Karten Datei. -map.publish.error = Error publishing map: {0} +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 -map.publish = Map published. -map.publishing = [accent]Publishing map... +missing = This item has been deleted or moved.\n[lightgray]The workshop listing has now been automatically un-linked. +publishing = [accent]Publishing... +publish.confirm = Are you sure you want to publish this?\n\n[lightgray]Make sure you agree to the Workshop EULA first, or your items will not show up! +publish.error = Error publishing item: {0} +steam.error = Failed to initialize Steam services.\nError: {0} editor.brush = Pinsel editor.openin = Öffne im Editor editor.oregen = Erze generieren @@ -344,7 +400,6 @@ campaign = Kampagne load = Laden save = Speichern fps = FPS: {0} -tps = TPS: {0} ping = Ping: {0}ms language.restart = Bitte Starte dein Spiel neu, damit die Sprach-Einstellung aktiv wird. settings = Einstellungen @@ -352,12 +407,13 @@ tutorial = Tutorial tutorial.retake = Re-Take Tutorial editor = Editor mapeditor = Karten Editor -donate = Spenden abandon = Aufgeben abandon.text = Diese Zone sowie alle Ressourcen werden dem Gegner überlassen. locked = Gesperrt complete = [LIGHT_GRAY]Abschließen: -zone.requirement = Welle {0} in Zone {1} +requirement.wave = Reach Wave {0} in {1} +requirement.core = Destroy Enemy Core in {0} +requirement.unlock = Unlock {0} resume = Zu Zone zurückkehren:\n[LIGHT_GRAY]{0} bestwave = [LIGHT_GRAY]Beste Welle: {0} launch = Abschluss @@ -368,11 +424,13 @@ launch.confirm = Dies wird alle Ressourcen in deinen Kern übertragen.\nDu kanns launch.skip.confirm = If you skip now, you will not be able to launch until later waves. uncover = Freischalten configure = Startitems festlegen +bannedblocks = Banned Blocks +addall = Add All configure.locked = [LIGHT_GRAY]Erreiche Welle {0}\n, um Startitems festlegen zu können. configure.invalid = Amount must be a number between 0 and {0}. zone.unlocked = [LIGHT_GRAY]{0} freigeschaltet. zone.requirement.complete = Welle {0} erreicht:\n{1} Anforderungen der Zone erfüllt. -zone.config.complete = Welle {0} erreicht:\nFestlegen von Startitems freigeschaltet. +zone.config.unlocked = Loadout unlocked:[lightgray]\n{0} zone.resources = Ressourcen entdeckt: zone.objective = [lightgray]Ziel: [accent]{0} zone.objective.survival = Überlebe @@ -428,15 +486,14 @@ settings.graphics = Grafiken settings.cleardata = Spieldaten zurücksetzen... settings.clear.confirm = Bist du sicher, dass du die Spieldaten zurücksetzen willst?\n Diese Aktion kann nicht rückgängig gemacht werden! settings.clearall.confirm = [scarlet]Warnung![]\nDas wird jegliche Spieldaten zurücksetzen inklusive Speicherstände, Karten, Freischaltungen und Tastenbelegungen.\n Nachdem du 'OK' drückst wird alles zurückgesetzt und das Spiel schließt sich automatisch. -settings.clearunlocks = Freischaltungen zurücksetzen -settings.clearall = Alles zurücksetzen paused = Pausiert +clear = Clear +banned = [scarlet]Banned yes = Ja no = Nein info.title = [accent]Info error.title = [crimson] Ein Fehler ist aufgetreten error.crashtitle = Ein Fehler ist aufgetreten! -attackpvponly = [scarlet]Nur in Angriff oder PvP-Modus verfügbar. blocks.input = Input blocks.output = Output blocks.booster = Verstärkung @@ -452,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 @@ -473,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} @@ -517,7 +576,9 @@ 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 setting.animatedshields.name = Animierte Schilde setting.antialias.name = Antialias[LIGHT_GRAY] (Neustart erforderlich)[] @@ -538,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 @@ -547,6 +610,7 @@ setting.fps.name = Zeige FPS setting.vsync.name = VSync setting.pixelate.name = Verpixeln [LIGHT_GRAY](Könnte die Leistung beeinträchtigen) setting.minimap.name = Zeige die Minimap +setting.position.name = Show Player Position setting.musicvol.name = Musiklautstärke setting.ambientvol.name = Ambient Volume setting.mutemusic.name = Musik stummschalten @@ -558,6 +622,8 @@ setting.publichost.name = Public Game Visibility setting.chatopacity.name = Chat Deckkraft setting.lasersopacity.name = Power Laser Opacity setting.playerchat.name = Chat im Spiel anzeigen +public.confirm = Do you want to make your game public?\n[accent]Anyone will be able to join your games.\n[lightgray]This can be changed later in Settings->Game->Public Game Visibility. +public.beta = Note that beta versions of the game cannot make public lobbies. uiscale.reset = UI-Skalierung wurde geändert.\nDrücke "OK", um diese Skalierung zu bestätigen.\n[scarlet]Zurückkehren und Beenden in[accent] {0}[] Einstellungen... uiscale.cancel = Abbrechen & Beenden setting.bloom.name = Bloom @@ -569,13 +635,16 @@ category.multiplayer.name = Mehrspieler command.attack = Angreifen command.rally = Rally command.retreat = Rückzug -keybind.gridMode.name = Block Auswahl -keybind.gridModeShift.name = Kategorie auswählen +keybind.clear_building.name = Clear Building keybind.press = Drücke eine Taste... keybind.press.axis = Drücke eine Taste oder bewege eine Achse... keybind.screenshot.name = Karten Screenshot keybind.move_x.name = X-Achse keybind.move_y.name = Y-Achse +keybind.schematic_select.name = Select Region +keybind.schematic_menu.name = Schematic Menu +keybind.schematic_flip_x.name = Flip Schematic X +keybind.schematic_flip_y.name = Flip Schematic Y keybind.fullscreen.name = Toggle Fullscreen keybind.select.name = Auswählen/Schießen keybind.diagonal_placement.name = Diagonal platzieren @@ -587,12 +656,14 @@ keybind.zoom_hold.name = Zoom halten keybind.zoom.name = Zoomen keybind.menu.name = Menü keybind.pause.name = Pause +keybind.pause_building.name = Pause/Resume Building keybind.minimap.name = Minimap keybind.dash.name = Bindestrich keybind.chat.name = Chat keybind.player_list.name = Spielerliste keybind.console.name = Konsole keybind.rotate.name = Drehen +keybind.rotateplaced.name = Rotate Existing (Hold) keybind.toggle_menus.name = Menüs umschalten keybind.chat_history_prev.name = Chat Historie zurück keybind.chat_history_next.name = Chat Historie vor @@ -604,6 +675,7 @@ mode.survival.name = Überleben mode.survival.description = Der normale Modus. Ressourcen sind limitiert und Wellen kommen automatisch. mode.sandbox.name = Sandkasten mode.sandbox.description = Unendliche Ressourcen und kein Timer für Wellen. +mode.editor.name = Editor mode.pvp.name = PvP mode.pvp.description = Kämpfe gegen andere Spieler lokal. mode.attack.name = Angriff @@ -771,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 @@ -790,6 +864,7 @@ block.junction.name = Kreuzung block.router.name = Verteiler block.distributor.name = Großer Verteiler block.sorter.name = Sortierer +block.inverted-sorter.name = Inverted Sorter block.message.name = Message block.overflow-gate.name = Überlauftor block.silicon-smelter.name = Silizium-Schmelzer @@ -908,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.[] @@ -991,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. @@ -1010,6 +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.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. diff --git a/core/assets/bundles/bundle_es.properties b/core/assets/bundles/bundle_es.properties index 8cdaae1ab9..8f26fab09c 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 @@ -16,14 +17,29 @@ screenshot.invalid = Mapa demasiado grande, no hay suficiente memoria para la ca gameover = Tu núcleo ha sido destruido. gameover.pvp = ¡El equipo[accent] {0}[] ha ganado! highscore = [accent]¡Nueva mejor puntuación! - +copied = Copied. load.sound = Sonidos load.map = Mapas load.image = Imágenes load.content = Contenido load.system = Sistema load.mod = Mods - +schematic = Schematic +schematic.add = Save Schematic... +schematics = Schematics +schematic.replace = A schematic by that name already exists. Replace it? +schematic.import = Import Schematic... +schematic.exportfile = Export File +schematic.importfile = Import File +schematic.browseworkshop = Browse Workshop +schematic.copy = Copy to Clipboard +schematic.copy.import = Import from Clipboard +schematic.shareworkshop = Share on Workshop +schematic.flip = [accent][[{0}][]/[accent][[{1}][]: Flip Schematic +schematic.saved = Schematic saved. +schematic.delete.confirm = This schematic will be utterly eradicated. +schematic.rename = Rename Schematic +schematic.info = {0}x{1}, {2} blocks stat.wave = Oleadas Derrotadas:[accent] {0} stat.enemiesDestroyed = Enemigos Destruidos:[accent] {0} stat.built = Estructuras Construidas:[accent] {0} @@ -31,7 +47,6 @@ stat.destroyed = Estructuras Destruidas:[accent] {0} stat.deconstructed = Estructuras Desconstruidas:[accent] {0} stat.delivered = Recursos Lanzados: stat.rank = Rango final: [accent]{0} - launcheditems = [accent]Recursos Lanzados launchinfo = [unlaunched][[LAUNCH] tu núcleo core obtenga los objetos indicados en azul. map.delete = ¿Estás seguro que quieres borrar el mapa "[accent]{0}[]"? @@ -45,11 +60,11 @@ database = Base de datos del núcleo savegame = Guardar Partida loadgame = Cargar Partida joingame = Unirse a la Partida -addplayers = Agregar/Quitar Jugadores customgame = Partida personalizada newgame = Nueva Partida none = minimap = Minimapa +position = Position close = Cerrar website = Sitio web quit = Salir @@ -65,22 +80,30 @@ uploadingcontent = Uploading Content uploadingpreviewfile = Uploading Preview File committingchanges = Comitting Changes done = Hecho - +feature.unsupported = Your device does not support this feature. mods.alphainfo = Keep in mind that mods are in alpha, and[scarlet] may be very buggy[].\nReport any issues you find to the Mindustry Github or Discord. mods.alpha = [accent](Alpha) mods = Mods mods.none = [LIGHT_GRAY]No mods found! +mods.guide = Modding Guide +mods.report = Report Bug +mods.openfolder = Open Mod Folder mod.enabled = [lightgray]Enabled mod.disabled = [scarlet]Disabled mod.disable = Disable +mod.delete.error = Unable to delete mod. File may be in use. +mod.missingdependencies = [scarlet]Missing dependencies: {0} +mod.nowdisabled = [scarlet]Mod '{0}' is missing dependencies:[accent] {1}\n[lightgray]These mods need to be downloaded first.\nThis mod will be automatically disabled. mod.enable = Enable mod.requiresrestart = The game will now close to apply the mod changes. mod.reloadrequired = [scarlet]Reload Required mod.import = Import Mod +mod.import.github = Import Github Mod mod.remove.confirm = This mod will be deleted. mod.author = [LIGHT_GRAY]Author:[] {0} mod.missing = This save contains mods that you have recently updated or no longer have installed. Save corruption may occur. Are you sure you want to load it?\n[lightgray]Mods:\n{0} - +mod.preview.missing = Before publishing this mod in the workshop, you must add an image preview.\nPlace an image named[accent] preview.png[] into the mod's folder and try again. +mod.folder.missing = Only mods in folder form can be published on the workshop.\nTo convert any mod into a folder, simply unzip its file into a folder and delete the old zip, then restart your game or reload your mods. about.button = Acerca de name = Nombre: noname = Elige un[accent] nombre de jugador[] primero. @@ -161,7 +184,6 @@ server.port = Puerto: server.addressinuse = ¡La dirección ya está en uso! server.invalidport = ¡El número de puerto es invalido! server.error = [crimson]Error hosteando el servidor: error [accent]{0} -save.old = Este punto de guardado es de una versión más antigua de este juego, y ya no puede ser usada.\n\n[LIGHT_GRAY]La retrocmpatibilidad de los puntos de guardado estará completamente implementada en la versión 4.0. save.new = Nuevo Punto de Guardado save.overwrite = ¿Estás seguro de querer sobrescribir\neste punto de guardado? overwrite = Sobrescribir @@ -215,6 +237,10 @@ quit.confirm.tutorial = ¿Estás seguro de que sabes qué estas haciendo?\nSe pu loading = [accent]Cargando... reloading = [accent]Reloading Mods... saving = [accent]Guardando... +cancelbuilding = [accent][[{0}][] to clear plan +selectschematic = [accent][[{0}][] to select+copy +pausebuilding = [accent][[{0}][] to pause building +resumebuilding = [scarlet][[{0}][] to resume building wave = [accent]Oleada {0} wave.waiting = Oleada en {0} wave.waveInProgress = [LIGHT_GRAY]Oleada en progreso @@ -233,16 +259,18 @@ map.nospawn = ¡Este mapa no tiene ningún núcleo en el cual pueda aparecer el map.nospawn.pvp = ¡Este mapa no tiene ningún núcleo enemigo para que aparezca el jugador! Añade un núcleo[SCARLET] red[] a este mapa en el editor. map.nospawn.attack = ¡Este mapa no tiene núcleos para que el jugador ataque! Añade núcleos[SCARLET] red[] a este mapa en el editor. map.invalid = Error cargando el mapa: archivo corrupto o inválido. -map.publish.error = Error publishing map: {0} -map.update = Actualizar Mapa -map.load.error = Error fetching workshop details: {0} -map.missing = This map has been deleted or moved.\n[lightgray]The workshop listing has now been automatically un-linked from the map. +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! -map.menu = Select what you would like to do with this map. -map.changelog = Lista de cambios (opcional): +workshop.menu = Select what you would like to do with this item. +workshop.info = Item Info +changelog = Changelog (optional): eula = Steam EULA -map.publish = Mapa publicado. -map.publishing = [accent]Publicando Mapa... +missing = This item has been deleted or moved.\n[lightgray]The workshop listing has now been automatically un-linked. +publishing = [accent]Publishing... +publish.confirm = Are you sure you want to publish this?\n\n[lightgray]Make sure you agree to the Workshop EULA first, or your items will not show up! +publish.error = Error publishing item: {0} +steam.error = Failed to initialize Steam services.\nError: {0} editor.brush = Pincel editor.openin = Abrir en el Editor editor.oregen = Generación de Minerales @@ -319,7 +347,6 @@ editor.overwrite = [accent]¡Advertencia!\nEsto sobrescribe un mapa ya existente editor.overwrite.confirm = [scarlet]¡Advertencia![] Un mapa con ese nombre ya existe. ¿Estás seguro de querer sobrescribirlo? editor.exists = A map with this name already exists. editor.selectmap = Selecciona un mapa para cargar: - toolmode.replace = Sustituir toolmode.replace.description = Solo dibuja en bloques sólidos. toolmode.replaceall = Sustituir Todo @@ -334,7 +361,6 @@ toolmode.fillteams = Llenar Equipos toolmode.fillteams.description = Llena equipos en vez de bloques. toolmode.drawteams = Dibujar Equipos toolmode.drawteams.description = Dibuja equipos en vez de bloques. - filters.empty = [LIGHT_GRAY]¡No hay filtros! Añade uno con el botón de abajo. filter.distort = Distorsionar filter.noise = Ruido @@ -366,7 +392,6 @@ filter.option.floor2 = Secondary Floor filter.option.threshold2 = Secondary Threshold filter.option.radius = Radio filter.option.percentile = Porcentaje - width = Ancho: height = Alto: menu = Menú @@ -375,7 +400,6 @@ campaign = Campaña load = Cargar save = Guardar fps = FPS: {0} -tps = TPS: {0} ping = Ping: {0} ms language.restart = Por favor reinicie el juego para que los cambios del lenguaje surjan efecto. settings = Ajustes @@ -383,13 +407,13 @@ tutorial = Tutorial tutorial.retake = Volver a hacer tutorial editor = Editor mapeditor = Editor de Mapa -donate = Donar - abandon = Abandonar abandon.text = Esta zona y sus recursos se perderán ante el enemigo. locked = Bloqueado complete = [LIGHT_GRAY]Completado: -zone.requirement = Oleada {0} en la zona {1} +requirement.wave = Reach Wave {0} in {1} +requirement.core = Destroy Enemy Core in {0} +requirement.unlock = Unlock {0} resume = Continuar Zona:\n[LIGHT_GRAY]{0} bestwave = [LIGHT_GRAY]Récord: {0} launch = Lanzar @@ -400,18 +424,19 @@ launch.confirm = Esto lanzará todos los recursos al núcleo.\nNo podrás volver launch.skip.confirm = Si saltas la oleada ahora, no podrás lanzar recursos hasta unas oleadas después. uncover = Descubrir configure = Configurar carga inicial +bannedblocks = Banned Blocks +addall = Add All configure.locked = [LIGHT_GRAY]Alcanza la oleada {0}\npara configurar la carga inicial. configure.invalid = La cantidad debe estar entre 0 y {0}. zone.unlocked = [LIGHT_GRAY]{0} desbloqueado. zone.requirement.complete = Oleada {0} alcanzada:\nrequerimientos de la zona {1} cumplidos. -zone.config.complete = Oleada {0} alcanzada:\nconfiguración de carga inicial desbloqueada. +zone.config.unlocked = Loadout unlocked:[lightgray]\n{0} zone.resources = Recursos Detectados: zone.objective = [lightgray]Objetivo: [accent]{0} zone.objective.survival = Sobrevivir zone.objective.attack = Destruir Núcleo Enemigo add = Añadir... boss.health = Salud del Jefe - connectfail = [crimson]Ha fallado la conexión con el servidor: [accent]{0} error.unreachable = Servidor inaccesible. error.invalidaddress = Dirección inválida. @@ -422,7 +447,6 @@ error.mapnotfound = ¡Archivo de mapa no encontrado! error.io = Error I/O de conexión. error.any = Error de red desconocido. error.bloom = Failed to initialize bloom.\nYour device may not support it. - zone.groundZero.name = Terreno Cero zone.desertWastes.name = Ruinas del Desierto zone.craters.name = Los Cráteres @@ -437,7 +461,6 @@ zone.saltFlats.name = Salinas zone.impact0078.name = Impacto 0078 zone.crags.name = Riscos zone.fungalPass.name = Fungal Pass - zone.groundZero.description = La zona óptima para empear una vez más. Riesgo bajo de los enemigos. Pocos recursos.\nConsigue tanto plomo y cobre como puedas.\nSigue avanzando. zone.frozenForest.description = Incluso aquí, cerca de las montañas, las esporas se han expandido. Las temperaturas gélidas no pueden contenerlas para siempre.\n\nEmpieza a investigar sobre energía. Cnstruye generadores de combustión. Aprende a usar reparadores. zone.desertWastes.description = Estas ruinas son vastas, impredecibles y entrecruzadas con sectores de estructuras abandonadas.\nHay carbñon presente en la región. Quémalo para energía, o sintetiza grafito.\n\n[lightgray]La zona de aparición no puede ser garantizada. @@ -452,7 +475,6 @@ zone.nuclearComplex.description = Una antigua facilidad para la producción y el zone.fungalPass.description = Una zona transitoria entre alta montaña y zonas más bajas con esporas. Una base enemiga pequeña de reconocimiento se ubica aquí.\nDestrúyela.nUsa Dagas y Orugas. Destruye los dos núcleos. zone.impact0078.description = zone.crags.description = - settings.language = Idioma settings.data = Datos del Juego settings.reset = Reiniciar por los de defecto @@ -465,12 +487,13 @@ settings.cleardata = Limpiar Datos del Juego... settings.clear.confirm = ¿Estas seguro de querer limpiar estos datos?\n¡Esta acción no puede deshacerse! settings.clearall.confirm = [scarlet]ADVERTENCIA![]\nEsto va a eliminar todos tus datos, incluyendo guardados, mapas, desbloqueos y atajos de teclado.\nUna vez presiones 'ok', el juego va a borrrar todos tus datos y saldrá del juego automáticamente. paused = [accent] < Pausado > +clear = Clear +banned = [scarlet]Banned yes = Sí no = No info.title = [accent]Información error.title = [crimson]Un error ha ocurrido. error.crashtitle = Un error ha ocurrido. -attackpvponly = [scarlet]Solo disponible en los modos de Ataque/PvP blocks.input = Entrada blocks.output = Salida blocks.booster = Potenciador @@ -486,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 @@ -505,9 +529,9 @@ blocks.inaccuracy = Imprecisión blocks.shots = Disparos 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} @@ -520,7 +544,6 @@ bar.heat = Calor bar.power = Energía bar.progress = Progreso de construcción bar.spawned = Unidades: {0}/{1} - bullet.damage = [stat]{0}[lightgray] daño bullet.splashdamage = [stat]{0}[lightgray] daño de área ~[stat] {1}[lightgray] casillas bullet.incendiary = [stat]incendiaria @@ -532,7 +555,6 @@ bullet.freezing = [stat]freezing bullet.tarred = [stat]tarred bullet.multiplier = [stat]{0}[lightgray]x multiplicador de munición bullet.reload = [stat]{0}[lightgray]x recarga - unit.blocks = bloques unit.powersecond = unidades de energía/segundo unit.liquidsecond = unidades de líquido/segundo @@ -554,7 +576,9 @@ 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 setting.animatedshields.name = Escudos Animados setting.antialias.name = Antialias[LIGHT_GRAY] (necesita reiniciar)[] @@ -575,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 @@ -582,9 +608,9 @@ setting.fullscreen.name = Pantalla Completa setting.borderlesswindow.name = Ventana sin Bordes[LIGHT_GRAY] (podría requerir un reinicio) setting.fps.name = Mostrar FPS setting.vsync.name = SincV -setting.lasers.name = Mostrar Energía de los Láseres setting.pixelate.name = Pixelar [LIGHT_GRAY](podría reducir el rendimiento) setting.minimap.name = Mostrar Minimapa +setting.position.name = Show Player Position setting.musicvol.name = Volumen de la Música setting.ambientvol.name = Volumen del Ambiente setting.mutemusic.name = Silenciar Musica @@ -597,6 +623,7 @@ setting.chatopacity.name = Opacidad del Chat setting.lasersopacity.name = Power Laser Opacity setting.playerchat.name = Display In-Game Chat public.confirm = Do you want to make your game public?\n[lightgray]This can be changed later in Settings->Game->Public Game Visibility. +public.beta = Note that beta versions of the game cannot make public lobbies. uiscale.reset = UI scale has been changed.\nPress "OK" to confirm this scale.\n[scarlet]Reverting and exiting in[accent] {0}[] seconds... uiscale.cancel = Cancelar & Salir setting.bloom.name = Bloom @@ -608,13 +635,16 @@ category.multiplayer.name = Multijugador command.attack = Atacar command.rally = Rally command.retreat = Retirarse -keybind.gridMode.name = Selección de Bloque -keybind.gridModeShift.name = Selección de Categoría +keybind.clear_building.name = Clear Building keybind.press = Presiona una tecla... keybind.press.axis = Pulsa un eje o botón... keybind.screenshot.name = Captura de pantalla de 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.fullscreen.name = Intercambiar con Pantalla Completa keybind.select.name = Seleccionar keybind.diagonal_placement.name = Construcción Diagonal @@ -626,6 +656,7 @@ keybind.zoom_hold.name = Mantener Zoom keybind.zoom.name = Zoom keybind.menu.name = Menú keybind.pause.name = Pausa +keybind.pause_building.name = Pause/Resume Building keybind.minimap.name = Minimapa keybind.dash.name = Correr keybind.chat.name = Chat @@ -650,7 +681,6 @@ mode.pvp.description = Pelea contra otros jugadores localmente. mode.attack.name = Ataque mode.attack.description = No hay oleadas, el objetivo es destruir la base enemiga. mode.custom = Normas personalizadas - rules.infiniteresources = Recursos Infinitos rules.wavetimer = Temportzador de Oleadas rules.waves = Oleadas @@ -677,7 +707,6 @@ rules.title.resourcesbuilding = Recursos y Construcción rules.title.player = Jugadores rules.title.enemy = Enemigos rules.title.unit = Unidades - content.item.name = Objetos content.liquid.name = Líquidos content.unit.name = Unidades @@ -739,7 +768,6 @@ mech.buildspeed = [LIGHT_GRAY]Velocidad de Construcción: {0}% liquid.heatcapacity = [LIGHT_GRAY]Capacidad Térmica: {0} liquid.viscosity = [LIGHT_GRAY]Viscosidad: {0} liquid.temperature = [LIGHT_GRAY]Temperatura: {0} - block.sand-boulder.name = Piedra de Arena block.grass.name = Hierba block.salt.name = Sal @@ -815,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 @@ -834,6 +864,7 @@ block.junction.name = Cruce block.router.name = Enrutador block.distributor.name = Distribuidor block.sorter.name = Clasificador +block.inverted-sorter.name = Inverted Sorter block.message.name = Message block.overflow-gate.name = Compuerta de Desborde block.silicon-smelter.name = Horno para Silicio @@ -952,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.[] @@ -970,7 +1002,6 @@ tutorial.deposit = Deposita recursos en bloques arrastrándolos de tu nave al bl tutorial.waves = El[LIGHT_GRAY] enemigo[] se acerca.\n\nDefiende tu núcleo por 2 oleadas. Construye más torretas y taladros. Mina más cobre. tutorial.waves.mobile = El[lightgray] enemigo[] se acerca.\n\nDefiende tu núcleo por 2 oleadas. Tu nave disparará automáticamente a los enemigos.\nConstruye más torretas y taladros. Mina más cobre. tutorial.launch = Una vez llegues a cierta oleada, podrás[accent]lanzar el núcleo[], dejando atrás tus defensas y los recursos en tu núcleo.[]\nEstos recursos pueden ser usados para investigar nueva tecnología.\n\n[accent]Pulsa el botón de lanzamiento. - item.copper.description = Un útil material estructural. Usado extensivamente en todo tipo de bloques. item.lead.description = Un material básico. Usado extensivamente en electrónicos y bloques de transferencia de líquidos. item.metaglass.description = Un compuesto muy duro de cristal. Usado extensivamente para almacenamiento y distribución de líquidos. @@ -1036,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. @@ -1055,6 +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.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 d8550c1f38..d01fb8c674 100644 --- a/core/assets/bundles/bundle_et.properties +++ b/core/assets/bundles/bundle_et.properties @@ -3,16 +3,13 @@ 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.title = Versioonid link.changelog.description = Uuenduste nimekiri versioonide kaupa -link.dev-builds.title = Arendusversioonid link.dev-builds.description = Arendusversioonide ajalugu link.trello.description = Plaanitud uuenduste nimekiri link.itch.io.description = Kõik PC-platvormide versioonid -link.google-play.title = Google Play link.google-play.description = Androidi versioon Google Play poes -link.wiki.title = Viki link.wiki.description = Mängu ametlik viki linkfail = Lingi avamine ebaõnnestus!\nVeebiaadress kopeeriti. screenshot = Kuvatõmmis salvestati: {0} @@ -20,13 +17,29 @@ screenshot.invalid = Maailm on liiga suur: kuvatõmmise salvestamiseks ei pruugi gameover = Mäng läbi! gameover.pvp = Võistkond[accent] {0}[] võitis! highscore = [accent]Uus rekord! - +copied = Copied. load.sound = Helid load.map = Maailmad load.image = Pildid load.content = Sisu load.system = Süsteem - +load.mod = Mods +schematic = Schematic +schematic.add = Save Schematic... +schematics = Schematics +schematic.replace = A schematic by that name already exists. Replace it? +schematic.import = Import Schematic... +schematic.exportfile = Export File +schematic.importfile = Import File +schematic.browseworkshop = Browse Workshop +schematic.copy = Copy to Clipboard +schematic.copy.import = Import from Clipboard +schematic.shareworkshop = Share on Workshop +schematic.flip = [accent][[{0}][]/[accent][[{1}][]: Flip Schematic +schematic.saved = Schematic saved. +schematic.delete.confirm = This schematic will be utterly eradicated. +schematic.rename = Rename Schematic +schematic.info = {0}x{1}, {2} blocks stat.wave = Lahingulaineid läbitud:[accent] {0} stat.enemiesDestroyed = Vaenlasi hävitatud:[accent] {0} stat.built = Ehitisi konstrueeritud:[accent] {0} @@ -34,8 +47,8 @@ stat.destroyed = Ehitisi hävinenud:[accent] {0} stat.deconstructed = Ehitisi dekonstrueeritud:[accent] {0} stat.delivered = Kaasavõetud ressursid: stat.rank = Hinne:[accent] {0} - launcheditems = [accent]Kaasavõetud ressursid +launchinfo = [unlaunched][[LAUNCH] your core to obtain the items indicated in blue. map.delete = Kas oled kindel, et soovid kustutada\nmaailma "[accent]{0}[]"? level.highscore = Rekord: [accent]{0} level.select = Taseme valimine @@ -47,11 +60,11 @@ database = Andmebaas savegame = Salvesta mäng loadgame = Lae mäng joingame = Liitu mänguga -addplayers = Lisa/Eemalda mängijaid customgame = Kohandatud mäng newgame = Uus mäng none = minimap = Kaart +position = Position close = Sulge website = Veebileht quit = Välju @@ -67,7 +80,30 @@ uploadingcontent = Sisu üleslaadimine uploadingpreviewfile = Eelvaate faili üleslaadimine committingchanges = Muudatuste teostamine done = Valmis - +feature.unsupported = Your device does not support this feature. +mods.alphainfo = Keep in mind that mods are in alpha, and[scarlet] may be very buggy[].\nReport any issues you find to the Mindustry Github or Discord. +mods.alpha = [accent](Alpha) +mods = Mods +mods.none = [LIGHT_GRAY]No mods found! +mods.guide = Modding Guide +mods.report = Report Bug +mods.openfolder = Open Mod Folder +mod.enabled = [lightgray]Enabled +mod.disabled = [scarlet]Disabled +mod.disable = Disable +mod.delete.error = Unable to delete mod. File may be in use. +mod.missingdependencies = [scarlet]Missing dependencies: {0} +mod.nowdisabled = [scarlet]Mod '{0}' is missing dependencies:[accent] {1}\n[lightgray]These mods need to be downloaded first.\nThis mod will be automatically disabled. +mod.enable = Enable +mod.requiresrestart = The game will now close to apply the mod changes. +mod.reloadrequired = [scarlet]Reload Required +mod.import = Import Mod +mod.import.github = Import Github Mod +mod.remove.confirm = This mod will be deleted. +mod.author = [LIGHT_GRAY]Author:[] {0} +mod.missing = This save contains mods that you have recently updated or no longer have installed. Save corruption may occur. Are you sure you want to load it?\n[lightgray]Mods:\n{0} +mod.preview.missing = Before publishing this mod in the workshop, you must add an image preview.\nPlace an image named[accent] preview.png[] into the mod's folder and try again. +mod.folder.missing = Only mods in folder form can be published on the workshop.\nTo convert any mod into a folder, simply unzip its file into a folder and delete the old zip, then restart your game or reload your mods. about.button = Info name = Nimi: noname = Valige kõigepealt [accent]nimi[]. @@ -148,7 +184,6 @@ server.port = Port: server.addressinuse = Aadress on juba kasutusel! server.invalidport = Ebasobiv pordi number! server.error = [crimson]Viga serveri hostimisel. -save.old = See salvestis on mängu vanemast versioonist ning seda ei saa enam kasutada.\n\n[lightgray]Vanemate salvestuste kasutamise toetus lisatakse mängu täisversioonis 4.0. save.new = Uus salvestis save.overwrite = Oled kindel, et soovid selle salvestise asendada? overwrite = Asenda @@ -182,6 +217,7 @@ warning = Hoiatus confirm = Kinnita delete = Kustuta view.workshop = Vaata Workshop'is +workshop.listing = Edit Workshop Listing ok = OK open = Ava customize = Kohanda reegleid @@ -199,7 +235,12 @@ classic.export.text = [accent]Mindustry[] on äsja saanud suure uuenduse.\nTuvas quit.confirm = Oled kindel, et soovid väljuda? quit.confirm.tutorial = Oled kindel, et soovid õpetuse lõpetada?\nÕpetust saab uuesti läbida:\n[accent]Mängi -> Õpetus[]. loading = [accent]Laadimine... +reloading = [accent]Reloading Mods... saving = [accent]Salvestamine... +cancelbuilding = [accent][[{0}][] to clear plan +selectschematic = [accent][[{0}][] to select+copy +pausebuilding = [accent][[{0}][] to pause building +resumebuilding = [scarlet][[{0}][] to resume building wave = [accent]Lahingulaine {0} wave.waiting = [lightgray]Järgmine laine\nalgab: {0} wave.waveInProgress = [lightgray]Toimub lahingulaine @@ -218,11 +259,18 @@ map.nospawn = Selles maailmas ei ole mängijate tuumikuid!\nLisa redaktoris sell map.nospawn.pvp = Selles maailmas ei ole piisavalt mängijate tuumikuid!\nLisa redaktoris sellele maailmale[SCARLET] mitte-oranže[] tuumikuid. map.nospawn.attack = Selles maailmas ei ole mängijate poolt rünnatavaid vaenlaste tuumikuid!\nLisa redaktoris sellele maailmale[SCARLET] punaseid[] tuumikuid. map.invalid = Viga maailma laadimisel: ebasobiv või riknenud fail. -map.publish.error = Viga maailma avaldamisel: {0} +workshop.update = Update Item +workshop.error = Error fetching workshop details: {0} map.publish.confirm = Oled kindel, et soovid selle maailma üles laadida?\n\n[lightgray]Veendu, et oled nõustunud Workshop'i kasutustingimustega. Vastasel juhul ei saa sinu maailma üles laadida. +workshop.menu = Select what you would like to do with this item. +workshop.info = Item Info +changelog = Changelog (optional): eula = Steam'i kasutustingimused -map.publish = Maailm on üles laaditud. -map.publishing = [accent]Maailma üleslaadimine... +missing = This item has been deleted or moved.\n[lightgray]The workshop listing has now been automatically un-linked. +publishing = [accent]Publishing... +publish.confirm = Are you sure you want to publish this?\n\n[lightgray]Make sure you agree to the Workshop EULA first, or your items will not show up! +publish.error = Error publishing item: {0} +steam.error = Failed to initialize Steam services.\nError: {0} editor.brush = Pintsel editor.openin = Ava redaktoris editor.oregen = Maakide genereerimine @@ -299,7 +347,6 @@ editor.overwrite = [accent]Hoiatus!\nSee asendab olemasoleva maailma. editor.overwrite.confirm = [scarlet]Hoiatus![] Sellise nimega maailm on juba olemas. Oled kindel, et soovid selle asendada? editor.exists = Sellise nimega maailm on juba olemas. editor.selectmap = Vali laetav maailm: - toolmode.replace = Asenda toolmode.replace.description = Joonista ainult tahkete blokkide peale. toolmode.replaceall = Asenda kõik @@ -314,7 +361,6 @@ toolmode.fillteams = Täida võistkondi toolmode.fillteams.description = Täida blokkide asemel võistkondi. toolmode.drawteams = Joonista võistkondi toolmode.drawteams.description = Joonista blokkide asemel võistkondi. - filters.empty = [lightgray]Filtrid puuduvad! Lisa filtreid alloleva nupuga. filter.distort = Moonutamine filter.noise = Müra @@ -346,7 +392,6 @@ filter.option.floor2 = Teine põrand filter.option.threshold2 = Teine lävi filter.option.radius = Raadius filter.option.percentile = Protsentiil - width = Laius: height = Kõrgus: menu = Menüü @@ -355,7 +400,6 @@ campaign = Kampaania load = Lae save = Salvesta fps = FPS: {0} -tps = TPS: {0} ping = Ping: {0}ms language.restart = Keelesätete muudatuste jõustumiseks [accent]taaskäivita[] mäng. settings = Sätted @@ -363,13 +407,13 @@ tutorial = Õpetus tutorial.retake = Korda õpetust editor = Redaktor mapeditor = Maailmaredaktor -donate = Anneta - abandon = Loobu abandon.text = See piirkond koos kõigi ressurssidega loovutatakse vaenlasele. locked = Lukus complete = [lightgray]Eesmärgid: -zone.requirement = {0} lahingulainet piirkonnas "{1}" +requirement.wave = Reach Wave {0} in {1} +requirement.core = Destroy Enemy Core in {0} +requirement.unlock = Unlock {0} resume = Jätka piirkonnas:\n[lightgray]{0} bestwave = [lightgray]Parim lahingulaine: {0} launch = < LENDUTÕUS > @@ -380,18 +424,19 @@ launch.confirm = Lendu tõusmisel võetakse kaasa\nkõik tuumikus olevad ressurs launch.skip.confirm = Kui jätad praegu lendu tõusmata, siis saad seda teha alles hilisemate lahingulainete järel. uncover = Ava configure = Muuda varustust +bannedblocks = Banned Blocks +addall = Add All configure.locked = [lightgray]Varustuse muutmine avaneb\n {0}. lahingulaine järel. configure.invalid = Arv peab olema 0 ja {0} vahel. zone.unlocked = [lightgray]{0} avatud. zone.requirement.complete = Jõudsid lahingulaineni {0}:\nPiirkonna "{1}" nõuded täidetud. -zone.config.complete = Jõudsid lahingulaineni {0}:\nVarustuse muutmine avatud. +zone.config.unlocked = Loadout unlocked:[lightgray]\n{0} zone.resources = Ressursid: zone.objective = [lightgray]Eesmärk: [accent]{0} zone.objective.survival = Ellujäämine zone.objective.attack = Hävita vaenlaste tuumik add = Lisa... boss.health = Bossi elud - connectfail = [crimson]Ühenduse viga:\n\n[accent]{0} error.unreachable = Server ei ole kättesaadav.\nKas serveri aadress on õigesti sisestatud? error.invalidaddress = Vale aadress. @@ -402,7 +447,6 @@ error.mapnotfound = Maailmafaili ei leitud! error.io = Võrgu sisend-väljundi viga. error.any = Teadmata viga võrgus. error.bloom = Bloom-efekti lähtestamine ebaõnnestus.\nSinu seade ei pruugi seda efekti toetada. - zone.groundZero.name = Nullpunkt zone.desertWastes.name = Kõrbestunud tühermaa zone.craters.name = Kraatrid @@ -417,7 +461,6 @@ zone.saltFlats.name = Soolaväljad zone.impact0078.name = Kokkupõrge 0078 zone.crags.name = Kaljurünkad zone.fungalPass.name = Seenekuru - zone.groundZero.description = Optimaalne asukoht alustamiseks.\nMadal ohutase. Vähesel määral ressursse.\nKogu kokku nii palju vaske ja pliid kui võimalik. zone.frozenForest.description = Spoorid on levinud isegi mägede lähedale. Jäised temperatuurid ei suuda neid igavesti eemal hoida.\n\nAlusta esimeste katsetustega energia tootmises. Ehita põlemisgeneraatoreid.\nÕpi oma ehitisi parandama. zone.desertWastes.description = Need tühermaad on üüratud ja ettearvamatud. Siin-seal leidub mahajäetud ja räsitud tööstushooneid.\n\nSelles piirkonnas leidub sütt. Töötle seda grafiidiks või põleta energia saamiseks.\n\n[lightgray]Maandumispaik ei ole kindlaks määratud. @@ -432,7 +475,6 @@ zone.nuclearComplex.description = Endine tooriumi tootmise ja töötlemise rajat zone.fungalPass.description = Üleminekuala kõrgete mägede ja madalamate, spooridega ülekülvatud maade vahel. Siin asub väike vaenlaste luurebaas.\nHävita see.\nKasuta soldatite ja plahvatajate väeüksuseid. Hävita kaks vaenlaste tuumikut. zone.impact0078.description = zone.crags.description = - settings.language = Keel settings.data = Mänguandmed settings.reset = Vaikimisi sätted @@ -444,15 +486,14 @@ settings.graphics = Graafika settings.cleardata = Kustuta mänguandmed... settings.clear.confirm = Oled kindel, et soovid olemasolevad\nsätted kustutada?\n[accent]Seda ei saa tagasi võtta! settings.clearall.confirm = [scarlet]HOIATUS![]\nKustutatakse kõik andmed, sealhulgas salvestised, maailmad, kampaania saavutused\nja juhtnuppude sätted.\n[accent]Vajutades nupule "OK", kustutatakse\nkõik andmed ja seejärel mäng sulgub.[] -settings.clearunlocks = Kustuta kampaania saavutused -settings.clearall = Kustuta kõik paused = [accent]< Paus > +clear = Clear +banned = [scarlet]Banned yes = Jah no = Ei info.title = Info error.title = [crimson]Viga error.crashtitle = Viga -attackpvponly = [scarlet]Saadaval ainult mänguviisidega "Rünnak" ja "Versus" blocks.input = Sisend blocks.output = Väljund blocks.booster = Kiirendaja @@ -468,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 @@ -487,9 +529,9 @@ blocks.inaccuracy = Ebatäpsus blocks.shots = Laske 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} @@ -502,7 +544,6 @@ bar.heat = Kuumus bar.power = Energia bar.progress = Edenemine bar.spawned = Väeüksuseid: {0}/{1} - bullet.damage = [stat]{0}[lightgray] hävituspunkti bullet.splashdamage = [stat]{0}[lightgray] hävituspunkti ~[stat] {1}[lightgray] blokki bullet.incendiary = [stat]süttiv @@ -514,7 +555,6 @@ bullet.freezing = [stat]jäätav bullet.tarred = [stat]leekisüütav bullet.multiplier = [stat]{0}[lightgray]x laskemoona kordaja bullet.reload = [stat]{0}[lightgray]x tulistamise kiirus - unit.blocks = blokki unit.powersecond = energiaühikut/s unit.liquidsecond = vedelikuühikut/s @@ -536,7 +576,9 @@ 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 setting.animatedshields.name = Animeeritud kilbid setting.antialias.name = Sakitõrje[lightgray] (vajab mängu taaskäivitamist)[] @@ -557,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 @@ -564,9 +608,9 @@ setting.fullscreen.name = Täisekraan setting.borderlesswindow.name = Äärteta ekraan[lightgray] (võib vajada mängu taaskäivitamist) setting.fps.name = Näita kaadrite arvu sekundis setting.vsync.name = Vertikaalne sünkroonimine -setting.lasers.name = Näita energiasõlmede vahelisi ühendusi setting.pixelate.name = Piksel-efekt[lightgray] (lülitab animatsioonid välja) setting.minimap.name = Näita kaarti +setting.position.name = Show Player Position setting.musicvol.name = Muusika helitugevus setting.ambientvol.name = Taustahelide tugevus setting.mutemusic.name = Vaigista muusika @@ -576,7 +620,10 @@ setting.crashreport.name = Saada automaatseid veateateid setting.savecreate.name = Loo automaatseid salvestisi setting.publichost.name = Avaliku mängu nähtavus setting.chatopacity.name = Vestlusakna läbipaistmatus +setting.lasersopacity.name = Power Laser Opacity setting.playerchat.name = Näita mängusisest vestlusakent +public.confirm = Do you want to make your game public?\n[accent]Anyone will be able to join your games.\n[lightgray]This can be changed later in Settings->Game->Public Game Visibility. +public.beta = Note that beta versions of the game cannot make public lobbies. uiscale.reset = Kasutajaliidese suurust on muudetud.\nVajuta nupule "OK", et uus suurus kinnitada.\n[scarlet]Esialgne suurus taastatakse[accent] {0}[] sekundi pärast... uiscale.cancel = Tühista ja välju setting.bloom.name = Bloom-efekt @@ -586,15 +633,18 @@ category.general.name = Mäng category.view.name = Kaamera ja kasutajaliides category.multiplayer.name = Mitmikmäng command.attack = Ründa -command.retreat = Põgene command.rally = Patrulli -keybind.gridMode.name = Bloki kiirvalimine -keybind.gridModeShift.name = Kategooria kiirvalimine +command.retreat = Põgene +keybind.clear_building.name = Clear Building keybind.press = Vajuta klahvi... keybind.press.axis = Liiguta juhtkangi või vajuta klahvi... keybind.screenshot.name = Kuvatõmmis keybind.move_x.name = Liigu X-teljel keybind.move_y.name = Liigu Y-teljel +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 = Täisekraan keybind.select.name = Vali/Tulista keybind.diagonal_placement.name = Diagonaalne paigutamine @@ -606,12 +656,14 @@ keybind.zoom_hold.name = Suumimise režiim keybind.zoom.name = Muuda suumi keybind.menu.name = Menüü keybind.pause.name = Paus +keybind.pause_building.name = Pause/Resume Building keybind.minimap.name = Kaart keybind.dash.name = Söösta keybind.chat.name = Vestle keybind.player_list.name = Mängijate nimekiri keybind.console.name = Konsool keybind.rotate.name = Pööra blokki +keybind.rotateplaced.name = Rotate Existing (Hold) keybind.toggle_menus.name = Näita/Peida menüüd keybind.chat_history_prev.name = Vestlusaken: eelmine keybind.chat_history_next.name = Vestlusaken: järgmine @@ -629,7 +681,6 @@ mode.pvp.description = Võitle teiste mängijate vastu. mode.attack.name = Rünnak mode.attack.description = Hävita vaenlaste baas. Lahingulaineid ei ole. mode.custom = Reeglid - rules.infiniteresources = Lõputult ressursse rules.wavetimer = Kasuta taimerit rules.waves = Kasuta lahingulaineid @@ -656,7 +707,6 @@ rules.title.resourcesbuilding = Ressursid ja ehitamine rules.title.player = Mängijad rules.title.enemy = Vaenlased rules.title.unit = Väeüksused - content.item.name = Ressursid content.liquid.name = Vedelikud content.unit.name = Väeüksused @@ -718,7 +768,6 @@ mech.buildspeed = [lightgray]Ehitamise kiirus: {0}% liquid.heatcapacity = [lightgray]Soojusmahtuvus: {0} liquid.viscosity = [lightgray]Viskoossus: {0} liquid.temperature = [lightgray]Temperatuur: {0} - block.sand-boulder.name = Liivakamakas block.grass.name = Rohi block.salt.name = Sool @@ -794,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 @@ -813,6 +864,7 @@ block.junction.name = Ristmik block.router.name = Jaotur block.distributor.name = Suur jaotur block.sorter.name = Sorteerija +block.inverted-sorter.name = Inverted Sorter block.message.name = Sõnum block.overflow-gate.name = Ülevooluvärav block.silicon-smelter.name = Ränisulatusahi @@ -931,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.[] @@ -949,7 +1002,6 @@ tutorial.deposit = Ressursside mahalaadimiseks lohista ressursid oma mehhaanilt tutorial.waves = [scarlet]Vaenlane[] läheneb.\n\nKaitse oma tuumikut kahe lahingulaine vältel.[accent] Kliki hiirega[], et oma mehhaanist tulistada.\n[accent]Kaevanda juurde vaske. Ehita uusi puure ja kahureid. tutorial.waves.mobile = [scarlet]Vaenlane[] läheneb.\n\nKaitse oma tuumikut kahe lahingulaine vältel. Sinu mehhaan tulistab vaenlaseid automaatselt.\n[accent]Kaevanda juurde vaske. Ehita uusi puure ja kahureid. tutorial.launch = Kui oled kindla arvu lahingulaineid vastu pidanud, on sul võimalik[accent] tuumikuga lendu tõusta[], jättes maha kõik muud ehitised ja[accent] võttes kaasa kõik tuumikus olevad ressursid.[]\nNeid ressursse saab kasutada uute [accent]tehnoloogiate uurimiseks[].\n\n[accent]Vajuta lendu tõusmise nuppu. - item.copper.description = Peamine materjal, mida kasutatakse igat tüüpi konstruktsioonide ehitamiseks. item.lead.description = Peamine materjal, mida kasutatakse vedelike transportimise konstruktsioonide ja elektroonikaga seotud konstruktsioonide ehitamiseks. item.metaglass.description = Ülitugev klaasiühend, mida kasutatakse vedelike transportimise ja hoiustamise konstruktsioonide ehitamiseks. @@ -1015,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. @@ -1034,6 +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.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. @@ -1109,4 +1164,4 @@ block.tau-mech-pad.description = Võimaldab läbida metamorfoosi tugifunktsiooni block.omega-mech-pad.description = Võimaldab läbida metamorfoosi tugevaks ja hästi soomustatud maapealseks mehhaaniks.\nSelleks seisa jaama kohal ja vajuta jaamale. block.javelin-ship-pad.description = Võimaldab läbida metamorfoosi äkkrünnakuteks loodud lendmehhaaniks.\nSelleks seisa jaama kohal ja vajuta jaamale. block.trident-ship-pad.description = Võimaldab läbida metamorfoosi pommitajast lendmehhaaniks, millega on võimalik paremini ehitisi konstrueerida.\nSelleks seisa jaama kohal ja vajuta jaamale. -block.glaive-ship-pad.description = Võimaldab läbida metamorfoosi tugevaks ja hästi soomustatud lendmehhaaniks.\nSelleks seisa jaama kohal ja vajuta jaamale. \ No newline at end of file +block.glaive-ship-pad.description = Võimaldab läbida metamorfoosi tugevaks ja hästi soomustatud lendmehhaaniks.\nSelleks seisa jaama kohal ja vajuta jaamale. diff --git a/core/assets/bundles/bundle_eu.properties b/core/assets/bundles/bundle_eu.properties index 9c715e252a..12851dbfed 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 @@ -16,11 +17,29 @@ screenshot.invalid = Mapa handiegia, baliteke pantaila-argazkirako memoria nahik gameover = Partida amaitu da gameover.pvp = [accent] {0}[] taldeak irabazi du! highscore = [accent]Marka berria! +copied = Copied. load.sound = Soinuak load.map = Mapak load.image = Irudiak load.content = Edukia load.system = Sistema +load.mod = Mods +schematic = Schematic +schematic.add = Save Schematic... +schematics = Schematics +schematic.replace = A schematic by that name already exists. Replace it? +schematic.import = Import Schematic... +schematic.exportfile = Export File +schematic.importfile = Import File +schematic.browseworkshop = Browse Workshop +schematic.copy = Copy to Clipboard +schematic.copy.import = Import from Clipboard +schematic.shareworkshop = Share on Workshop +schematic.flip = [accent][[{0}][]/[accent][[{1}][]: Flip Schematic +schematic.saved = Schematic saved. +schematic.delete.confirm = This schematic will be utterly eradicated. +schematic.rename = Rename Schematic +schematic.info = {0}x{1}, {2} blocks stat.wave = Garaitutako boladak:[accent] {0} stat.enemiesDestroyed = Suntsitutako etsaiak:[accent] {0} stat.built = Eraikitako eraikinak:[accent] {0} @@ -29,6 +48,7 @@ stat.deconstructed = Deseraikitako eraikinak:[accent] {0} stat.delivered = Egotzitako baliabideak: stat.rank = Azken graduazioa: [accent]{0} launcheditems = [accent]Egotzitako baliabideak +launchinfo = [unlaunched][[LAUNCH] your core to obtain the items indicated in blue. map.delete = Ziur al zaude "[accent]{0}[]" mapa ezabatu nahi duzula? level.highscore = Marka: [accent]{0} level.select = Maila hautaketa @@ -40,11 +60,11 @@ database = Muinaren datu-basea savegame = Gorde partida loadgame = Kargatu partida joingame = Batu partidara -addplayers = Gehitu/kendu jokalariak customgame = Partida pertsonalizatua newgame = Partida berria none = minimap = Mapatxoa +position = Position close = Itxi website = Webgunea quit = Irten @@ -60,6 +80,30 @@ uploadingcontent = Edukia igotzen uploadingpreviewfile = Aurrebista fitxategia igotzen committingchanges = Aldaketak aplikatzen done = Egina +feature.unsupported = Your device does not support this feature. +mods.alphainfo = Keep in mind that mods are in alpha, and[scarlet] may be very buggy[].\nReport any issues you find to the Mindustry Github or Discord. +mods.alpha = [accent](Alpha) +mods = Mods +mods.none = [LIGHT_GRAY]No mods found! +mods.guide = Modding Guide +mods.report = Report Bug +mods.openfolder = Open Mod Folder +mod.enabled = [lightgray]Enabled +mod.disabled = [scarlet]Disabled +mod.disable = Disable +mod.delete.error = Unable to delete mod. File may be in use. +mod.missingdependencies = [scarlet]Missing dependencies: {0} +mod.nowdisabled = [scarlet]Mod '{0}' is missing dependencies:[accent] {1}\n[lightgray]These mods need to be downloaded first.\nThis mod will be automatically disabled. +mod.enable = Enable +mod.requiresrestart = The game will now close to apply the mod changes. +mod.reloadrequired = [scarlet]Reload Required +mod.import = Import Mod +mod.import.github = Import Github Mod +mod.remove.confirm = This mod will be deleted. +mod.author = [LIGHT_GRAY]Author:[] {0} +mod.missing = This save contains mods that you have recently updated or no longer have installed. Save corruption may occur. Are you sure you want to load it?\n[lightgray]Mods:\n{0} +mod.preview.missing = Before publishing this mod in the workshop, you must add an image preview.\nPlace an image named[accent] preview.png[] into the mod's folder and try again. +mod.folder.missing = Only mods in folder form can be published on the workshop.\nTo convert any mod into a folder, simply unzip its file into a folder and delete the old zip, then restart your game or reload your mods. about.button = Honi buruz name = Izena: noname = Hautatu[accent] jokalari-izena[] aurretik. @@ -140,7 +184,6 @@ server.port = Ataka: server.addressinuse = Helbidea dagoeneko erabilita dago! server.invalidport = Ataka zenbaki baliogabea! server.error = [crimson]Errorea zerbitzaria ostatatzean: [accent]{0} -save.old = Gordetako partida hau jolasaren bertsio zahar batena da, eta ezin da gehiago erabili.\n\n[lightgray]Gordetako partiden bateragarritasuna 4.0 bertsioan ezarriko da. save.new = Gordetako partida berria save.overwrite = Ziur gordetzeko tarte hau gainidatzi nahi duzula? overwrite = Gainidatzi @@ -174,6 +217,7 @@ warning = Abisua. confirm = Baieztatu delete = Ezabatu view.workshop = Ikusi lantegian +workshop.listing = Edit Workshop Listing ok = Ados open = Ireki customize = Aldatu arauak @@ -191,7 +235,12 @@ classic.export.text = [accent]Mindustry[] jolasak eguneraketa nagusi bat jaso du quit.confirm = Ziur irten nahi duzula? quit.confirm.tutorial = Ziur al zaude irten nahi duzula?\nTutoriala berriro hasi dezakezu hemen: [accent] Ezarpenak->Jolasa->Berriro hasi tutoriala.[] loading = [accent]Kargatzen... +reloading = [accent]Reloading Mods... saving = [accent]Gordetzen... +cancelbuilding = [accent][[{0}][] to clear plan +selectschematic = [accent][[{0}][] to select+copy +pausebuilding = [accent][[{0}][] to pause building +resumebuilding = [scarlet][[{0}][] to resume building wave = [accent]{0}. bolada wave.waiting = [lightgray]Boladarako {0} wave.waveInProgress = [lightgray]Bolada abian @@ -210,11 +259,18 @@ map.nospawn = Mapa honek ez du muinik jokalaria sortu dadin! Gehitu muin [accent map.nospawn.pvp = Mapa honek ez du etsaien muinik jokalaria sortu dadin! Gehitu [SCARLET]laranja ez den[] muinen bat edo batzuk mapa honi editorean. map.nospawn.attack = Mapa honek ez du etsaien muinik jokalariak eraso dezan! Gehitu muin [SCARLET]gorriak[] mapa honi editorean. map.invalid = Errorea mapa kargatzean: Mapa-fitxategi baliogabe edo hondatua. -map.publish.error = Errorea mapa argitaratzean: {0} +workshop.update = Update Item +workshop.error = Error fetching workshop details: {0} map.publish.confirm = Ziur mapa hau argitaratu nahi duzula?\n\n[lightgray]Ziurtatu aurretik lantegiaren erabilera arauekin bat zatozela, bestela zure mapak ez dira agertuko! +workshop.menu = Select what you would like to do with this item. +workshop.info = Item Info +changelog = Changelog (optional): eula = Steam EULA -map.publish = Mapa argitaratuta. -map.publishing = [accent]Publishing map... +missing = This item has been deleted or moved.\n[lightgray]The workshop listing has now been automatically un-linked. +publishing = [accent]Publishing... +publish.confirm = Are you sure you want to publish this?\n\n[lightgray]Make sure you agree to the Workshop EULA first, or your items will not show up! +publish.error = Error publishing item: {0} +steam.error = Failed to initialize Steam services.\nError: {0} editor.brush = Brotxa editor.openin = Ireki editorean editor.oregen = Mea sorrera @@ -344,7 +400,6 @@ campaign = Kanpaina load = Kargatu save = Gorde fps = FPS: {0} -tps = TPS: {0} ping = Ping: {0}ms language.restart = Berrabiarazi jolasa hizkuntza-ezarpenak aplikatzeko. settings = Ezarpenak @@ -352,12 +407,13 @@ tutorial = Tutoriala tutorial.retake = Berriro hasi tutoriala editor = Editorea mapeditor = Mapen editorea -donate = Dohaintza abandon = Abandonatu abandon.text = Eremu hau eta bere baliabide guztiak etsaiaren esku geratuko dira. locked = Blokeatuta complete = [lightgray]Helmena: -zone.requirement = {0}. bolada {1} zonaldean +requirement.wave = Reach Wave {0} in {1} +requirement.core = Destroy Enemy Core in {0} +requirement.unlock = Unlock {0} resume = Berrekin:\n[lightgray]{0} bestwave = [lightgray]Bolada onena: {0} launch = < EGOTZI > @@ -368,11 +424,13 @@ launch.confirm = Honek zure muinean dauden baliabide guztiak egotziko ditu.\nEzi launch.skip.confirm = Orain ez eginez gero, geroagoko beste bolada batera itxaron beharko duzu. uncover = Estalgabetu configure = Konfiguratu zuzkidura +bannedblocks = Banned Blocks +addall = Add All configure.locked = [lightgray]Zuzkiduraren konfigurazioa desblokeatzeko: {0} bolada. configure.invalid = Kopurua 0 eta {0} bitarteko zenbaki bat izan behar da. zone.unlocked = [lightgray]{0} desblokeatuta. zone.requirement.complete = {0}. boladara iritsia:\n{1} Eremuaren betebeharra beteta. -zone.config.complete = {0}. boladara iritsia:\nZuzkiduraren konfigurazioa desblokeatuta. +zone.config.unlocked = Loadout unlocked:[lightgray]\n{0} zone.resources = [lightgray]Antzemandako baliabideak: zone.objective = [lightgray]Helburua: [accent]{0} zone.objective.survival = Biziraupena @@ -428,15 +486,14 @@ settings.graphics = Grafikoak settings.cleardata = Garbitu jolasaren datuak... settings.clear.confirm = Ziur datu hauek garbitu nahi dituzula?\nEgindakoa ezin da desegin! settings.clearall.confirm = [scarlet]ABISUA![]\nHonek datu guztiak garbituko ditu, gordetako partidak, mapak, desblokeatutakoak, eta teklen konfigurazioak barne.\nBehin 'Ados' sakatzen duzula jolasak datuk guztiak ezabatuko ditu eta automatikoki irten. -settings.clearunlocks = Garbitu desblokeatutakoak -settings.clearall = Garbitu dena paused = [accent]< Pausatuta > +clear = Clear +banned = [scarlet]Banned yes = Bai no = Ez info.title = Informazioa error.title = [crimson]Errore bat gertatu da error.crashtitle = Errore bat gertatu da -attackpvponly = [scarlet]Erasoa/JvJ moduetan eskuragarri soilik blocks.input = Sarrera blocks.output = Irteera blocks.booster = Indargarria @@ -452,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 @@ -473,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} @@ -517,7 +576,9 @@ category.shooting = Tirokatzea category.optional = Aukerako hobekuntzak setting.landscape.name = Blokeatu horizontalean setting.shadows.name = Itzalak +setting.blockreplace.name = Automatic Block Suggestions setting.linear.name = Iragazte lineala +setting.hints.name = Hints setting.animatedwater.name = Animatutako ura setting.animatedshields.name = Animatutako ezkutuak setting.antialias.name = Antialias[lightgray] (berrabiarazi behar da)[] @@ -538,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 @@ -547,6 +610,7 @@ setting.fps.name = Erakutsi FPS setting.vsync.name = VSync setting.pixelate.name = Pixelatu[lightgray] (animazioak desgaitzen ditu) setting.minimap.name = Erakutsi mapatxoa +setting.position.name = Show Player Position setting.musicvol.name = Musikaren bolumena setting.ambientvol.name = Giroaren bolumena setting.mutemusic.name = Isilarazi musika @@ -558,6 +622,8 @@ setting.publichost.name = Partidaren ikusgaitasun publikoa setting.chatopacity.name = Txataren opakotasuna setting.lasersopacity.name = Power Laser Opacity setting.playerchat.name = Erakutsi jolas barneko txata +public.confirm = Do you want to make your game public?\n[accent]Anyone will be able to join your games.\n[lightgray]This can be changed later in Settings->Game->Public Game Visibility. +public.beta = Note that beta versions of the game cannot make public lobbies. uiscale.reset = Interfazearen eskala aldatu da.\nSakatu "Ados" eskala hau berresteko.\n[scarlet][accent] {0}[] segundo atzera egin eta irteteko... uiscale.cancel = Utzi eta irten setting.bloom.name = Distira @@ -569,13 +635,16 @@ category.multiplayer.name = Hainbat jokalari command.attack = Eraso command.rally = Batu command.retreat = Erretreta -keybind.gridMode.name = Bloke-hautua -keybind.gridModeShift.name = Kategoria-hautua +keybind.clear_building.name = Clear Building keybind.press = Sakatu tekla bat... keybind.press.axis = Sakatu ardatza edo tekla... keybind.screenshot.name = Maparen pantaila-argazkia keybind.move_x.name = Mugitu x keybind.move_y.name = Mugitu y +keybind.schematic_select.name = Select Region +keybind.schematic_menu.name = Schematic Menu +keybind.schematic_flip_x.name = Flip Schematic X +keybind.schematic_flip_y.name = Flip Schematic Y keybind.fullscreen.name = Txandakatu pantaila osoa keybind.select.name = Hautatu/Tirokatu keybind.diagonal_placement.name = Kokatze diagonala @@ -587,12 +656,14 @@ keybind.zoom_hold.name = Zoom mantenduz keybind.zoom.name = Zoom keybind.menu.name = Menua keybind.pause.name = Pausatu +keybind.pause_building.name = Pause/Resume Building keybind.minimap.name = Mapatxoa keybind.dash.name = Arrapalada keybind.chat.name = Txata keybind.player_list.name = Jokalarien zerrenda keybind.console.name = Kontsola keybind.rotate.name = Biratu +keybind.rotateplaced.name = Rotate Existing (Hold) keybind.toggle_menus.name = Txandakatu menuak keybind.chat_history_prev.name = Txat historialean aurrekoa keybind.chat_history_next.name = Txat historialean hurrengoa @@ -604,6 +675,7 @@ mode.survival.name = Biziraupena mode.survival.description = Modu arrunta. Baliabide mugatuak eta bolada automatikoak.\n[gray]Jolasteko etsaien sortze puntuak behar dira mapan. mode.sandbox.name = Jolastokia mode.sandbox.description = Baliabide amaigabeak eta boladen denboragailurik gabe. +mode.editor.name = Editor mode.pvp.name = JvJ mode.pvp.description = Borrokatu beste jokalari batzuk lokalean.\n[gray]Gutxienez bi kolore desberdinetako muinak behar dira mapan jolasteko. mode.attack.name = Erasoa @@ -771,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 @@ -790,6 +864,7 @@ block.junction.name = Lotunea block.router.name = Bideratzailea block.distributor.name = Banatzailea block.sorter.name = Antolatzailea +block.inverted-sorter.name = Inverted Sorter block.message.name = Mezua block.overflow-gate.name = Gainezkatze atea block.silicon-smelter.name = Silizio galdategia @@ -908,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.[] @@ -991,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. @@ -1010,6 +1088,7 @@ block.junction.description = Gurutzatutako bi garraio-zinten arteko zubi gisa ar block.bridge-conveyor.description = Elementuen garraiorako bloke aurreratua. Elementuak edozein gainazal edo eraikinen gainetik garraiatzen ditu 3 lauzatara gehienez. block.phase-conveyor.description = Elementuen garraiorako bloke aurreratua. Energia erabiltzen du hainbat lauzetara konektatutako beste Fasezko garraiagailu batera elementuak teleportatzeko. block.sorter.description = Elementuak antolatzen ditu. Elementu bat hautuarekin bat badator, aurrera jarraitu dezake. Bestela, elementua ezker eta eskuinera ateratzen da. +block.inverted-sorter.description = Processes items like a standard sorter, but outputs selected items to the sides instead. block.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 1c1b8b6184..3497c4efe2 100644 --- a/core/assets/bundles/bundle_fr.properties +++ b/core/assets/bundles/bundle_fr.properties @@ -1,29 +1,45 @@ credits.text = Créé par [ROYAL]Anuken[] - [SKY]anukendev@gmail.com[]\n\n[GRAY] credits = Crédits contributors = Traducteurs et contributeurs -discord = Rejoignez le discord de Mindustry +discord = Rejoignez le Discord de Mindustry link.discord.description = Le discord officiel de Mindustry! -link.github.description = Code source du jeu. +link.reddit.description = Le subreddit de Mindustry +link.github.description = Code source du jeu link.changelog.description = Liste des mises a jour link.dev-builds.description = Versions instables du jeu link.trello.description = Trello officiel pour les ajouts futurs link.itch.io.description = Page itch.io avec lien de téléchargement pour PC -link.google-play.description = Google play store +link.google-play.description = Google Play Store link.wiki.description = Le wiki officiel de Mindustry -linkfail = Erreur lors de l'ouverture du lien !\nL'URL a été copié dans votre presse papier. +linkfail = Erreur lors de l'ouverture du lien !\nL'URL a été copiée dans votre presse papier. screenshot = Capture d'écran sauvegardée à {0} screenshot.invalid = La carte est trop large, il n'y a potentiellement pas assez de mémoire pour la capture d'écran. gameover = Game over -gameover.pvp = L'équipe [accent] {0}[] a gagnée ! +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 = Contenus +load.content = Contenu load.system = Système load.mod = Mods - +schematic = Schéma +schematic.add = Sauvegarder le schéma... +schematics = Schémas +schematic.replace = Un schéma avec ce nom existe déjà. Remplacer? +schematic.import = Importer un schéma... +schematic.exportfile = Exporter le fichier +schematic.importfile = Importer un fichier +schematic.browseworkshop = Consulter le workshop +schematic.copy = Copier au presse-papier +schematic.copy.import = Importer du presse-papier +schematic.shareworkshop = Partager sur le workshop +schematic.flip = [accent][[{0}][]/[accent][[{1}][]: Retourner le schéma +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} @@ -31,16 +47,15 @@ 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ées en bleu. -map.delete = Êtes-vous sûr de vouloir supprimer cette carte "[accent]{0}[]"? +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}[]"? level.highscore = Meilleur score: [accent]{0} level.select = Sélection du niveau level.mode = Mode de jeu: showagain = Ne pas montrer la prochaine fois coreattack = [scarlet] -nearpoint = [ [scarlet]QUITTEZ LE POINT D'APPARITION ENNEMI IMMÉDIATEMENT[] ]\nannihilation imminente +nearpoint = [[ [scarlet]QUITTEZ LE POINT D'APPARITION ENNEMI IMMÉDIATEMENT[] ]\nannihilation imminente database = Base de données savegame = Sauvegarder la partie loadgame = Charger la partie @@ -49,10 +64,11 @@ customgame = Partie customisée newgame = Nouvelle partie none = minimap = Minimap +position = Position close = Fermer website = Site Web quit = Quitter -save.quit = Sauvegarder et Quitter +save.quit = Sauvegarder\net Quitter maps = Cartes maps.browse = Parcourir les cartes continue = Continuer @@ -64,25 +80,30 @@ uploadingcontent = Publication du contenu uploadingpreviewfile = Publication du fichier d'aperçu committingchanges = Validation des modifications done = Fait - +feature.unsupported = Votre appareil ne supporte pas cette fonctionnalité. mods.alphainfo = Gardez à l'esprit que les mods sont en alpha et[scarlet] peuvent être très buggés[].\nMerci de signaler les problèmes que vous rencontrez via le Github ou le Discord Mindustry. mods.alpha = [accent](Alpha) mods = Mods 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 modification du mod. +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.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[]. @@ -135,7 +156,7 @@ invalidid = ID du client invalide! Veuillez soumettre un rapport d'erreur. server.bans = Bannis server.bans.none = Aucun joueur banni trouvé! server.admins = Administrateurs -server.admins.none = Pas d'administrateurs trouvés! +server.admins.none = Aucun administrateur trouvé! server.add = Ajouter un serveur server.delete = Êtes-vous sûr de vouloir supprimer ce serveur ? server.edit = Modifier le serveur @@ -216,6 +237,10 @@ quit.confirm.tutorial = Êtes-vous sur de ce que vous faites?\nLe tutoriel peut loading = [accent]Chargement... reloading = [accent]Rechargement des Mods... saving = [accent]Sauvegarde... +cancelbuilding = [accent][[{0}][] pour effacer le plan +selectschematic = [accent][[{0}][] pour sélectionner et copier +pausebuilding = [accent][[{0}][] pour mettre la construction en pause +resumebuilding = [scarlet][[{0}][] pour reprendre la construction wave = [accent]Vague {0} wave.waiting = [lightgray]Vague dans {0} wave.waveInProgress = [lightgray]Vague en cours @@ -234,16 +259,18 @@ map.nospawn = Cette carte n'a pas de base pour qu'un joueur puisse y apparaisse! map.nospawn.pvp = Cette carte n'a pas de base ennemies pour qu'un joueur ennemi y apparaisse! Ajouter au moins une base [SCARLET] non-orange[] dans l'éditeur. map.nospawn.attack = Cette carte n'a aucune base ennemie à attaquer! Veuillez ajouter une base[SCARLET] rouge[] sur cette carte dans l'éditeur. map.invalid = Erreur lors du chargement de la carte: carte corrompue ou invalide. -map.publish.error = Erreur de publication de la carte: {0} -map.update = Mise à jour de la carte -map.load.error = Erreur lors de la récupération des details depuis le workshop: {0} -map.missing = Cette carte a été supprimée ou déplacée.\n[lightgray]Cette carte a été automatiquement retirée du listing du workshop. +workshop.update = Mettre à jour +workshop.error = Erreur lors de la récupération des détails du workshop: {0} map.publish.confirm = Êtes-vous sûr de vouloir publier cette carte?\n\n[lightgray]Assurez-vous d’accepter d’abord les CGU du Workshop, sinon vos cartes ne seront pas affichées! -map.menu = Sélectionnez ce que vous voulez faire avec cette carte. -map.changelog = Changelog (optionnel): +workshop.menu = Sélectionnez ce que vous souhaitez faire avec cet élément. +workshop.info = Infos sur l'élément +changelog = Journal des changements (optionnel): eula = CGU de Steam -map.publish = Carte publiée. -map.publishing = [accent]Publication de la carte... +missing = Cet élément a été supprimé ou déplacé.\n[lightgray]Le listing du workshop a maintenant été automatiquement dissociée. +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 @@ -320,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 @@ -335,12 +361,11 @@ 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 -filter.median = Median -filter.oremedian = Ore Median +filter.median = Médian +filter.oremedian = Minerai Médian filter.blend = Fusion filter.defaultores = Minerai par défaut filter.ore = Minerai @@ -348,7 +373,7 @@ filter.rivernoise = Bruit des rivières filter.mirror = Miroir filter.clear = Effacer filter.option.ignore = Ignorer -filter.scatter = Dispersement +filter.scatter = Disperser filter.terrain = Terrain filter.option.scale = Gamme filter.option.chance = Chance @@ -367,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 @@ -380,11 +404,9 @@ ping = Ping: {0}ms language.restart = Veuillez redémarrez votre jeu pour que le changement de langue prenne effet. settings = Paramètres tutorial = Tutoriel -tutorial.retake = Rejouer le Tutoriel +tutorial.retake = Refaire le Tutoriel editor = Éditeur mapeditor = Éditeur de carte -donate = Faire un\ndon - abandon = Abandonner abandon.text = Cette zone et toutes ses ressources vont être perdues. locked = Verrouillé @@ -408,14 +430,13 @@ configure.locked = [lightgray]Déloquer la configuration des ressources emporté configure.invalid = Le montant doit être un nombre compris entre 0 et {0}. zone.unlocked = [lightgray]{0} Débloquée. zone.requirement.complete = Exigences pour {0} complétées:[lightgray]\n{1} -zone.config.unlocke = Configuration des ressources emportées débloquée:[lightgray]\n{0} +zone.config.unlocked = Configuration des ressources emportées débloquée:[lightgray]\n{0} zone.resources = [lightgray]Ressources détectées: zone.objective = [lightgray]Objectif: [accent]{0} 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. @@ -426,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 @@ -441,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. @@ -456,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 @@ -491,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 @@ -510,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} @@ -525,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 @@ -537,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 @@ -559,7 +576,9 @@ 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 setting.animatedshields.name = Boucliers Animés setting.antialias.name = Antialias[lightgray] (redémarrage du jeu nécessaire)[] @@ -580,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 @@ -589,6 +610,7 @@ setting.fps.name = Afficher FPS setting.vsync.name = VSync setting.pixelate.name = Pixeliser[lightgray] (désactive les animations) setting.minimap.name = Afficher la Minimap +setting.position.name = Afficher la position du joueur setting.musicvol.name = Volume Musique setting.ambientvol.name = Volume Ambiant setting.mutemusic.name = Couper la Musique @@ -598,9 +620,10 @@ setting.crashreport.name = Envoyer un Rapport de Crash Anonyme setting.savecreate.name = Sauvegardes Auto setting.publichost.name = Visibilité de la Partie Publique setting.chatopacity.name = Opacité du Chat -setting.lasersopacity.name = Power Laser Opacity +setting.lasersopacity.name = Opacité des Connections Laser setting.playerchat.name = Montrer le Chat -public.confirm = Voulez-vous rendre votre partie publique?\n[lightgray]Ce paramètre peut être changé plus tard dans Paramètres->Jeu->Visibilité de la Partie Publique +public.confirm = Voulez-vous rendre votre partie publique?\n[accent]N'importe qui pourra rejoindre vos parties.\n[lightgray]Ce paramètre peut être changé plus tard dans Paramètres->Jeu->Visibilité de la Partie Publique +public.beta = Notez que les versions bêta du jeu ne peuvent pas créer des lobby publics. uiscale.reset = L'échelle de l'interface a été modifiée.\nAppuyez sur "OK" pour confirmer.\n[scarlet]Rétablissement aux paramètres d'avant et fermeture dans [accent] {0}[]... uiscale.cancel = Annuler & Quitter setting.bloom.name = Flou lumineux @@ -612,13 +635,16 @@ category.multiplayer.name = Multijoueur command.attack = Attaque command.rally = Rassembler command.retreat = Retraite -keybind.gridMode.name = Sélection des blocs -keybind.gridModeShift.name = Sélection des catégories +keybind.clear_building.name = Effacer les constructions keybind.press = Appuyer sur une touche... keybind.press.axis = Appuyer sur un axe ou une touche... keybind.screenshot.name = Capture d'écran keybind.move_x.name = Mouvement x keybind.move_y.name = Mouvement y +keybind.schematic_select.name = Sélectionner une région +keybind.schematic_menu.name = Menu des schéma +keybind.schematic_flip_x.name = Retourner le schéma sur l'axe X +keybind.schematic_flip_y.name = Retourner le schéma sur l'axe Y keybind.fullscreen.name = Basculer en Plein Écran keybind.select.name = Sélectionner/Tirer keybind.diagonal_placement.name = Placement en diagonale @@ -630,6 +656,7 @@ keybind.zoom_hold.name = Maintenir pour zoomer keybind.zoom.name = Zoom keybind.menu.name = Menu keybind.pause.name = Pause +keybind.pause_building.name = Pauser/Reprendre la construction keybind.minimap.name = Minimap keybind.dash.name = Sprint keybind.chat.name = Chat @@ -654,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 @@ -681,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 @@ -693,7 +718,7 @@ item.coal.name = Charbon item.graphite.name = Graphite item.titanium.name = Titane item.thorium.name = Thorium -item.silicon.name = Silice +item.silicon.name = Silicium item.plastanium.name = Plastanium item.phase-fabric.name = Tissu Phasé item.surge-alloy.name = Alliage Superchargé @@ -743,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 @@ -819,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 @@ -838,9 +864,10 @@ block.junction.name = Jonction block.router.name = Routeur block.distributor.name = Distributeur block.sorter.name = Trieur +block.inverted-sorter.name = Trieur Inversé block.message.name = Message block.overflow-gate.name = Barrière de Débordement -block.silicon-smelter.name = Fonderie de Silicone +block.silicon-smelter.name = Fonderie de Silicium block.phase-weaver.name = Tisseur à Phase block.pulverizer.name = Pulvérisateur block.cryofluidmixer.name = Refroidisseur @@ -955,16 +982,17 @@ 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.[] -tutorial.conveyor = [accent]Les convoyeurs[] sont utilisés pour transporter des objets au noyau.\nFaite une ligne de convoyeurs de la foreuse jusqu'au noyau.\n[accent]Maintenez votre souris pour les placer en ligne.[]\nGardez la touche[accent] CTRL[] enfoncé pour pouvoir les placer en diagonale.\n\n[accent]{0}/{1} convoyeurs placé en ligne\n[accent]0/1 ressources acheminées -tutorial.conveyor.mobile = [accent]Les convoyeurs[] sont utilisés pour transporter des objets au noyau.\nFaite une ligne de convoyeurs de la foreuse jusqu'au noyau.\n[accent] Maintenez votre doigt enfoncé[] et déplacez-le pour former une ligne.\n\n[accent]{0}/{1} convoyeurs placé en ligne\n[accent]0/1 ressources acheminées -tutorial.turret = Une fois qu'une ressource rentre dans votre noyau, elle peut être utilisée pour la construction.\nGardez à l'esprit que certaines ressources ne peuvent pas être utilisées pour la construction.\nCes ressources, tel que[accent] le charbon[] ou[accent] la ferraille[], ne peuvent pas rentrer dans votre noyau.\nDes structures défensives doivent être construites pour repousser l'[lightgray] ennemi[].\nConstruisez une [accent]tourelle Duo[] non loin de votre noyau. -tutorial.drillturret = Les tourelles Duo ont besoin de[accent] munitions en cuivre []pour tirer.\nPlacez une foreuse près de la tourelle.\nA l'aide de convoyeurs, alimentez la tourelle en cuivre.\n\n[accent]Munitions livrées: 0/1 -tutorial.pause = Pendant les batailles, vous pouvez mettre [accent]le jeu en pause.[]\nVous pouvez placer des bâtiments à construire tout en étant en pause.\n\n[accent]Appuyez sur la barre espace pour pauser. -tutorial.pause.mobile = Pendant les batailles, vous pouvez mettre [accent]le jeu en pause.[]\nVous pouvez placer des bâtiments à construire tout en étant en pause.\n\n[accent]Appuyez sur ce bouton en haut à gauche pour pauser. +tutorial.conveyor = [accent]Les convoyeurs[] sont utilisés pour transporter des objets au noyau.\nFaite une ligne de convoyeurs de la foreuse jusqu'au noyau.\n[accent]Maintenez votre souris pour les placer en ligne.[]\nGardez la touche[accent] CTRL[] enfoncée pour pouvoir les placer en diagonale.\n\nPlacez 2 convoyeurs avec l'outil ligne puis livrer une ressource à la base. +tutorial.conveyor.mobile = [accent]Les convoyeurs[] sont utilisés pour transporter des objets au noyau.\nFaite une ligne de convoyeurs de la foreuse jusqu'au noyau.\n[accent] Maintenez votre doigt enfoncé[] et deplacez-le pour former une ligne.\n\nPlacez 2 convoyeurs avec l'outil ligne puis livrer une ressource à la base. +tutorial.turret = Une fois qu'une ressource rentre dans votre noyau, elle peut être utilisée pour la construction.\nGardez à l'esprit que certaines ressources ne peuvent pas être utilisées pour la construction.\nCes ressources, telles que[accent] le charbon[] ou[accent] la ferraille[], ne peuvent pas rentrer dans votre noyau.\nDes structures défensives doivent être construites pour repousser l'[lightgray] ennemi[].\nConstruisez une [accent]tourrelle Duo[] non loin de votre noyau. +tutorial.drillturret = Les tourrelles Duo ont besoin de[accent] munitions en cuivre []pour tirer.\nPlacez une foreuse près de la tourelle.\nA l'aide de convoyeurs, alimentez la tourelle en cuivre.\n\n[accent]Munitions livrées: 0/1 +tutorial.pause = Pendant les batailles, vous pouvez mettre [accent]le jeu en pause.[]\nVous pouvez placer des batiments à construire tout en étant en pause.\n\n[accent]Appuyez sur la barre espace pour pauser. +tutorial.pause.mobile = Pendant les batailles, vous pouvez mettre [accent]le jeu en pause.[]\nVous pouvez placer des batiments à construire tout en étant en pause.\n\n[accent]Appuyez sur ce bouton en haut à gauche pour pauser. tutorial.unpause = Maintenant, appuyez à nouveau sur espace pour continuer à jouer. tutorial.unpause.mobile = Appuyez à nouveau dessus pour continuer à jouer. tutorial.breaking = Les blocs doivent souvent être détruits.\n[accent]Gardez enfoncé le bouton droit de votre souris[] pour détruire tous les blocs en une sélection.[]\n\n[accent]Détruisez tous les blocs de ferraille situés à gauche de votre noyau à l'aide de la sélection de zone. @@ -974,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. @@ -1017,11 +1044,11 @@ unit.revenant.description = Une plateforme aérienne lançant des missiles lourd block.message.description = Enregistre un message. Utilisé pour la communication entre alliés. block.graphite-press.description = Compresse des morceaux de charbon en feuilles de graphite pur. block.multi-press.description = Une version améliorée de la presse à graphite. Utilise de l'eau et de l'électricité pour traiter le charbon rapidement et efficacement. -block.silicon-smelter.description = Réduit le sable avec du charbon pur. Produit du silicone. +block.silicon-smelter.description = Réduit le sable avec du charbon pur. Produit du silicium. block.kiln.description = Fait fondre le sable et le plomb en verre trempé. Nécessite de petites quantités d'énergie. block.plastanium-compressor.description = Produit du plastanium à partir de pétrole et de titane. block.phase-weaver.description = Produit du tissu phasé à partir de thorium et de grandes quantités de sable. Nécessite des quantités massives d'énergie pour fonctionner. -block.alloy-smelter.description = Produit un alliage superchargé à l'aide de titane, de plomb, de silicone et de cuivre. +block.alloy-smelter.description = Produit un alliage superchargé à l'aide de titane, de plomb, de silicium et de cuivre. block.cryofluidmixer.description = Mélange de l’eau et de la fine poudre de titane pour former du liquide cryogénique. Indispensable pour l'utilisation du réacteur au thorium. block.blast-mixer.description = Écrase et mélange les amas de spores avec de la pyratite pour produire un mélange explosif. block.pyratite-mixer.description = Mélange le charbon, le plomb et le sable en pyratite hautement inflammable. @@ -1040,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. @@ -1056,9 +1085,10 @@ block.shock-mine.description = Blesse les ennemis qui marchent dessus. Quasiment block.conveyor.description = Convoyeur basique servant à transporter des objets. Les objets déplacés en avant sont automatiquement déposés dans les tourelles ou les bâtiments. Peut être tourné. block.titanium-conveyor.description = Convoyeur avancé . Déplace les objets plus rapidement que les convoyeurs standards. block.junction.description = Agit comme un pont pour deux lignes de convoyeurs se croisant. Utile lorsque deux différents convoyeurs déplacent différents matériaux à différents endroits. -block.bridge-conveyor.description = bloc de transport avancé permettant de traverser jusqu'à 3 blocs de n'importe quel terrain ou bâtiment. -block.phase-conveyor.description = convoyeur très avancé. Utilise de l'énergie pour téléporter des objets à un convoyeur phasé connecté jusqu'à une longue distance . +block.bridge-conveyor.description = Bloc de transport avancé permettant de traverser jusqu'à 3 blocs de n'importe quel terrain ou bâtiment. +block.phase-conveyor.description = Convoyeur très avancé. Utilise de l'énergie pour téléporter des objets à un convoyeur phasé connecté jusqu'à une longue distance . block.sorter.description = Trie les articles. Si un article correspond à la sélection, il peut passer. Autrement, l'article est distribué vers la gauche ou la droite. +block.inverted-sorter.description = Trie les articles comme un trieur standard, mais ceux correspondant à la sélection sont envoyés sur les côtés. block.router.description = Accepte les objets depuis une ou plus directions et le renvoie dans n'importe quelle direction. Utile pour séparer une chaîne de convoyeurs en plusieurs.[accent]Le seul et l'Unique[] block.distributor.description = Un routeur avancé qui sépare les objets jusqu'à 7 autres directions équitablement. block.overflow-gate.description = C'est la combinaison entre un Routeur et un Diviseur qui peut seulement distribuer à gauche et à droite si le chemin de devant est bloqué. @@ -1117,21 +1147,21 @@ block.cyclone.description = Une grande tourelle tirant rapidement... très rapid block.spectre.description = Une grande tourelle qui tire deux puissantes balles perce-blindage simultanément. block.meltdown.description = Une grande tourelle tirant de puissants rayons lasers avec une grande portée. block.command-center.description = Permet de donner des ordres aux unités alliées sur la carte.\nIndique aux unités de se rallier, d'attaquer un noyau ennemi ou de battre en retraite vers le noyau/l'usine. En l'absence de noyau adverse, les unités patrouilleront par défaut autour de la commande d'attaque. -block.draug-factory.description = Produit des drones Draug mineurs. -block.spirit-factory.description = Produit des petits drones qui réparent les bâtiments et minent des matériaux. -block.phantom-factory.description = Produit des drones avancés qui sont bien plus efficaces que les drones spirituels. +block.draug-factory.description = Produit des drones mineurs. +block.spirit-factory.description = Produit des drones qui réparent les batiments endommagés. +block.phantom-factory.description = Produit des drones de construction avancés. block.wraith-factory.description = Produit des intercepteurs rapides qui harcèlent l'ennemi. block.ghoul-factory.description = Produit des bombardiers lourds. -block.revenant-factory.description = Produit des unités terrestres lourdes avec des lasers. +block.revenant-factory.description = Produit des unités aériennes lourdes tirant des missiles. block.dagger-factory.description = Produit des unités terrestres basiques. block.crawler-factory.description = Produit des unités d'essaims autodestructeurs rapides. block.titan-factory.description = Produit des unités terrestres avancées et cuirassées. block.fortress-factory.description = Produit des unités terrestres d'artillerie lourde. -block.repair-point.description = Soigne en continu l'unité blessée la plus proche tant qu'elle est à sa portée. -block.dart-mech-pad.description = Quitte ton mécha ou ton vaisseau actuel pour un mécha d'attaque de base .\nUtilisez le reconstructeur en double cliquant dessus lorsque vous êtes dessus. -block.delta-mech-pad.description = Quitte ton mécha ou ton vaisseau actuel pour un mécha rapide mais peu résistant fait pour les stratégies de harcèlement.\nUtilisez le reconstructeur en double cliquant dessus lorsque vous êtes dessus. -block.tau-mech-pad.description = Quitte ton mécha ou ton vaisseau actuel pour un mécha de support qui peut soigner les bâtiments et unités alliées.\nUtilisez le reconstructeur en double cliquant dessus lorsque vous êtes dessus. -block.omega-mech-pad.description = Quitte ton mécha ou ton vaisseau actuel pour un mécha cuirassé et large, fait pour les assauts frontaux .\nUtilisez le reconstructeur en double cliquant dessus lorsque vous êtes dessus. -block.javelin-ship-pad.description = Quitte ton mécha ou ton vaisseau actuel pour un intercepteur rapide et puissant avec des armes électriques.\nUtilisez le reconstructeur en double cliquant dessus lorsque vous êtes dessus. -block.trident-ship-pad.description = Quitte ton mécha ou ton vaisseau actuel pour un bombardier lourd raisonnablement cuirassé .\nUtilisez le reconstructeur en double cliquant dessus lorsque vous êtes dessus. -block.glaive-ship-pad.description = Quitte ton mécha ou ton vaisseau actuel pour un large vaisseau cuirassé .\nUtilisez le reconstructeur en double cliquant dessus lorsque vous êtes dessus. +block.repair-point.description = Soigne en permanence l'unité endommagée la plus proche à proximité. +block.dart-mech-pad.description = Fournit la transformation en un mécha d'attaque basique.\nUtilisez le en cliquant dessus lorsque vous vous trouvez dessus. +block.delta-mech-pad.description = Fournit la transformation en un mécha d'attaque peu cuirassé.\nUtilisez le en cliquant dessus lorsque vous vous trouvez dessus. +block.tau-mech-pad.description = Fournit la transformation en un mécha de soutient avancé.\nUtilisez le en cliquant dessus lorsque vous vous trouvez dessus. +block.omega-mech-pad.description = Fournit la transformation en un mécha à missiles et à blindage lourd.\nUtilisez le en cliquant dessus lorsque vous vous trouvez dessus. +block.javelin-ship-pad.description = Fournit la transformation en un intercepteur rapide légèrement blindé.\nUtilisez le en cliquant dessus lorsque vous vous trouvez dessus. +block.trident-ship-pad.description = Fournit la transformation en un bombardier de soutien lourd.\nUtilisez le en cliquant dessus lorsque vous vous trouvez dessus. +block.glaive-ship-pad.description = Fournit la transformation en un large vaisseau de combat bien blindé.\nUtilisez le en cliquant dessus lorsque vous vous trouvez dessus. diff --git a/core/assets/bundles/bundle_fr_BE.properties b/core/assets/bundles/bundle_fr_BE.properties index 63c8e1e3da..e523de600a 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 @@ -16,11 +17,29 @@ screenshot.invalid = Carte trop grande, potentiellement pas assez de mémoire po gameover = Le base a été détruite. gameover.pvp = L'équipe[accent] {0}[] a gagnée ! highscore = [accent]Nouveau meilleur score ! +copied = Copied. load.sound = Son load.map = Maps load.image = Images load.content = Contenu load.system = Système +load.mod = Mods +schematic = Schematic +schematic.add = Save Schematic... +schematics = Schematics +schematic.replace = A schematic by that name already exists. Replace it? +schematic.import = Import Schematic... +schematic.exportfile = Export File +schematic.importfile = Import File +schematic.browseworkshop = Browse Workshop +schematic.copy = Copy to Clipboard +schematic.copy.import = Import from Clipboard +schematic.shareworkshop = Share on Workshop +schematic.flip = [accent][[{0}][]/[accent][[{1}][]: Flip Schematic +schematic.saved = Schematic saved. +schematic.delete.confirm = This schematic will be utterly eradicated. +schematic.rename = Rename Schematic +schematic.info = {0}x{1}, {2} blocks stat.wave = Vagues vaincues:[accent] {0} stat.enemiesDestroyed = Ennemies détruits:[accent] {0} stat.built = Bâtiments construits:[accent] {0} @@ -29,6 +48,7 @@ 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][[LAUNCH] your core to obtain the items indicated in blue. map.delete = Êtes-vous sûr de vouloir supprimer cette carte ?"[accent]{0}[]"? level.highscore = Meilleur score: [accent]{0} level.select = Sélection de niveau @@ -40,11 +60,11 @@ database = Base de données savegame = Sauvegarder la partie loadgame = Charger la partie joingame = Rejoindre la partie -addplayers = Ajouter/Enlever des joueurs customgame = Partie personnalisée newgame = Nouvelle partie none = minimap = Minimap +position = Position close = Fermer website = Website quit = Quitter @@ -60,6 +80,30 @@ 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.alpha = [accent](Alpha) +mods = Mods +mods.none = [LIGHT_GRAY]No mods found! +mods.guide = Modding Guide +mods.report = Report Bug +mods.openfolder = Open Mod Folder +mod.enabled = [lightgray]Enabled +mod.disabled = [scarlet]Disabled +mod.disable = Disable +mod.delete.error = Unable to delete mod. File may be in use. +mod.missingdependencies = [scarlet]Missing dependencies: {0} +mod.nowdisabled = [scarlet]Mod '{0}' is missing dependencies:[accent] {1}\n[lightgray]These mods need to be downloaded first.\nThis mod will be automatically disabled. +mod.enable = Enable +mod.requiresrestart = The game will now close to apply the mod changes. +mod.reloadrequired = [scarlet]Reload Required +mod.import = Import Mod +mod.import.github = Import Github Mod +mod.remove.confirm = This mod will be deleted. +mod.author = [LIGHT_GRAY]Author:[] {0} +mod.missing = This save contains mods that you have recently updated or no longer have installed. Save corruption may occur. Are you sure you want to load it?\n[lightgray]Mods:\n{0} +mod.preview.missing = Before publishing this mod in the workshop, you must add an image preview.\nPlace an image named[accent] preview.png[] into the mod's folder and try again. +mod.folder.missing = Only mods in folder form can be published on the workshop.\nTo convert any mod into a folder, simply unzip its file into a folder and delete the old zip, then restart your game or reload your mods. about.button = À propos name = Nom: noname = Choisissez d'abord [accent]un pseudo[]. @@ -140,7 +184,6 @@ server.port = Port: server.addressinuse = Adresse déjà utilisée ! server.invalidport = Numéro de port incorrect ! server.error = [crimson]Erreur lors de l'hébergement du serveur: [accent]{0} -save.old = Cette sauvegarde correspond à une ancienne version du jeu et ne peut donc plus être utilisée.\n\n[LIGHT_GRAY]La rétrocompatibilité des sauvegardes va être implémentée dans la version finale de la 4.0. save.new = Nouvelle sauvegarde save.overwrite = Êtes-vous sûr de vouloir\nécraser cette sauvegarde ? overwrite = Écraser @@ -174,6 +217,7 @@ warning = Avertissement. confirm = Confirmer delete = Supprimer view.workshop = View In Workshop +workshop.listing = Edit Workshop Listing ok = OK open = Ouvrir customize = Personnaliser @@ -191,7 +235,12 @@ classic.export.text = [accent]Mindustry[] has just had a major update.\nClassic quit.confirm = Êtes-vous sûr de vouloir quitter? quit.confirm.tutorial = Are you sure you know what you're doing?\nThe tutorial can be re-taken in[accent] Settings->Game->Re-Take Tutorial.[] loading = [accent]Chargement... +reloading = [accent]Reloading Mods... saving = [accent]Sauvegarde... +cancelbuilding = [accent][[{0}][] to clear plan +selectschematic = [accent][[{0}][] to select+copy +pausebuilding = [accent][[{0}][] to pause building +resumebuilding = [scarlet][[{0}][] to resume building wave = [accent]Vague {0} wave.waiting = [LIGHT_GRAY]Prochaine vague dans {0} wave.waveInProgress = [LIGHT_GRAY]Vague en cours @@ -210,11 +259,18 @@ map.nospawn = Cette carte ne possède pas de base pour que le joueur puisse appa map.nospawn.pvp = Cette carte ne contient aucune base ennemi dans lequel le joueur apparaît!\nAjoutez des bases [SCARLET]rouge[] à cette carte dans l'éditeur. map.nospawn.attack = Cette carte ne contient aucune base ennemi à attaquer! Ajoutez des bases [SCARLET]rouge[] à cette carte dans l'éditeur. map.invalid = Erreur lors du chargement de la carte: carte corrompue ou invalide. -map.publish.error = Error publishing map: {0} +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 -map.publish = Map published. -map.publishing = [accent]Publishing map... +missing = This item has been deleted or moved.\n[lightgray]The workshop listing has now been automatically un-linked. +publishing = [accent]Publishing... +publish.confirm = Are you sure you want to publish this?\n\n[lightgray]Make sure you agree to the Workshop EULA first, or your items will not show up! +publish.error = Error publishing item: {0} +steam.error = Failed to initialize Steam services.\nError: {0} editor.brush = Pinceau editor.openin = Ouvrir dans l'éditeur editor.oregen = Génération des minerais @@ -344,7 +400,6 @@ campaign = Campagne load = Charger save = Sauvegarder fps = FPS: {0} -tps = TPS: {0} ping = Ping: {0}ms language.restart = Veuillez redémarrez votre jeu pour le changement de langage prenne effet. settings = Paramètres @@ -352,12 +407,13 @@ tutorial = Tutoriel tutorial.retake = Re-Take Tutorial editor = Éditeur mapeditor = Éditeur de carte -donate = Faire un\ndon abandon = Abandonner abandon.text = Cette zone et toutes ses ressources seront perdues. locked = Verrouillé complete = [LIGHT_GRAY]Compléter: -zone.requirement = Vague {0} dans la zone {1} +requirement.wave = Reach Wave {0} in {1} +requirement.core = Destroy Enemy Core in {0} +requirement.unlock = Unlock {0} resume = Reprendre la partie en cours:\n[LIGHT_GRAY]{0} bestwave = [LIGHT_GRAY]Meilleur: {0} launch = Lancement @@ -368,11 +424,13 @@ launch.confirm = Cela lancera toutes les ressources dans votre noyau.\nVous ne p launch.skip.confirm = If you skip now, you will not be able to launch until later waves. uncover = Découvrir configure = Configurer le transfert des ressources. +bannedblocks = Banned Blocks +addall = Add All configure.locked = [LIGHT_GRAY]Atteigner la vague {0}\npour configurer le transfert des ressources. configure.invalid = Amount must be a number between 0 and {0}. zone.unlocked = [LIGHT_GRAY]{0} Débloquée. zone.requirement.complete = Vague {0} atteinte:\n{1} Exigences de la zone complétées -zone.config.complete = Vague {0} atteinte:\nConfiguration du transfert débloquée. +zone.config.unlocked = Loadout unlocked:[lightgray]\n{0} zone.resources = Ressources détectées: zone.objective = [lightgray]Objective: [accent]{0} zone.objective.survival = Survive @@ -428,15 +486,14 @@ settings.graphics = Graphiques settings.cleardata = Effacer les données du jeu... settings.clear.confirm = Êtes-vous sûr d'effacer ces données ?\n[scarlet]Ceci est irréversible settings.clearall.confirm = [scarlet]ATTENTION![]\nCet action effacera toutes les données , incluant les sauvegarges, les cartes, les déblocages et la configuration des touches.\nUne fois que vous aurez pressé 'Ok' le jeu effacera toutes les données et se fermera. -settings.clearunlocks = Éffacer les déblocages -settings.clearall = Tout effacer paused = En pause +clear = Clear +banned = [scarlet]Banned yes = Oui no = Non info.title = Info error.title = [crimson]Une erreur s'est produite error.crashtitle = Une erreur s'est produite -attackpvponly = [scarlet]Uniquement disponible dans les modes Attaque/PvP blocks.input = Ressource(s) requise(s) blocks.output = Ressource(s) produite(s) blocks.booster = Booster @@ -452,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 @@ -473,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} @@ -517,7 +576,9 @@ 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 setting.animatedshields.name = Boucliers Animés setting.antialias.name = Antialias[LIGHT_GRAY] (demande le redémarrage de l'appareil)[] @@ -538,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 @@ -547,6 +610,7 @@ setting.fps.name = Afficher FPS setting.vsync.name = VSync setting.pixelate.name = Pixélisé [LIGHT_GRAY](peut diminuer les performances)[] setting.minimap.name = Montrer la minimap +setting.position.name = Show Player Position setting.musicvol.name = Volume de la musique setting.ambientvol.name = Ambient Volume setting.mutemusic.name = Couper la musique @@ -558,6 +622,8 @@ setting.publichost.name = Public Game Visibility setting.chatopacity.name = Opacité du tchat setting.lasersopacity.name = Power Laser Opacity setting.playerchat.name = Afficher le tchat en jeu +public.confirm = Do you want to make your game public?\n[accent]Anyone will be able to join your games.\n[lightgray]This can be changed later in Settings->Game->Public Game Visibility. +public.beta = Note that beta versions of the game cannot make public lobbies. uiscale.reset = L'échelle de l'interface a été modifiée.\nAppuyez sur "OK" pour confirmer cette échelle.\n[scarlet]Revenir et sortir en[accent] {0}[] réglages... uiscale.cancel = Annuler et quitter setting.bloom.name = Flou lumineux @@ -569,13 +635,16 @@ category.multiplayer.name = Multijoueur command.attack = Attaquer command.rally = Rally command.retreat = Retraite -keybind.gridMode.name = Sélectionnez le bloc -keybind.gridModeShift.name = Sélection de la catégorie +keybind.clear_building.name = Clear Building keybind.press = Appuyez sur une touche ... keybind.press.axis = Appuyez sur un axe ou une touche... keybind.screenshot.name = Map Screenshot keybind.move_x.name = Mouvement X keybind.move_y.name = Mouvement 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 = Basculer en plein écran keybind.select.name = Sélectionner/Tirer keybind.diagonal_placement.name = Placement en diagonal @@ -587,12 +656,14 @@ keybind.zoom_hold.name = Tenir le zoom keybind.zoom.name = Zoom keybind.menu.name = Menu keybind.pause.name = Pause +keybind.pause_building.name = Pause/Resume Building keybind.minimap.name = Mini-Map keybind.dash.name = Sprint keybind.chat.name = Tchat keybind.player_list.name = Liste des joueurs keybind.console.name = Console keybind.rotate.name = Tourner +keybind.rotateplaced.name = Rotate Existing (Hold) keybind.toggle_menus.name = Montrer/Cacher les menus keybind.chat_history_prev.name = Reculer dans l'historique du tchat keybind.chat_history_next.name = Suite de l'historique du tchat @@ -604,6 +675,7 @@ mode.survival.name = Survival mode.survival.description = Le mode normal. Ressources limitées et vagues automatiques. mode.sandbox.name = Bac à sable mode.sandbox.description = Ressources infinies et pas de compte à rebours pour les vagues. +mode.editor.name = Editor mode.pvp.name = PvP mode.pvp.description = Lutter contre d'autres joueurs pour gagner ! mode.attack.name = Attaque @@ -771,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 @@ -790,6 +864,7 @@ block.junction.name = Junction block.router.name = Routeur block.distributor.name = [accent]Distributeur[] block.sorter.name = Trieur +block.inverted-sorter.name = Inverted Sorter block.message.name = Message block.overflow-gate.name = Barrière de Débordement block.silicon-smelter.name = Fonderie de silicone @@ -908,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.[] @@ -991,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. @@ -1010,6 +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.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 6fffc0d1b4..661c4e3c8f 100644 --- a/core/assets/bundles/bundle_in_ID.properties +++ b/core/assets/bundles/bundle_in_ID.properties @@ -3,8 +3,9 @@ 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 = List of update changes +link.changelog.description = Daftar rekam pembaruan link.dev-builds.description = Bentuk pengembangan (kurang stabil) link.trello.description = Papan Trello resmi untuk fitur terencana link.itch.io.description = Halaman itch.io dengan PC download dan versi web @@ -12,15 +13,33 @@ link.google-play.description = Google Play Store link.wiki.description = Wiki Mindustry resmi linkfail = Gagal membuka tautan!\nURL disalin ke papan ke papan klip. screenshot = Tangkapan layar disimpan di {0} -screenshot.invalid = Peta terlalu besar, tidak cukp memori untuk menangkap layar. +screenshot.invalid = Peta terlalu besar, tidak cukup memori untuk menangkap layar. gameover = Permainan Habis gameover.pvp = Tim[accent] {0}[] menang! highscore = [accent]Rekor Baru! -load.sound = Sounds -load.map = Maps -load.image = Images -load.content = Content -load.system = System +copied = Copied. +load.sound = Suara +load.map = Peta +load.image = Gambar +load.content = Konten +load.system = Sistem +load.mod = Mods +schematic = Schematic +schematic.add = Save Schematic... +schematics = Schematics +schematic.replace = A schematic by that name already exists. Replace it? +schematic.import = Import Schematic... +schematic.exportfile = Export File +schematic.importfile = Import File +schematic.browseworkshop = Browse Workshop +schematic.copy = Copy to Clipboard +schematic.copy.import = Import from Clipboard +schematic.shareworkshop = Share on Workshop +schematic.flip = [accent][[{0}][]/[accent][[{1}][]: Flip Schematic +schematic.saved = Schematic saved. +schematic.delete.confirm = This schematic will be utterly eradicated. +schematic.rename = Rename Schematic +schematic.info = {0}x{1}, {2} blocks stat.wave = Gelombang Terkalahkan:[accent] {0} stat.enemiesDestroyed = Musuh Terhancurkan:[accent] {0} stat.built = Jumlah Blok yang Dibangun:[accent] {0} @@ -29,6 +48,7 @@ stat.deconstructed = Jumlah Blok Dihancurkan Pemain:[accent] {0} stat.delivered = Sumber Daya yang Diluncurkan: stat.rank = Nilai Akhir: [accent]{0} launcheditems = [accent]Sumber Daya +launchinfo = [unlaunched][[LAUNCH] your core to obtain the items indicated in blue. map.delete = Apakah Anda yakin ingin menghapus peta "[accent]{0}[]"? level.highscore = Nilai Tertinggi: [accent]{0} level.select = Pilih Level @@ -40,33 +60,57 @@ database = Basis Data Inti savegame = Simpan Permainan loadgame = Muat Permainan joingame = Bermain Bersama -addplayers = Tambah/Menghapus Pemain customgame = Permainan Modifikasi newgame = Permainan Baru none = minimap = Peta Kecil +position = Position close = Tutup website = Website quit = Keluar -save.quit = Save & Quit +save.quit = Simpan & Keluar maps = Maps -maps.browse = Browse Maps +maps.browse = Cari Peta continue = Lanjutkan -maps.none = [LIGHT_GRAY]Tidak ketemu peta! -invalid = Invalid -preparingconfig = Preparing Config -preparingcontent = Preparing Content -uploadingcontent = Uploading Content -uploadingpreviewfile = Uploading Preview File -committingchanges = Comitting Changes -done = Done +maps.none = [LIGHT_GRAY]Peta tidak ditemukan! +invalid = Tidak valid +preparingconfig = Menyiapkan Config +preparingcontent = Menyiapkan Content +uploadingcontent = Mengupload Content +uploadingpreviewfile = Mengupload File Tinjauan +committingchanges = Membuat Perubahan +done = Selesai +feature.unsupported = Your device does not support this feature. +mods.alphainfo = Keep in mind that mods are in alpha, and[scarlet] may be very buggy[].\nReport any issues you find to the Mindustry Github or Discord. +mods.alpha = [accent](Alpha) +mods = Mods +mods.none = [LIGHT_GRAY]No mods found! +mods.guide = Modding Guide +mods.report = Report Bug +mods.openfolder = Open Mod Folder +mod.enabled = [lightgray]Enabled +mod.disabled = [scarlet]Disabled +mod.disable = Disable +mod.delete.error = Unable to delete mod. File may be in use. +mod.missingdependencies = [scarlet]Missing dependencies: {0} +mod.nowdisabled = [scarlet]Mod '{0}' is missing dependencies:[accent] {1}\n[lightgray]These mods need to be downloaded first.\nThis mod will be automatically disabled. +mod.enable = Enable +mod.requiresrestart = The game will now close to apply the mod changes. +mod.reloadrequired = [scarlet]Reload Required +mod.import = Import Mod +mod.import.github = Import Github Mod +mod.remove.confirm = This mod will be deleted. +mod.author = [LIGHT_GRAY]Author:[] {0} +mod.missing = This save contains mods that you have recently updated or no longer have installed. Save corruption may occur. Are you sure you want to load it?\n[lightgray]Mods:\n{0} +mod.preview.missing = Before publishing this mod in the workshop, you must add an image preview.\nPlace an image named[accent] preview.png[] into the mod's folder and try again. +mod.folder.missing = Only mods in folder form can be published on the workshop.\nTo convert any mod into a folder, simply unzip its file into a folder and delete the old zip, then restart your game or reload your mods. about.button = Tentang name = Nama: noname = Pilih[accent] nama pemain[] dahulu. filename = Nama File: unlocked = Konten baru terbuka! completed = [accent]Terselesaikan -techtree = Tech Tree +techtree = Cabang Teknologi research.list = [LIGHT_GRAY]Penelitian: research = Penelitian researched = [LIGHT_GRAY]{0} telah diteliti. @@ -74,21 +118,21 @@ players = {0} pemain aktif players.single = {0} pemain aktif server.closing = [accent]Menutup server... server.kicked.kick = Anda telah dikeluarkan dari server! -server.kicked.whitelist = You are not whitelisted here. +server.kicked.whitelist = Anda tidak ada di dalam whitelist. server.kicked.serverClose = Server ditutup. -server.kicked.vote = You have been vote-kicked. Goodbye. -server.kicked.clientOutdated = Client kadaluarsa! perbarui permainan Anda! +server.kicked.vote = Anda telah divoting kick. Sampai jumpa! +server.kicked.clientOutdated = Client kadaluarsa! Perbarui permainan Anda! server.kicked.serverOutdated = Server kadaluarsa! Tanya host untuk diperbarui! server.kicked.banned = Anda telah dilarang untuk memasuki server ini. -server.kicked.typeMismatch = This server is not compatible with your build type. -server.kicked.playerLimit = This server is full. Wait for an empty slot. +server.kicked.typeMismatch = Server ini tidak cocok dengan versi build Anda. +server.kicked.playerLimit = Server ini penuh. Tunggu untuk slot kosong. server.kicked.recentKick = Anda baru saja dikeluarkan dari server ini.\nTunggu sebelum masuk lagi. server.kicked.nameInUse = Sudah ada pemain dengan nama itu \ndi server ini. server.kicked.nameEmpty = Nama yang dipilih tidak valid. server.kicked.idInUse = Anda telah berada di server ini! Memasuki dengan dua akun tidak diizinkan. server.kicked.customClient = Server ini tidak mendukung versi modifikasi. Download versi resmi. server.kicked.gameover = Game over! -server.versions = Your version:[accent] {0}[]\nServer version:[accent] {1}[] +server.versions = Versi Anda:[accent] {0}[]\nVersi server:[accent] {1}[] host.info = Tombol [accent]host[] akan membuat server sementara di port [scarlet]6567[]. \nSemua orang yang memiliki [LIGHT_GRAY]Wi-Fi atau jaringan lokal[] akan bisa melihat server anda di daftar server mereka.\n\nJika Anda ingin pemain dari mana saja memasuki servermu dengan IP, [accent]port forwarding[] dibutuhkan.\n\n[LIGHT_GRAY]Diingat: Jika seseorang mengalami masalah memasuki permainan LAN mu, pastikan Anda telah mengizinkan Mindustry akses ke jaringan lokalmu di pengaturan firewall. join.info = Disini, Anda bisa memasuki [accent]server IP[], atau menemukan [accent]server lokal[] untuk bermain bersama.\nLAN dan WAN mendukung permainan bersama.\n\n[LIGHT_GRAY]Diingat: Tidak ada daftar server global; jika anda ingin bergabung dengan seseorang memakai IP, Anda perlu menanyakan host tentang IP mereka. hostserver = Host Permainan @@ -98,7 +142,7 @@ host = Host hosting = [accent]Membuka server... hosts.refresh = Muat Ulang hosts.discovering = Mencari permainan LAN -hosts.discovering.any = Discovering games +hosts.discovering.any = Mencari permainan server.refreshing = Memuat ulang server hosts.none = [lightgray]Tidak ditemukan game lokal! host.invalid = [scarlet]Tidak bisa menyambung dengan host. @@ -108,7 +152,7 @@ trace.ip = IP: [accent]{0} trace.id = ID Unik: [accent]{0} trace.mobile = Client Mobile: [accent]{0} trace.modclient = Client Modifikasi: [accent]{0} -invalidid = Client ID tidak valid! laporkan masalah. +invalidid = Client ID tidak valid! Laporkan masalah. server.bans = Pemain Dilarang Masuk server.bans.none = Tidak ada pemain yang dilarang masuk! server.admins = Admin @@ -122,25 +166,24 @@ server.version = [lightgray]Versi: {0} {1} server.custombuild = [yellow]Bentuk Modifikasi confirmban = Anda yakin ingin melarang pemain ini untuk masuk lagi? confirmkick = Anda yakin ingin mengeluarkan pemain ini? -confirmvotekick = Are you sure you want to vote-kick this player? +confirmvotekick = Anda yakin ingin vote-kick pemain ini? confirmunban = Anda yakin ingin mengizinkan pemain ini untuk masuk lagi? confirmadmin = Anda yakin ingin membuat pemain ini sebagai admin? confirmunadmin = Anda yakin ingin menghapus status admin dari pemain ini? joingame.title = Bermain Bersama joingame.ip = Alamat: disconnect = Terputus. -disconnect.error = Connection error. -disconnect.closed = Connection closed. +disconnect.error = Koneksi bermasalah. +disconnect.closed = Koneksi ditutup. disconnect.timeout = Timed out. disconnect.data = Gagal memuat data server! -cantconnect = Unable to join game ([accent]{0}[]). +cantconnect = Gagal menyambung! ([accent]{0}[]). connecting = [accent]Memasuki... connecting.data = [accent]Memuat data server... server.port = Port: server.addressinuse = Alamat sudah ada! server.invalidport = Nomor port tidak valid! server.error = [crimson]Error menghosting server: [accent]{0} -save.old = Simpanan ini dari versi yang lama, dan tidak bisa dipakai lagi.\n\n[LIGHT_GRAY]Fitur penyimpanan terbalik akan di implementasikan di versi 4.0 penuh. save.new = Simpanan Baru save.overwrite = Anda yakin ingin menindih \ntempat simpanan ini? overwrite = Tindih @@ -159,7 +202,7 @@ save.rename = Ganti nama save.rename.text = Nama baru: selectslot = Pilih simpanan. slot = [accent]Tempat {0} -editmessage = Edit Message +editmessage = Atur Pesan save.corrupted = [accent]File simpanan rusak atau tidak valid!\nJika Anda baru saja memperbarui permainannya, ini karena perubahan di format penyimpanan dan [scarlet]bukan[] sebuah bug. empty = on = Aktif @@ -173,7 +216,8 @@ save.playtime = Waktu Bermain: {0} warning = Peringatan. confirm = Konfirmasi delete = Hapus -view.workshop = View In Workshop +view.workshop = Lihat di Workshop +workshop.listing = Edit Workshop Listing ok = OK open = Buka customize = Modifikasi @@ -181,17 +225,22 @@ cancel = Batal openlink = Buka Tautan copylink = Salin Tautan back = Kembali -data.export = Export Data -data.import = Import Data +data.export = Ekspor Data +data.import = Impor Data data.exported = Data exported. -data.invalid = This isn't valid game data. -data.import.confirm = Importing external data will erase[scarlet] all[] your current game data.\n[accent]This cannot be undone![]\n\nOnce the data is imported, your game will exit immediately. -classic.export = Export Classic Data -classic.export.text = [accent]Mindustry[] has just had a major update.\nClassic (v3.5 build 40) save or map data has been detected. Would you like to export these saves to your phone's home folder, for use in the Mindustry Classic app? +data.invalid = Data game ini tidak valid. +data.import.confirm = Mengimpor data eksternal akan menghapus [scarlet] semua[] data yang tersimpan.\n[accent]Tidak dapat diundur lagi![]\n\nSetelah data diimpor, game akan segera ditutup. +classic.export = Ekspor Data Klasik +classic.export.text = [accent]Mindustry[] telah diperbarui besar-besaran.\nData simpanan atau peta Classic (v3.5 build 40) telah dideteksi. Anda yakin ingin mengekspor data ini ke folder home HP Anda untuk digunakan di Mindustry Classic? quit.confirm = Apakah Anda yakin ingin keluar? quit.confirm.tutorial = Are you sure you know what you're doing?\nThe tutorial can be re-taken in[accent] Settings->Game->Re-Take Tutorial.[] loading = [accent]Memuat... +reloading = [accent]Reloading Mods... saving = [accent]Menyimpan... +cancelbuilding = [accent][[{0}][] to clear plan +selectschematic = [accent][[{0}][] to select+copy +pausebuilding = [accent][[{0}][] to pause building +resumebuilding = [scarlet][[{0}][] to resume building wave = [accent]Gelombang {0} wave.waiting = [LIGHT_GRAY]Gelombang di {0} wave.waveInProgress = [LIGHT_GRAY]Gelombang sedang berlangsung @@ -210,11 +259,18 @@ map.nospawn = Peta ini tidak memiliki inti agar pemain bisa muncul! Tambahkan in map.nospawn.pvp = Peta ini tidak memiliki inti agar pemain lawan bisa muncul! Tambahkan inti[SCARLET] selain biru[] kedalam peta di penyunting. map.nospawn.attack = Peta ini tidak memiliki inti musuh agar pemain bisa menyerang! Tambahkan inti[SCARLET] merah[] kedalam peta di penyunting. map.invalid = Error memuat peta: rusak atau file peta tidak valid. -map.publish.error = Error publishing map: {0} +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 -map.publish = Map published. -map.publishing = [accent]Publishing map... +missing = This item has been deleted or moved.\n[lightgray]The workshop listing has now been automatically un-linked. +publishing = [accent]Publishing... +publish.confirm = Are you sure you want to publish this?\n\n[lightgray]Make sure you agree to the Workshop EULA first, or your items will not show up! +publish.error = Error publishing item: {0} +steam.error = Failed to initialize Steam services.\nError: {0} editor.brush = Kuas editor.openin = Buka di Penyunting editor.oregen = Generasi Sumber Daya @@ -344,7 +400,6 @@ campaign = Campaign load = Memuat save = Simpan fps = FPS: {0} -tps = TPS: {0} ping = Ping: {0}ms language.restart = Silahkan mengulang kembali permainan agar pengaturan bahasa berpengaruh. settings = Pengaturan @@ -352,12 +407,13 @@ tutorial = Tutorial tutorial.retake = Re-Take Tutorial editor = Penyunting mapeditor = Penyunting Peta -donate = Donasi abandon = Tinggalkan abandon.text = Zona ini dan semua sumber daya didalamnya akan berada di tangan musuh. locked = Dikunci complete = [LIGHT_GRAY]Mencapai: -zone.requirement = Gelombang {0} di zona {1} +requirement.wave = Reach Wave {0} in {1} +requirement.core = Destroy Enemy Core in {0} +requirement.unlock = Unlock {0} resume = Lanjutkan Zona:\n[LIGHT_GRAY]{0} bestwave = [LIGHT_GRAY]Gelombang Terbaik: {0} launch = < MELUNCUR > @@ -368,11 +424,13 @@ launch.confirm = Ini akan meluncurkan semua sumber daya di inti.\nAnta tidak bis launch.skip.confirm = If you skip now, you will not be able to launch until later waves. uncover = Buka configure = Konfigurasi Muatan +bannedblocks = Banned Blocks +addall = Add All configure.locked = [LIGHT_GRAY]Buka konfigurasi muatan: Gelombang {0}. configure.invalid = Amount must be a number between 0 and {0}. zone.unlocked = [LIGHT_GRAY]{0} terbuka. zone.requirement.complete = Gelombang {0} terselesaikan:\nPersyaratan zona {1} tercapai. -zone.config.complete = Gelombang {0} terselesaikan:\nkonfigurasi muatan terbuka. +zone.config.unlocked = Loadout unlocked:[lightgray]\n{0} zone.resources = Sumber Daya Terdeteksi: zone.objective = [lightgray]Objective: [accent]{0} zone.objective.survival = Survive @@ -428,15 +486,14 @@ settings.graphics = Grafik settings.cleardata = Menghapus Data Permainan... settings.clear.confirm = Anda yakin ingin menghapus data ini?\nWaktu tidak bisa diulang kembali! settings.clearall.confirm = [scarlet]PERINGATAN![]\nIni akan menghapus semua data permainan, termasuk simpanan, peta, bukaan dan keybind.\nSetelah Anda menekan 'ok' permainan akan menghapus semua data dan keluar otomatis. -settings.clearunlocks = Hapus Bukaan -settings.clearall = Hapus Semua paused = [accent]< Jeda > +clear = Clear +banned = [scarlet]Banned yes = Ya no = Tidak info.title = Info error.title = [crimson]Sebuah error telah terjadi error.crashtitle = Sebuah error telah terjadi -attackpvponly = [scarlet]Only available in Attack/PvP modes blocks.input = Masukan blocks.output = Pengeluaran blocks.booster = Booster @@ -452,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 @@ -473,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} @@ -517,7 +576,9 @@ 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 setting.animatedshields.name = Animasi Lindungan setting.antialias.name = Antialiasi[LIGHT_GRAY] (membutuhkan restart)[] @@ -538,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 @@ -547,6 +610,7 @@ setting.fps.name = Tunjukkan FPS setting.vsync.name = VSync setting.pixelate.name = Mode Pixel[LIGHT_GRAY] (menonaktifkan animasi) setting.minimap.name = Tunjukkan Peta kecil +setting.position.name = Show Player Position setting.musicvol.name = Volume Musik setting.ambientvol.name = Ambient Volume setting.mutemusic.name = Diamkan Musik @@ -558,6 +622,8 @@ setting.publichost.name = Public Game Visibility setting.chatopacity.name = Jelas-Beningnya Chat setting.lasersopacity.name = Power Laser Opacity setting.playerchat.name = Tunjukkan Chat dalam Permainan +public.confirm = Do you want to make your game public?\n[accent]Anyone will be able to join your games.\n[lightgray]This can be changed later in Settings->Game->Public Game Visibility. +public.beta = Note that beta versions of the game cannot make public lobbies. uiscale.reset = UI scale has been changed.\nPress "OK" to confirm this scale.\n[scarlet]Reverting and exiting in[accent] {0}[] settings... uiscale.cancel = Cancel & Exit setting.bloom.name = Bloom @@ -569,13 +635,16 @@ category.multiplayer.name = Bermain Bersama command.attack = Serang command.rally = Rally command.retreat = Mundur -keybind.gridMode.name = Pilih Blok -keybind.gridModeShift.name = Pilih Kategori +keybind.clear_building.name = Clear Building keybind.press = Tekan kunci... keybind.press.axis = Tekan sumbu atau kunci... keybind.screenshot.name = Tangkapan Layar Peta keybind.move_x.name = Pindah x keybind.move_y.name = Pindah 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 = Toggle Fullscreen keybind.select.name = Pilih/Tembak keybind.diagonal_placement.name = Penaruhan Diagonal @@ -587,12 +656,14 @@ keybind.zoom_hold.name = Tahan Mode Zoom keybind.zoom.name = Zoom keybind.menu.name = Menu keybind.pause.name = Jeda +keybind.pause_building.name = Pause/Resume Building keybind.minimap.name = Peta Kecil keybind.dash.name = Terbang keybind.chat.name = Chat keybind.player_list.name = Daftar pemain keybind.console.name = Console keybind.rotate.name = Putar +keybind.rotateplaced.name = Rotate Existing (Hold) keybind.toggle_menus.name = Muncul Tidaknya menu keybind.chat_history_prev.name = Sejarah Chat sebelum keybind.chat_history_next.name = Sejarah Chat sesudah @@ -604,6 +675,7 @@ mode.survival.name = Bertahan Hidup mode.survival.description = Mode normal. Sumber Daya terbatas dan gelombang otomatis. mode.sandbox.name = Mode Sandbox mode.sandbox.description = Sumber Daya tak terbatas dan tidak ada gelombang otomatis. +mode.editor.name = Editor mode.pvp.name = PvP mode.pvp.description = Melawan Pemain lain. Membutuhkan setidaknya 2 inti berbeda warna didalam peta untuk main. mode.attack.name = Penyerangan @@ -731,7 +803,7 @@ block.deepwater.name = Air Dalam block.water.name = Air block.tainted-water.name = Air Ternoda block.darksand-tainted-water.name = Air Ternodai Pasir Hitam -block.tar.name = Ter +block.tar.name = Tar block.stone.name = Batu block.sand.name = Pasir block.darksand.name = Pasir Hitam @@ -771,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 @@ -780,22 +854,23 @@ block.door-large.name = Pintu Besar block.duo.name = Duo block.scorch.name = Penghangus block.scatter.name = Penabur -block.hail.name = Hail +block.hail.name = Penghujan block.lancer.name = Lancer block.conveyor.name = Pengantar block.titanium-conveyor.name = Pengantar Berbahan Titanium block.armored-conveyor.name = Armored Conveyor -block.armored-conveyor.description = Moves items at the same speed as titanium conveyors, but possesses more armor. Does not accept inputs from the sides from anything but other conveyors. +block.armored-conveyor.description = Memindahkan barang sama cepatnya dengan pengantar titanium, namun memiliki lebih banyak armor. Tidak dapat menerima input dari samping dari apapun kecuali dari pengantar. block.junction.name = Simpangan block.router.name = Pengarah block.distributor.name = Distributor block.sorter.name = Penyortir -block.message.name = Message -block.overflow-gate.name = Gerbang Meluap +block.inverted-sorter.name = Inverted Sorter +block.message.name = Pesan +block.overflow-gate.name = Gerbang Luap block.silicon-smelter.name = Pelebur Silikon block.phase-weaver.name = Pengrajut Phase block.pulverizer.name = Penyemprot -block.cryofluidmixer.name = Mixer Cryofluid +block.cryofluidmixer.name = Penyampur Cryofluid block.melter.name = Pencair block.incinerator.name = Penghangus block.spore-press.name = Penekan Spora @@ -828,23 +903,23 @@ block.item-source.name = Sumber Item block.item-void.name = Penghilang Item block.liquid-source.name = Sumber Zat Cair block.power-void.name = Penghilang Listrik -block.power-source.name = Listrik Tak Terbatas +block.power-source.name = Listrik Takhingga block.unloader.name = Pembongkar Muatan -block.vault.name = Vault -block.wave.name = Wave +block.vault.name = Gudang +block.wave.name = Gelobang block.swarmer.name = Pengurung block.salvo.name = Salvo block.ripple.name = Periak -block.phase-conveyor.name = Pengantar Berbahan Phase +block.phase-conveyor.name = Pengantar Phase block.bridge-conveyor.name = Jembatan Pengantar block.plastanium-compressor.name = Pembentuk Plastanium -block.pyratite-mixer.name = Mixer Pyratite -block.blast-mixer.name = Mixer Peledak +block.pyratite-mixer.name = Penyampur Pyratite +block.blast-mixer.name = Penyampur Peledak block.solar-panel.name = Panel Surya block.solar-panel-large.name = Panel Surya Besar block.oil-extractor.name = Pegekstrak Oli -block.command-center.name = Command Center -block.draug-factory.name = Draug Miner Drone Factory +block.command-center.name = Pusat Perintah +block.draug-factory.name = Pabrik Drone Penambang Draug block.spirit-factory.name = Pabrik Drone Spirit block.phantom-factory.name = Pabrik Drone Phantom block.wraith-factory.name = Pabrik Penyerang Wraith @@ -856,7 +931,7 @@ block.fortress-factory.name = Pabrik Robot Fortress block.revenant-factory.name = Pabrik Penyerang Revenant block.repair-point.name = Titik Pulih block.pulse-conduit.name = Selang Denyut -block.phase-conduit.name = Selang Berbahan Phase +block.phase-conduit.name = Selang Phase block.liquid-router.name = Penyortir Zat Cair block.liquid-tank.name = Tank Zat Cair block.liquid-junction.name = Simpangan Zat Cair @@ -908,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.[] @@ -957,21 +1033,21 @@ mech.glaive-ship.description = Pesawat tempur yang besar nan kuat. Memiliki senj unit.draug.description = A primitive mining drone. Cheap to produce. Expendable. Automatically mines copper and lead in the vicinity. Delivers mined resources to the closest core. unit.spirit.description = unit pemulaan. muncul di inti secara standar. Menambang sumber daya dan memperbaiki blok. unit.phantom.description = unit canggih. Menambang sumber daya dan memperbaiki blok. Lebih efektif dari drone spirit. -unit.dagger.description = Unit darat dasar. Berguna di kelompok. +unit.dagger.description = Unit darat dasar. Berguna dalam satu gerombolan. unit.crawler.description = A ground unit consisting of a stripped-down frame with high explosives strapped on top. Not particular durable. Explodes on contact with enemies. unit.titan.description = Unit darat berbaja yang canggih ini menyerang target darat dan udara. unit.fortress.description = Unit meriam darat kelas berat. unit.eruptor.description = A heavy mech designed to take down structures. Fires a stream of slag at enemy fortifications, melting them and setting volatiles on fire. unit.wraith.description = Unit tabrak-lari yang cepat. unit.ghoul.description = Pengebom kelas berat. -unit.revenant.description = A heavy, hovering missile array. -block.message.description = Stores a message. Used for communication between allies. -block.graphite-press.description = Compresses chunks of coal into pure sheets of graphite. -block.multi-press.description = An upgraded version of the graphite press. Employs water and power to process coal quickly and efficiently. +unit.revenant.description = Jajaran roket kelas berat. +block.message.description = Menyimpan pesan. Digunakan untuk komunikasi antar sekutu. +block.graphite-press.description = Memadatkan bongkahan batu bara menjadi lempengan grafit murni. +block.multi-press.description = Versi pemadat grafit yang lebih baggus. Membutuhkan air dan tenaga untuk memproses batu bara lebih cepat dan efisien. block.silicon-smelter.description = Mengubah pasir dengan batu bara untuk memproduksi silikon. block.kiln.description = Membakar pasir dan timah menjadi kaca meta. Membutuhkan Listrik. block.plastanium-compressor.description = Memproduksi plastanium dari oli dan titanium. -block.phase-weaver.description = Memproduksi kain phase dari thorium dan banyak pasir. +block.phase-weaver.description = Memproduksi kain phase dari thorium dan banyak pasir. block.alloy-smelter.description = Memproduksi paduan surge dari titanium, timah, silikon dan tembaga. block.cryofluidmixer.description = Mencampur air dan titanium menjadi cryofluid yang lebih efisien untuk pendingin. block.blast-mixer.description = Menggunakan oli untuk membentuk pyratite menjadi senyawa peledak yang kurang mudah terbakar tetapi lebih eksplosif. @@ -980,7 +1056,7 @@ block.melter.description = Melelehkan kepingan menjadi terak untuk proses selanj block.separator.description = Mengekstrak logam-logam berguna dari terak. block.spore-press.description = Menekan pod spora menjadi oli. block.pulverizer.description = Menghancurkan kepingan menjadi pasir. Berguna jika tidak ada pasir disekitar. -block.coal-centrifuge.description = Solidifes oil into chunks of coal. +block.coal-centrifuge.description = Memadatkan oli menjadi bongkahan batu bara. block.incinerator.description = Menghancurkan item atau zat cair sisa. block.power-void.description = Menghilangkan semua tenaga yang masuk kedalamnya. Sandbox eksklusif. block.power-source.description = Menghasilkan tenaga tak terbatas. Sandbox eksklusif. @@ -991,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. @@ -999,17 +1077,18 @@ block.surge-wall.description = Blok pelindung terkuat.\nMempunyai kemungkinan un block.surge-wall-large.description = Blok pelindung terkuat.\nMempunyai kemungkinan untuk menyetrum penyerang. \nSebesar 4 blok. block.door.description = Pintu kecil yang bisa dibuka-tutup dengan menekannya.\nJika dibuka, musuh bisa masuk dan menembak. block.door-large.description = Pintu kecil yang bisa dibuka-tutup dengan menekannya.\nJika dibuka, musuh bisa masuk dan menembak.\nSebesar 4 blok. -block.mender.description = Periodically repairs blocks in its vicinity. Keeps defenses repaired in-between waves.\nOptionally uses silicon to boost range and efficiency. -block.mend-projector.description = menyembuhkan blok di sekelilingnya secara berkala. +block.mender.description = Menyembuhkan blok di sekelilingnya secara berkala. Menjaga keutuhan pertahanan di sela-sela gelombang.\nDapat menggunakan silikon untuk meningkatkan jangkauan dan efisiensi. +block.mend-projector.description = Versi Reparator yang lebih baik. Menyembuhkan blok di sekelilingnya secara berkala.\nDapat menggunakan silikon untuk meningkatkan jangkauan dan efisiensi. block.overdrive-projector.description = Menambah kecepatan bangunan sekitar, seperti bor dan pengantar. -block.force-projector.description = Membentuk medan gaya berbentuk segi enam disekitar, melindungi bangunan dan unit didalamnya dari tembakan. +block.force-projector.description = Membentuk medan gaya berbentuk heksagon disekitar, melindungi bangunan dan unit didalamnya dari tembakan. Dapat mengalami kelebihan panas jika membendung terlalu banyak kerusakan. Bisa menggunakan cairan untuk mendinginkan. Gunakan fabrik phase untuk memperbesar jangkauan. block.shock-mine.description = Mencedera musuh yang menginjak ranjau. Hampir tak kasat mata kepada musuh. -block.conveyor.description = Blok transportasi dasar. Memindahkan item ke menara ataupun pabrik. Bisa Diputar. +block.conveyor.description = Blok transportasi dasar. Memindahkan item ke menara ataupun pabrik. Bisa diputar. block.titanium-conveyor.description = Blok transportasi canggih. Memindahkan item lebih cepat daripada pengantar biasa. block.junction.description = Berguna seperti jembatan untuk dua pengantar yang bersimpangan. Berguna di situasi dimana dua pengantar berbeda membawa bahan berbeda ke lokasi yang berbeda. 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.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 1f4dcd4947..9189a36f3d 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 @@ -16,11 +17,29 @@ screenshot.invalid = Mappa troppo grossa, probabilmente non c'è abbastanza memo gameover = Il nucleo è stato distrutto. gameover.pvp = La squadra [accent] {0}[] ha vinto! highscore = [YELLOW]Nuovo record! -load.sound = Sounds -load.map = Maps -load.image = Images +copied = Copiato. +load.sound = Suoni +load.map = Mappe +load.image = Immagini load.content = Content -load.system = System +load.system = Sistema +load.mod = Mods +schematic = Schematiche +schematic.add = Salva Schema... +schematics = Schemi +schematic.replace = A schematic by that name already exists. Replace it? +schematic.import = Importa schema... +schematic.exportfile = Esporta file +schematic.importfile = Importa File +schematic.browseworkshop = Naviga sul Workshop +schematic.copy = copia negli appunti +schematic.copy.import = Importa dagli appunti +schematic.shareworkshop = Condividi sul Workshop +schematic.flip = [accent][[{0}][]/[accent][[{1}][]: Flip Schematic +schematic.saved = Schema salvato. +schematic.delete.confirm = Questo schema sarà cancellato definitivamente. +schematic.rename = Rinomina schema +schematic.info = {0}x{1}, {2} blocks stat.wave = Ondate sconfitte:[accent] {0} stat.enemiesDestroyed = Nemici distrutti:[accent] {0} stat.built = Costruzioni erette:[accent] {0} @@ -29,6 +48,7 @@ stat.deconstructed = Costruzioni smantellate:[accent] {0} stat.delivered = Riorse lanciate: stat.rank = Livello finale: [accent]{0} launcheditems = [accent]Oggetti lanciati +launchinfo = [unlaunched][[LAUNCH] il tuo core per ottenere gli oggetti indicati in blu. map.delete = Sei sicuro di voler eliminare questa mappa"[accent]{0}[]"? level.highscore = Miglior punteggio: [accent]{0} level.select = Selezione del livello @@ -40,26 +60,50 @@ database = Database nucleo savegame = Salva loadgame = Carica joingame = Unisciti al gioco -addplayers = Aggiungi/rimuovi giocatori customgame = Gioco personalizzato newgame = Nuova partita none = minimap = Minimappa +position = Position close = Chiuso -website = Website +website = Sito web quit = Esci save.quit = Salva ed esci maps = Mappe maps.browse = Consulta Mappe continue = Continua maps.none = [LIGHT_GRAY]Nessuna mappa trovata! -invalid = Invalido +invalid = Non valido preparingconfig = Preparo la configurazione preparingcontent = Preparo il contenuto uploadingcontent = Carico il contenuto uploadingpreviewfile = Carico file di anteprima committingchanges = Applico le modifiche done = Fatto +feature.unsupported = Your device does not support this feature. +mods.alphainfo = Tieni a mente che queste mod sono in alpha, e[scarlet] possono avere molti bug[].\nRiporta tutti i problemi che trovi in Mindustry su Github o Discord. +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.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. @@ -78,9 +122,9 @@ server.kicked.whitelist = Non sei presente in questa whitelist. server.kicked.serverClose = Server chiuso. server.kicked.vote = Sei stato cacciato su richiesta dei giocatori. Buona giornata. server.kicked.clientOutdated = Versione del client obsoleta! Aggiorna il tuo gioco! -server.kicked.serverOutdated = Server obsoleto! Chiedi all'host di aggiornare! -server.kicked.banned = Sei bannato da questo server. -server.kicked.typeMismatch = Questo server non è comparibile con la tua build. +server.kicked.serverOutdated = Server obsoleto! Chiedi all'host di aggiornare la versione del server! +server.kicked.banned = Sei bandito da questo server. +server.kicked.typeMismatch = Questo server non è compatibile con la tua build. server.kicked.playerLimit = Questo server è pieno. Attendi che si liberi un posto. server.kicked.recentKick = Sei stato cacciato di recente.\nAspetta prima di riconnetterti. server.kicked.nameInUse = C'è già qualcuno con il tuo nome su questo server. @@ -89,7 +133,7 @@ server.kicked.idInUse = Sei già su questo server! Non è permesso connettersi c server.kicked.customClient = Questo server non supporta le build personalizzate. Scarica la versione ufficiale dal sito. server.kicked.gameover = Game over! server.versions = Your version:[accent] {0}[]\nServer version:[accent] {1}[] -host.info = Il pulsante [accent]host [] ospita un server sulla porte [scarlet]6567[].[] Chiunque sulla stessa [LIGHT_GRAY]connessione wifi o rete locale[] dovrebbe essere in grado di vedere il proprio server nel proprio elenco server.\n\n Se vuoi che le persone siano in grado di connettersi ovunque tramite IP, è richiesto il [accent]port forwarding[]. \n\n[LIGHT_GRAY]Nota: se qualcuno sta riscontrando problemi durante la connessione al gioco LAN, assicurati di aver consentito a Mindustry di accedere alla rete locale nelle impostazioni del firewall. +host.info = Il pulsante [accent]host [] ospita un server sulla porta [scarlet]6567[].[] Chiunque sulla stessa [LIGHT_GRAY]connessione wifi o rete locale[] dovrebbe essere in grado di vedere il server nell'elenco server.\n\n Se vuoi che le persone siano in grado di connettersi ovunque tramite IP, è richiesto il [accent]port forwarding[]. \n\n[LIGHT_GRAY]Nota: se qualcuno sta riscontrando problemi durante la connessione al gioco LAN, assicurati di aver consentito a Mindustry di accedere alla rete locale nelle impostazioni del firewall. join.info = Qui è possibile inserire un [accent]IP del server[] a cui connettersi, o scoprire [accent]un server sulla rete locale[] disponibile.\n Sono supportati sia il multiplayer LAN che WAN. \n\n[LIGHT_GRAY]Nota: non esiste un elenco di server globali automatici; se si desidera connettersi a qualcuno tramite IP, è necessario chiedere all'host il proprio IP. hostserver = Ospita Server invitefriends = Invita amici @@ -132,7 +176,7 @@ disconnect = Disconnesso. disconnect.error = Connection error. disconnect.closed = Connection closed. disconnect.timeout = Timed out. -disconnect.data = Il mondo non si vuole caricare, mi dispiace! +disconnect.data = errore nel caricamento del mondo, mi dispiace! cantconnect = Impossibile unirsi al server ([accent]{0}[]). connecting = [accent]Connessione in corso ... connecting.data = [accent]Caricamento dei dati del mondo ... @@ -140,7 +184,6 @@ server.port = Porta: server.addressinuse = Indirizzo già in uso! server.invalidport = Numero di porta non valido! server.error = [crimson]Errore nell'hosting del server: [accent] {0} -save.old = Questo salvataggio è per una versione precedente di mindustry e non può attualmente essere utilizzato .\n\n[LIGHT_GRAY]La cvompatibilità con i salvataggi precedenti verrà abilitata nella versione definitiva di mindustry 4.0. save.new = Nuovo Salvataggio save.overwrite = Sei sicuro di voler sovrascrivere questo salvataggio? overwrite = Sovrascrivi @@ -174,6 +217,7 @@ warning = Attenzione confirm = Conferma delete = Elimina view.workshop = Vedi nel Workshop +workshop.listing = Edit Workshop Listing ok = OK open = Apri customize = Personalizza @@ -191,7 +235,12 @@ classic.export.text = [accent]Mindustry[] ha appena rilasciato un aggiornamento quit.confirm = Sei sicuro di voler uscire? quit.confirm.tutorial = Sei sicuro di sapere cosa stai facendo? Il tutorial può essere ripetuto in[accent] Gioca > Tutorial.[] loading = [accent]Caricamento in corso ... +reloading = [accent]Reloading Mods... saving = [accent]Salvando ... +cancelbuilding = [accent][[{0}][] to clear plan +selectschematic = [accent][[{0}][] to select+copy +pausebuilding = [accent][[{0}][] to pause building +resumebuilding = [scarlet][[{0}][] to resume building wave = [accent]Ondata {0} wave.waiting = [LIGHT_GRAY]Ondata tra {0} wave.waveInProgress = [LIGHT_GRAY]Ondata in corso... @@ -210,11 +259,18 @@ map.nospawn = Questa mappa non possiede un nucleo in cui spawnare! Aggiungine un map.nospawn.pvp = Questa mappa non ha un nucleo nemico! Aggiungi un [SCARLET]nucleo rosso[] nell'editor per poter giocare. map.nospawn.attack = Questa mappa non ha un nucleo nemico! Aggiungi un [SCARLET]nucleo rosso[] nell'editor per poter giocare. map.invalid = Errore nel caricamento della mappa: file mappa corrotto o non valido. -map.publish.error = Errore durante la pubblicazione della mappa:\n{0} +workshop.update = Update Item +workshop.error = Error fetching workshop details: {0} map.publish.confirm = Vuoi pubblicare questa mappa?\n\n[lightgray]Assicurati di aver accettato il Workshop EULA, o le tue mappe non saranno visibili! +workshop.menu = Select what you would like to do with this item. +workshop.info = Item Info +changelog = Changelog (optional): eula = Steam EULA -map.publish = Mappa pubblicata. -map.publishing = [accent]Pubblico la mappa... +missing = This item has been deleted or moved.\n[lightgray]The workshop listing has now been automatically un-linked. +publishing = [accent]Publishing... +publish.confirm = Are you sure you want to publish this?\n\n[lightgray]Make sure you agree to the Workshop EULA first, or your items will not show up! +publish.error = Error publishing item: {0} +steam.error = Failed to initialize Steam services.\nError: {0} editor.brush = Pennello editor.openin = Apri nell'editor editor.oregen = Generazione dei minerali @@ -284,7 +340,7 @@ editor.exportimage = Esporta immagine editor.exportimage.description = Esporta file immagine mappa editor.loadimage = Carica\nimmagine editor.saveimage = Salva\nImmagine -editor.unsaved = [scarlet]Hai modifiche non salvate![]\nSei sicuro di voler uscire? +editor.unsaved = [scarlet]Alcune modifiche non sono state salvate![]\nSei sicuro di voler uscire? editor.resizemap = Ridimensiona la mappa editor.mapname = Nome Mappa: editor.overwrite = [accent]Attenzione!\nQuesto sovrascrive una mappa esistente. @@ -344,7 +400,6 @@ campaign = Campagna load = Carica save = Salva fps = FPS: {0} -tps = TPS: {0} ping = Ping: {0}ms language.restart = Riavvia il gioco affinché il cambiamento della lingua abbia effetto. settings = Impostazioni @@ -352,12 +407,13 @@ tutorial = Tutorial tutorial.retake = Ripeti il tutorial editor = Editor mapeditor = Editor Mappe -donate = Dona abandon = Abbandona -abandon.text = Questa zona e tutte le sue risorse saranno perdute e passeranno al nemico. +abandon.text = Questa zona e tutte le tue risorse saranno perdute e passeranno al nemico. locked = Bloccato complete = [LIGHT_GRAY]Completato: -zone.requirement = Onda {0} in zona {1} +requirement.wave = Reach Wave {0} in {1} +requirement.core = Destroy Enemy Core in {0} +requirement.unlock = Unlock {0} resume = Riprendi zona:\n[LIGHT_GRAY]{0} bestwave = [LIGHT_GRAY]Migliore: {0} launch = Decollare @@ -368,11 +424,13 @@ launch.confirm = Questo trasporterà tutte le risorse nel tuo nucleo.\nNon riusc launch.skip.confirm = Se salti adesso non riuscirai a decollare fino alle ondate successive uncover = Svelare configure = Configura l'equipaggiamento +bannedblocks = Banned Blocks +addall = Add All configure.locked = [LIGHT_GRAY]Arriva all'ondata {0}\nper configurare l'equipaggiamento. configure.invalid = Il valore dev'essere un numero compresto tra 0 e {0}. zone.unlocked = [LIGHT_GRAY]{0} sbloccata. zone.requirement.complete = Ondata {0} raggiunta:\n{1} requisiti di zona soddisfatti. -zone.config.complete = Ondata {0} raggiunta:\nEquipaggiamento personalizzato sbloccato. +zone.config.unlocked = Loadout unlocked:[lightgray]\n{0} zone.resources = Risorse trovate: zone.objective = [lightgray]Obiettivo: [accent]{0} zone.objective.survival = Sopravvivere @@ -428,15 +486,14 @@ settings.graphics = Grafica settings.cleardata = Cancella dati di gioco... settings.clear.confirm = Sei sicuro di voler cancellare i dati?\nNon può essere annullato! settings.clearall.confirm = [scarlet]ATTENZIONE![]\nQuesto cancellerà tutti i dati, includendo salvataggi, mappe, oggetti sbloccati, impostazioni.\nDopo aver premuto su 'ok' il gioco eliminerà i dati e si chiuderà. -settings.clearunlocks = Cancella oggetti sbloccati -settings.clearall = Cancella tutto paused = In pausa +clear = Clear +banned = [scarlet]Banned yes = Si no = No info.title = [accent] Info error.title = [crimson]Si è verificato un errore error.crashtitle = Si è verificato un errore -attackpvponly = [scarlet]Solo possible nelle modalità Attacco/PvP blocks.input = Ingresso blocks.output = Uscita blocks.booster = Booster @@ -452,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à @@ -473,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} @@ -517,14 +576,16 @@ 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 setting.animatedshields.name = Scudi animati setting.antialias.name = Antialias[LIGHT_GRAY] (richiede riapertura gioco)[] setting.indicators.name = Indicatori Alleati setting.autotarget.name = Mira automatica setting.keyboard.name = Tastiera -setting.touchscreen.name = Touchscreen Controls +setting.touchscreen.name = Controlli Touchscreen setting.fpscap.name = Limite FPS setting.fpscap.none = Niente setting.fpscap.text = {0} FPS @@ -538,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 @@ -547,6 +610,7 @@ setting.fps.name = Mostra FPS setting.vsync.name = VSync setting.pixelate.name = Sfocare [LIGHT_GRAY](potrebbe ridure il rendimento) setting.minimap.name = Mostra minimappa +setting.position.name = Show Player Position setting.musicvol.name = Volume Musica setting.ambientvol.name = Volume Ambiente setting.mutemusic.name = Silenzia musica @@ -558,6 +622,8 @@ setting.publichost.name = Gioco visibile pubblicamente setting.chatopacity.name = Opacità chat setting.lasersopacity.name = Power Laser Opacity setting.playerchat.name = Mostra Chat in-game +public.confirm = Do you want to make your game public?\n[accent]Anyone will be able to join your games.\n[lightgray]This can be changed later in Settings->Game->Public Game Visibility. +public.beta = Note that beta versions of the game cannot make public lobbies. uiscale.reset = La scala dell'interfaccia utente è stata modificata.\nPremere "OK" per confermare questa scala.\n[scarlet] Ripristina ed esci dalle impostazioni [accent] {0}[] impostazioni... uiscale.cancel = Annulla ed esci setting.bloom.name = Shaders @@ -569,13 +635,16 @@ category.multiplayer.name = Multigiocatore command.attack = Attacca command.rally = Guardia command.retreat = Ritirata -keybind.gridMode.name = Seleziona blocco -keybind.gridModeShift.name = Seleziona categoria +keybind.clear_building.name = Clear Building keybind.press = Premi un tasto... keybind.press.axis = Premi un'asse o un tasto... keybind.screenshot.name = Screenshot della mappa keybind.move_x.name = Muovi orizzontale keybind.move_y.name = Muovi verticale +keybind.schematic_select.name = Select Region +keybind.schematic_menu.name = Schematic Menu +keybind.schematic_flip_x.name = Flip Schematic X +keybind.schematic_flip_y.name = Flip Schematic Y keybind.fullscreen.name = Schermo Intero keybind.select.name = Seleziona keybind.diagonal_placement.name = Posizionamento diagonale @@ -587,12 +656,14 @@ keybind.zoom_hold.name = Attiva zoom keybind.zoom.name = Esegui zoom keybind.menu.name = Apri Menu keybind.pause.name = Pausa +keybind.pause_building.name = Pause/Resume Building keybind.minimap.name = Minimappa keybind.dash.name = Scatto keybind.chat.name = Chat keybind.player_list.name = Lista dei Giocatori keybind.console.name = Console keybind.rotate.name = Ruotare +keybind.rotateplaced.name = Rotate Existing (Hold) keybind.toggle_menus.name = Mostra/Nascondi HUD keybind.chat_history_prev.name = Scorri chat vero l'alto keybind.chat_history_next.name = Scorri chatt verso il basso @@ -604,6 +675,7 @@ mode.survival.name = Sopravvivenza mode.survival.description = La modalità normale. Risorse limitate ed ondate in entrata automatiche. mode.sandbox.name = Creativa mode.sandbox.description = Risorse infinite e nessun timer per le ondate. +mode.editor.name = Editor mode.pvp.name = PvP mode.pvp.description = Lotta contro altri giocatori. mode.attack.name = Schermaglia @@ -771,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 @@ -790,6 +864,7 @@ block.junction.name = Incrocio block.router.name = Distributore block.distributor.name = Distributore Grande block.sorter.name = Filtro +block.inverted-sorter.name = Inverted Sorter block.message.name = Message block.overflow-gate.name = Separatore per eccesso block.silicon-smelter.name = Fonderia @@ -908,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. [] @@ -991,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. @@ -1010,6 +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.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 a07fdd0ac6..61738fde08 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 = 不安定な開発版 @@ -16,12 +17,29 @@ screenshot.invalid = マップが広すぎます。スクリーンショット gameover = ゲームオーバー gameover.pvp = [accent] {0}[] チームの勝利! highscore = [accent]ハイスコアを更新! +copied = Copied. load.sound = サウンド load.map = マップ load.image = 画像 load.content = コンテンツ load.system = システム load.mod = MOD +schematic = Schematic +schematic.add = Save Schematic... +schematics = Schematics +schematic.replace = A schematic by that name already exists. Replace it? +schematic.import = Import Schematic... +schematic.exportfile = Export File +schematic.importfile = Import File +schematic.browseworkshop = Browse Workshop +schematic.copy = Copy to Clipboard +schematic.copy.import = Import from Clipboard +schematic.shareworkshop = Share on Workshop +schematic.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 stat.wave = 防衛したウェーブ:[accent] {0} stat.enemiesDestroyed = 敵による破壊数:[accent] {0} stat.built = 建設した建造物数:[accent] {0} @@ -30,7 +48,7 @@ stat.deconstructed = 解体した建造物数:[accent] {0} stat.delivered = 獲得した資源: stat.rank = 最終ランク: [accent]{0} launcheditems = [accent]回収したアイテム -launchedinfo = [unlaunched][[LAUNCH]青い項目がコア受け取ます +launchinfo = [unlaunched][[LAUNCH] your core to obtain the items indicated in blue. map.delete = マップ "[accent]{0}[]" を削除してもよろしいですか? level.highscore = ハイスコア: [accent]{0} level.select = レベル選択 @@ -42,11 +60,11 @@ database = コアデーターベース savegame = 保存 loadgame = 読み込む joingame = マルチプレイ -addplayers = プレイヤーを追加/削除 customgame = カスタムプレイ newgame = 新しく始める none = <なし> minimap = ミニマップ +position = Position close = 閉じる website = ウェブサイト quit = 終了 @@ -62,20 +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見つかりませんでした! -mod.enabled = [lightgray]Enabled -mod.disabled = [scarlet]Disabled -mod.disable = 可能にしません -mod.enable = 可能にする -mod.requiresrestart = このモードをインストールするため, このゲームは再起動します -mod.reloadrequired = [scarlet]リロード必須 -mod.import = モードをインポート -mod.remove.confirm = このモードを削除されます +mods.none = [LIGHT_GRAY]Modが見つかりませんでした! +mods.guide = Modding Guide +mods.report = Report Bug +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.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]プレイヤー名[]を入力してください。 @@ -156,7 +184,6 @@ server.port = ポート: server.addressinuse = アドレスがすでに使用されています! server.invalidport = 無効なポート番号です! server.error = [crimson]サーバーのホストエラー: [accent]{0} -save.old = このセーブデータは古いバージョン向けで、今後使用されません。\n\n[lightgray]セーブデータの下位互換性の実装は正式版4.0で行われます。 save.new = 新規保存 save.overwrite = このスロットに上書きしてもよろしいですか? overwrite = 上書き @@ -190,6 +217,7 @@ warning = 警告 confirm = 確認 delete = 削除 view.workshop = ワークショップを見る +workshop.listing = Edit Workshop Listing ok = OK open = 開く customize = カスタマイズ @@ -207,7 +235,12 @@ classic.export.text = [accent]Mindustry[]のメジャーアップデートがあ quit.confirm = 終了してもよろしいですか? quit.confirm.tutorial = チュートリアルを終了しますか?\nチュートリアルは [accent]設定->ゲーム->チュートリアル[] から再度受けることができます。 loading = [accent]読み込み中... +reloading = [accent]Reloading Mods... saving = [accent]保存中... +cancelbuilding = [accent][[{0}][] to clear plan +selectschematic = [accent][[{0}][] to select+copy +pausebuilding = [accent][[{0}][] to pause building +resumebuilding = [scarlet][[{0}][] to resume building wave = [accent]ウェーブ {0} wave.waiting = [lightgray]次のウェーブまで {0} 秒 wave.waveInProgress = [lightgray]ウェーブ進行中 @@ -226,11 +259,18 @@ map.nospawn = このマップにはプレイヤーが出現するためのコア map.nospawn.pvp = このマップには敵のプレイヤーが出現するためのコアがありません! エディターで[SCARLET]オレンジ色ではない[]コアをマップに追加してください。 map.nospawn.attack = このマップには攻撃するための敵のコアがありません! エディターで[SCARLET]赤色[]のコアをマップに追加してください。 map.invalid = マップの読み込みエラー: ファイルが無効、または破損しています。 -map.publish.error = マップの公開中にエラーが発生しました: {0} +workshop.update = Update Item +workshop.error = Error fetching workshop details: {0} map.publish.confirm = 本当にこのマップを公開しますか?\n\n[lightgray]公開するためには、ワークショップ利用規約に同意する必要があります。 +workshop.menu = Select what you would like to do with this item. +workshop.info = Item Info +changelog = Changelog (optional): eula = Steam EULA -map.publish = マップを公開しました。 -map.publishing = [accent]マップを公開中... +missing = This item has been deleted or moved.\n[lightgray]The workshop listing has now been automatically un-linked. +publishing = [accent]Publishing... +publish.confirm = Are you sure you want to publish this?\n\n[lightgray]Make sure you agree to the Workshop EULA first, or your items will not show up! +publish.error = Error publishing item: {0} +steam.error = Failed to initialize Steam services.\nError: {0} editor.brush = ブラシ editor.openin = エディターで開く editor.oregen = 鉱石の生成 @@ -360,7 +400,6 @@ campaign = プレイ load = 読み込む save = 保存 fps = FPS: {0} -tps = TPS: {0} ping = Ping: {0}ms language.restart = ゲームを再起動後、言語設定が有効になります。 settings = 設定 @@ -368,12 +407,13 @@ tutorial = チュートリアル tutorial.retake = チュートリアル editor = エディター mapeditor = マップエディター -donate = 寄付 abandon = 撤退 abandon.text = このゾーンのすべての資源が敵に奪われます。 locked = ロック complete = [lightgray]達成済み: -zone.requirement = ゾーン {1} でウェーブ {0} を達成 +requirement.wave = Reach Wave {0} in {1} +requirement.core = Destroy Enemy Core in {0} +requirement.unlock = Unlock {0} resume = 再開ゾーン:\n[lightgray]{0} bestwave = [lightgray]最高ウェーブ: {0} launch = < 発射 > @@ -384,11 +424,13 @@ launch.confirm = すべての資源をコアに搬入し、発射します。\n launch.skip.confirm = スキップすると、次の発射可能なウェーブまで発射できません。 uncover = 開放 configure = 積み荷の設定 +bannedblocks = Banned Blocks +addall = Add All configure.locked = [lightgray]ウェーブ {0} を達成すると積み荷を設定できるようになります。 configure.invalid = 値は 0 から {0} の間でなければなりません。 zone.unlocked = [lightgray]{0} がアンロックされました. zone.requirement.complete = ウェーブ {0} を達成:\n{1} の開放条件を達成しました。 -zone.config.complete = ウェーブ {0} を達成:\n積み荷の設定が解除されました。 +zone.config.unlocked = Loadout unlocked:[lightgray]\n{0} zone.resources = 発見した資源: zone.objective = [lightgray]目標: [accent]{0} zone.objective.survival = 敵からコアを守り切る @@ -444,15 +486,14 @@ settings.graphics = グラフィック settings.cleardata = データを削除... settings.clear.confirm = データを削除してもよろしいですか?\nこれを元に戻すことはできません! settings.clearall.confirm = [scarlet]警告![]\nこれはすべてのデータが削除されます。これにはセーブデータ、マップ、アンロック、キーバインドが含まれます。\n「ok」 を押すと、すべてのデータが削除され、自動的に終了します。 -settings.clearunlocks = アンロックを削除 -settings.clearall = すべてを削除 paused = [accent]< ポーズ > +clear = Clear +banned = [scarlet]Banned yes = はい no = いいえ info.title = 情報 error.title = [crimson]エラーが発生しました error.crashtitle = エラーが発生しました -attackpvponly = [scarlet]アタックあるいはPvPモードでのみ有効 blocks.input = 搬入 blocks.output = 搬出 blocks.booster = ブースト @@ -468,6 +509,7 @@ blocks.shootrange = 範囲 blocks.size = 大きさ blocks.liquidcapacity = 液体容量 blocks.powerrange = 電力範囲 +blocks.powerconnections = Max Connections blocks.poweruse = 電力使用量 blocks.powerdamage = 電力/ダメージ blocks.itemcapacity = アイテム容量 @@ -489,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} @@ -533,7 +576,9 @@ 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 = 水のアニメーション setting.animatedshields.name = シールドのアニメーション setting.antialias.name = アンチエイリアス[lightgray] (再起動が必要)[] @@ -554,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} 秒 @@ -563,6 +610,7 @@ setting.fps.name = FPSを表示 setting.vsync.name = VSync setting.pixelate.name = ピクセル化[lightgray] (アニメーションが無効化されます) setting.minimap.name = ミニマップを表示 +setting.position.name = Show Player Position setting.musicvol.name = 音楽 音量 setting.ambientvol.name = 環境音 音量 setting.mutemusic.name = 音楽をミュート @@ -574,6 +622,8 @@ setting.publichost.name = 誰でもゲームに参加できるようにする setting.chatopacity.name = チャットの透明度 setting.lasersopacity.name = Power Laser Opacity setting.playerchat.name = ゲーム内にチャットを表示 +public.confirm = Do you want to make your game public?\n[accent]Anyone will be able to join your games.\n[lightgray]This can be changed later in Settings->Game->Public Game Visibility. +public.beta = Note that beta versions of the game cannot make public lobbies. uiscale.reset = UIサイズが変更されました。\nこのままでよければ「OK」を押してください。\n[scarlet][accent]{0}[] 秒で元の設定に戻ります... uiscale.cancel = キャンセル & 終了 setting.bloom.name = Bloom @@ -585,13 +635,16 @@ category.multiplayer.name = マルチプレイ command.attack = 攻撃 command.rally = Rally command.retreat = 後退 -keybind.gridMode.name = ブロック選択 -keybind.gridModeShift.name = カテゴリー選択 +keybind.clear_building.name = Clear Building keybind.press = キーを押してください... keybind.press.axis = 軸またはキーを押してください... keybind.screenshot.name = スクリーンショット keybind.move_x.name = 左右移動 keybind.move_y.name = 上下移動 +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.select.name = 選択/ショット keybind.diagonal_placement.name = 斜め設置 @@ -603,12 +656,14 @@ keybind.zoom_hold.name = 長押しズーム keybind.zoom.name = ズーム keybind.menu.name = メニュー keybind.pause.name = ポーズ +keybind.pause_building.name = Pause/Resume Building keybind.minimap.name = ミニマップ keybind.dash.name = ダッシュ keybind.chat.name = チャット keybind.player_list.name = プレイヤーリスト keybind.console.name = コンソール keybind.rotate.name = 回転 +keybind.rotateplaced.name = Rotate Existing (Hold) keybind.toggle_menus.name = メニュー切り替え keybind.chat_history_prev.name = 前のチャット履歴 keybind.chat_history_next.name = 次のチャット履歴 @@ -620,6 +675,7 @@ mode.survival.name = サバイバル mode.survival.description = 通常のモードです。 資源も限られる中、自動的にウェーブが進行していきます。\n[gray]プレイするには、マップに敵が出現する必要があります。 mode.sandbox.name = サンドボックス mode.sandbox.description = 無限の資源があり、ウェーブを自由に進行できます。 +mode.editor.name = Editor mode.pvp.name = PvP mode.pvp.description = エリア内で他のプレイヤーと戦います。\n[gray]プレイするには、マップに少なくとも二つの異なる色のコアが必要です。 mode.attack.name = アタック @@ -787,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 = トリウムの壁 @@ -806,6 +864,7 @@ block.junction.name = ジャンクション block.router.name = ルーター block.distributor.name = ディストリビューター block.sorter.name = ソーター +block.inverted-sorter.name = Inverted Sorter block.message.name = Message block.overflow-gate.name = オーバーフローゲート block.silicon-smelter.name = シリコン溶鉱炉 @@ -924,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]機械ドリルの性質を見てみましょう。[] @@ -1007,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 = トリウムの壁ほど強固ではないが、強力な弾でなければ弾き返すことができます。 @@ -1026,6 +1088,7 @@ block.junction.description = 十字に交差したコンベアーをそれぞれ block.bridge-conveyor.description = 高度な輸送ブロックです。地形や建物を超えて、3ブロック離れた場所にアイテムを輸送することができます。 block.phase-conveyor.description = 改良されたアイテム転送ブロックです。電力を使用して、離れた場所にあるフェーズコンベアーにアイテムを転送することができます。 block.sorter.description = アイテムを分別して搬出します。設定したアイテムは通過させます。他のアイテムが搬入されると側面にアイテムを搬出します。 +block.inverted-sorter.description = Processes items like a standard sorter, but outputs selected items to the sides instead. block.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 2a9b87e76b..51ef110c8f 100644 --- a/core/assets/bundles/bundle_ko.properties +++ b/core/assets/bundles/bundle_ko.properties @@ -1,8 +1,9 @@ credits.text = 제작자 [ROYAL]Anuken[] - [SKY]anukendev@gmail.com[] / [scarlet]한국어 번역자[] - [royal]Potion[] credits = 제작자 -contributors = 번역 및 기여자들 -discord = Mindustry Discord 에 참여 해 보세요! -link.discord.description = 공식 Mindustry Discord 채팅방 +contributors = 번역 및 개발 기여자들 +discord = Mindustry Discord 에 참여해보세요! +link.discord.description = 공식 Mindustry Discord 서버 +link.reddit.description = Mindustry 레딧 link.github.description = 게임 소스코드 link.changelog.description = 새로 추가된 것들 link.dev-builds.description = 불안정한 개발 빌드들 @@ -10,28 +11,42 @@ link.trello.description = 다음 출시될 기능들을 게시한 공식 Trello link.itch.io.description = PC 버전 다운로드와 HTML5 버전이 있는 itch.io 사이트 link.google-play.description = Google Play 스토어 정보 link.wiki.description = 공식 Mindustry 위키 -linkfail = 링크를 여는데 실패했습니다!\nURL이 기기의 클립보드에 복사되었습니다. -screenshot = 화면 캡쳐가 {0} 경로에 저장되었습니다. +linkfail = 링크를 여는 데 실패했습니다!\nURL이 기기의 클립보드에 복사되었습니다. +screenshot = 스크린샷이 {0} 경로에 저장되었습니다. screenshot.invalid = 맵이 너무 커서 스크린샷을 찍을 메모리가 충분하지 않습니다. gameover = 게임 오버 gameover.pvp = [accent]{0}[] 팀이 승리했습니다! highscore = [accent]최고점수 달성! - +copied = 복사됨. load.sound = 소리 load.map = 맵 load.image = 사진 load.content = 컨텐츠 load.system = 시스템 load.mod = 모드 - +schematic = 설계도 +schematic.add = 설계도 저장하기 +schematics = 설계도 모음 +schematic.replace = 이 설계도와 같은 이름의 설계도가 이미 존재합니다. 정말로 바꾸시겠습니까? +schematic.import = 설계도 불러오기 +schematic.exportfile = 파일 내보내기 +schematic.importfile = 파일 불러오기 +schematic.browseworkshop = 워크샵 탐색 +schematic.copy = 클립보드에 복사하기 +schematic.copy.import = 클립보드에서 붙여넣기 +schematic.shareworkshop = 워크샵에 공유 +schematic.flip = 좌우 뒤집기 :[accent][[{0}][] / 상하 뒤집기 : [accent][[{1}][] +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} - +stat.rank = 최종 점수 : [accent]{0} launcheditems = [accent]창고 launchinfo = [출격되지 않음][[출격]파랑색으로 표시된 자원들을 획득합니다. map.delete = 정말로 "[accent]{0}[]" 맵을 삭제하시겠습니까? @@ -40,7 +55,7 @@ level.select = 맵 선택 level.mode = 게임 모드 : showagain = 다음 세션에서 이 메세지를 표시하지 않습니다 coreattack = < 코어가 공격받고 있습니다! > -nearpoint = [[ [scarlet]적 생성 구역에서 나가세요[] ]\n적 생성시 구역 내 건물 및 유닛 파괴 +nearpoint = [[ [scarlet]적 생성 구역에서 나가세요[] ]\n적 생성 시 구역 내 건물 및 유닛 파괴 database = 코어 기록보관소 savegame = 게임 저장 loadgame = 게임 불러오기 @@ -49,10 +64,11 @@ customgame = 사용자 정의 게임 newgame = 새 게임 none = <없음> minimap = 미니맵 +position = 플레이어 좌표 close = 닫기 website = 웹사이트 quit = 나가기 -save.quit = 저장 나가기 +save.quit = 저장 후 나가기 maps = 맵 maps.browse = 맵 검색 continue = 계속하기 @@ -64,28 +80,33 @@ uploadingcontent = 컨텐츠 업로드 uploadingpreviewfile = 미리보기 파일 업로드 committingchanges = 바뀐 점 적용 done = 완료 - -mods.alphainfo = 현재의 모드는 첫 번째 버전이며, 그리고[scarlet] 버그가 매우 많음을 명심하십시오[].\n만약 버그를 발견할경우 Mindustry 깃허브 또는 디스코드로 제보해주세요. +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.author = [LIGHT_GRAY]제작자:[] {0} -mod.missing = 이 세이브파일에는 설치하지 않은 모드 혹은 이 버전에 속해있지 않은 데이터가 포함되어 있습니다. 이 것을 불러올 경우 세이브파일의 데이터가 손상될 수 있습니다. 정말로 이 파일을 불러오시겠습니까?\n[lightgray]모드 :\n{0} - +mod.remove.confirm = 이 모드를 삭제하시겠습니까? +mod.author = [LIGHT_GRAY]제작자 : [] {0} +mod.missing = 이 세이브파일에는 설치하지 않은 모드 혹은 이 버전에 속해있지 않은 데이터가 포함되어 있습니다. 이 파일을 불러올 경우 세이브파일의 데이터가 손상될 수 있습니다. 정말로 이 파일을 불러오시겠습니까?\n[lightgray]모드 :\n{0} +mod.preview.missing = 워크샵에 당신의 모드를 업로드하기 전에 미리보기 이미지를 먼저 추가해야합니다.\n[accent] preview.png[]라는 이름으로 미리보기 이미지를 당신의 모드 폴더안에 준비한 후 다시 시도해주세요. +mod.folder.missing = 워크샵에는 폴더 형태의 모드만 게시할 수 있습니다.\n모드를 폴더 형태로 바꾸려면 파일을 폴더에 압축 해제하고 이전 압축파일을 제거한 후, 게임을 재시작하거나 모드를 다시 로드하십시오. about.button = 정보 name = 이름 : -noname = 먼저 [accent] 유저 이름[] 을 설정하세요. +noname = 먼저 [accent] [] 을 설정하세요. filename = 파일 이름 : unlocked = 대상 정보 기록됨 completed = [accent]연구됨 @@ -93,27 +114,27 @@ techtree = 연구 기록 research.list = [LIGHT_GRAY]연구 : research = 연구 researched = [LIGHT_GRAY]{0}연구 완료. -players = 현재 {0}명 접속중 +players = 현재 {0}명 접속 중 players.single = 현재 {0}명만 있음. -server.closing = [accent]서버 닫는중... +server.closing = [accent]서버 닫는 중... server.kicked.kick = 서버에서 추방되었습니다! -server.kicked.whitelist = 당신은 이 서버의 화이트리스트가 아닙니다. +server.kicked.whitelist = 당신은 이 서버의 화이트리스트에 등록되어있지 않습니다. server.kicked.serverClose = 서버 종료됨. server.kicked.vote = 당신은 투표로 추방되었습니다. 그러니 좀 적당히 하지 그랬어요? -server.kicked.clientOutdated = 오래된 버전의 게임입니다! 게임을 업데이트 하세요! +server.kicked.clientOutdated = 오래된 버전의 게임입니다! 게임을 업데이트하세요! server.kicked.serverOutdated = 오래된 버전의 서버입니다! 서버 호스트 관리자에게 문의하세요! server.kicked.banned = 서버 규칙 위반으로 인해, 이제 당신은 영원히 이 서버를 플레이 하실 수 없습니다. server.kicked.typeMismatch = 클라이언트와 호환되지 않는 서버입니다. 디스코드에서 #mods에 들러보는 건 어떨까요? server.kicked.playerLimit = 서버가 꽉 찼습니다. 빈 공간이 생길 때까지 기다려주세요. -server.kicked.recentKick = 방금 추방처리 되었습니다.\n잠시 기다린 후에 접속 해 주세요. -server.kicked.nameInUse = 이 닉네임이 이미 서버에서 사용중입니다. +server.kicked.recentKick = 방금 추방되었습니다.\n잠시 기다린 후에 접속해주세요. +server.kicked.nameInUse = 이 닉네임은 이미 이 서버에서 사용중입니다. server.kicked.nameEmpty = 당신의 닉네임이 비어있습니다. 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]포트 포워딩[]을 하시거나 Vpn을 사용하셔야 합니다.\n\n[LIGHT_GRAY]참고: LAN 게임 연결에 문제가 있는 사람이 있다면, 방화벽 설정에서 Mindustry 가 로컬 네트워크에 액세스하도록 허용했는지 확인 해 주세요. -join.info = 여기서 [accent]서버 IP[]를 입력하여 다른 서버에 접속할 수 있습니다.\n또는 [accent]로컬 네트워크(LAN)[] 서버를 검색하여 접속할 수 있습니다.\nLAN 및 WAN 멀티 플레이어 모두 지원됩니다.\n\n[LIGHT_GRAY]참고:여기에서는 자동으로 글로벌 서버를 추가하지 않습니다. IP로 다른 사람의 서버에 접속할려면 직접 서버 주소를 찾아서 적으셔야합니다.[]\n\n[ROYAL]한국의 서버로는 mindustry.kr[accent](포트없음)[],6568과 server1.mindustry.r-e.kr의 8000,8001,8002,8004포트가 있습니다.\n서버 주소 입력방법은 < 주소:포트 >의 형식입니다. +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[]의 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열기 @@ -126,22 +147,22 @@ server.refreshing = 서버 목록 새로고치는중... hosts.none = [lightgray]LAN 게임을 찾을 수 없습니다! host.invalid = [scarlet]서버에 연결할 수 없습니다! trace = 플레이어 정보 보기 -trace.playername = 이름: [accent]{0} -trace.ip = IP: [accent]{0}{0} -trace.id = 고유 ID: [accent]{0} -trace.mobile = 모바일 접속 유무: [accent]{0} -trace.modclient = 수정된 클라이언트: [accent]{0} +trace.playername = 닉네임 : [accent]{0} +trace.ip = IP : [accent]{0}{0} +trace.id = UUID : [accent]{0} +trace.mobile = 모바일 접속 유무 : [accent]{0} +trace.modclient = 수정된 클라이언트 : [accent]{0} invalidid = 잘못된 클라이언트 ID 입니다! 버그 보고서를 제출 해 주세요. server.bans = 차단된 유저 server.bans.none = 차단된 플레이어가 없습니다. server.admins = 관리자 server.admins.none = 관리자가 없습니다! -server.add = 서버 추가 -server.delete = 이 서버를 삭제 하시겠습니까? +server.add = 서버 추가\n 이 곳을 눌러 서버ip를 등록하고 접속할 서버를 추가하세요. +server.delete = 이 서버를 삭제하시겠습니까? server.edit = 서버 수정 server.outdated = [crimson]서버 버전이 낮습니다![] server.outdated.client = [crimson]클라이언트 버전이 낮습니다![] -server.version = [lightgray]서버 버전: {0} {1} +server.version = [lightgray]서버 버전 : {0} {1} server.custombuild = [yellow]사용자 정의 서버 confirmban = 이 플레이어를 차단하시겠습니까? confirmkick = 정말로 이 플레이어를 추방시키겠습니까? @@ -150,7 +171,7 @@ confirmunban = 이 플레이어를 차단해제 하시겠습니까? confirmadmin = 이 플레이어를 관리자로 만들겠습니까? confirmunadmin = 이 플레이어를 일반 유저로 만들겠습니까? joingame.title = 게임 참가 -joingame.ip = 주소: +joingame.ip = 주소 : disconnect = 서버와 연결이 해제되었습니다. disconnect.error = 연결 . disconnect.closed = 연결이 끊어졌습니다.. @@ -159,26 +180,26 @@ disconnect.data = 월드 데이터 로딩 실패.. cantconnect = 게임 [accent]{0}[]에 접속하지 못했습니다. connecting = [accent]연결중... connecting.data = [accent]월드 데이터 로딩중... -server.port = 포트: +server.port = 포트 : server.addressinuse = 주소가 이미 사용중입니다! server.invalidport = 포트가 올바르지 않습니다! -server.error = [accent]{0}[crimson]서버를 여는데 오류가 발생했습니다. +server.error = [accent]{0}[crimson]서버를 여는 데 오류가 발생했습니다. save.new = 새로 저장 save.overwrite = 이 저장 슬롯을 덮어씌우겠습니까? overwrite = 덮어쓰기 save.none = 저장 파일을 찾지 못했습니다! saveload = [accent]저장중... savefail = 게임을 저장하지 못했습니다! -save.delete.confirm = 이 저장파일을 삭제 하시겠습니까? +save.delete.confirm = 이 저장파일을 삭제하시겠습니까? save.delete = 삭제 save.export = 저장파일 내보내기 save.import.invalid = [accent]파일이 잘못되었습니다! -save.import.fail = [crimson]저장파일을 불러오지 못함: [accent]{0} -save.export.fail = [crimson]저장파일을 내보내지 못함: [accent]{0} +save.import.fail = [crimson]저장파일을 불러오지 못함\n 오류 코드 : [accent]{0} +save.export.fail = [crimson]저장파일을 내보내지 못함\n 오류 코드 : [accent]{0} save.import = 저장파일 불러오기 -save.newslot = 저장 파일이름: +save.newslot = 저장 파일이름 : save.rename = 이름 변경 -save.rename.text = 새 이름: +save.rename.text = 새 이름 : selectslot = 저장슬롯을 선택하십시오. slot = [accent]{0}번째 슬롯 editmessage = 글 수정하기 @@ -208,24 +229,25 @@ data.export = 데이터 내보내기 data.import = 데이터 불러오기 data.exported = 데이터를 내보냈습니다. data.invalid = 유효한 게임 데이터가 아닙니다. -data.import.confirm = 외부 게임 데이터를 불러옵니다...\n[accent]이 작업시 현재 게임 데이터는 삭제되고, 외부의 게임 데이터를 불러오니 주의하세요. 실행 취소가 불가능하며, 작업 후 게임이 바로 꺼집니다. +data.import.confirm = 외부 게임 데이터를 불러옵니다...\n[accent]작업이 완료되면 현재 게임 데이터는 삭제되고, 외부의 게임 데이터를 불러오니 주의하세요. 실행 취소가 불가능하며, 작업 후 게임이 바로 꺼집니다. classic.export = 클래식 데이터 추출 -classic.export.text = Mindustry 클래식 (v3.5 build 40)의 세이브파일 또는 맵 데이터가 발견되었습니다. 이 것들을 Mindustry 클래식 앱에서 사용하기 위해 홈 폴더로 추출할까요? +classic.export.text = Mindustry 클래식 (v3.5 build 40)의 세이브파일 또는 맵 데이터가 발견되었습니다. 이 데이터를 Mindustry 클래식 앱에서 사용하기 위해 홈 폴더로 추출할까요? quit.confirm = 정말로 종료하시겠습니까? 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 = [green]{0}초[]후 웨이브 시작 -wave.waveInProgress = [LIGHT_GRAY]웨이브 진행중 +wave = [accent] {0} 단계 +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 = 알 수 없음 @@ -237,27 +259,29 @@ map.nospawn = 이 맵에 플레이어가 생성될 코어가 없습니다! 맵 map.nospawn.pvp = 이 맵에는 적팀 코어가 없습니다! 에디터에서 [ROYAL]노랑색 팀이 아닌[] 코어를 추가하세요. map.nospawn.attack = 이 맵에는 플레이어가 공격할 수 있는 적의 코어가 없습니다! 에디터에서 [ROYAL] 빨강색 팀[] 코어를 맵에 추가하세요. map.invalid = 파일이 잘못되었거나 손상되어 맵을 열 수 없습니다. -map.publish.error = 맵 업로드 오류 : {0} -map.update = 맵 업데이트 -map.load.error = 워크샵 작업 오류 : {0} -map.missing = 해당 맵은 삭제되거나 옮겨졌습니다.\n[lightgray]워크샵 목록은 자동으로 동기화되지 않습니다. +workshop.update = 워크샵 맵 업데이트 +workshop.error = 워크샵 세부사항을 가져오는 중 에러가 발생했습니다 : {0} map.publish.confirm = 맵을 업로드 하시겠습니까?\n\n[lightgray]먼저 워크샵 EULA에 동의하시지 않으면 맵이 표시되지 않습니다! -map.menu = 원하는 맵을 선택하세요. -map.changelog = 바뀐 점 (선택성): +workshop.menu = 해당 맵으로 수행할 작업을 선택하십시오. +workshop.info = 맵 정보 +changelog = 변경점 (선택 사항) : eula = 스팀 EULA -map.publish = 맵 업로드 완료! -map.publishing = [accent]맵 업로드 중... +missing = 이 항목은 삭제되거나 이동되었습니다.\n[lightgray]워크샵 목록이 자동으로 연결 해제되었습니다. +publishing = [accent]업로드 중... +publish.confirm = 맵을 업로드 하시겠습니까?\n\n[lightgray]먼저 워크샵 EULA에 동의하시지 않으면 맵이 표시되지 않습니다! +publish.error = 맵 업로드 오류 : {0} +steam.error = 스팀 서비스를 초기화하는데 실패했습니다.\n에러 코드 : {0} editor.brush = 브러쉬 editor.openin = 편집기 열기 editor.oregen = 광물 무작위 생성 -editor.oregen.info = 광물 무작위 생성: +editor.oregen.info = 광물 무작위 생성 : editor.mapinfo = 맵 정보 -editor.author = 만든이: -editor.description = 설명: +editor.author = 제작자 : +editor.description = 설명 : editor.nodescription = 맵을 업로드하려면 최소 4자 이상의 설명이 있어야합니다. editor.waves = 단계 : -editor.rules = 규칙: -editor.generation = 맵 생성 설정: +editor.rules = 규칙 : +editor.generation = 맵 생성 설정 : editor.ingame = 인게임 편집 editor.publish.workshop = 워크샵 업로드 editor.newmap = 신규 맵 @@ -280,14 +304,14 @@ waves.none = 적 단계가 설정되지 않았습니다.\n비어있을 시 자 editor.default = [LIGHT_GRAY]<기본값> details = 설명 edit = 편집 -editor.name = 이름: +editor.name = 이름 : editor.spawn = 유닛 생성 editor.removeunit = 유닛 삭제 editor.teams = 팀 -editor.errorload = [accent]{0} 파일을 불러오는데 실패했습니다. -editor.errorsave = [accent]{0} 파일을 저장하는데 실패했습니다. -editor.errorimage = 이것은 맵이 아니라 사진입니다.\n\n예전 맵을 가져올려면 편집기의 '예전 맵 가져오기' 버튼을 사용하세요. -editor.errorlegacy = 이 맵은 너무 오래되어, 더이상 지원하지 않는 맵 형식을 사용합니다. +editor.errorload = [accent]{0} 파일을 불러오는 데 실패했습니다. +editor.errorsave = [accent]{0} 파일을 저장하는 데 실패했습니다. +editor.errorimage = 이것은 맵이 아니라 사진입니다.\n\n예전 맵을 가져오려면 편집기의 '예전 맵 가져오기' 버튼을 사용하세요. +editor.errorlegacy = 이 맵은 너무 오래되어, 더는 지원하지 않는 맵 형식을 사용합니다. editor.errornot = 선택한 대상이 맵 파일이 아닙니다. editor.errorheader = 이 맵 파일은 유효하지 않거나 손상되었습니다. editor.errorname = 맵에 이름이 지정되어 있지 않습니다. @@ -300,7 +324,7 @@ editor.loadmap = 맵 불러오기 editor.savemap = 맵 저장 editor.saved = 저장됨! editor.save.noname = 맵에 이름이 없습니다! 메뉴 -> '맵 정보' 에서 설정하세요. -editor.save.overwrite = 이 맵의 이름은 기존에 있던 맵을 덮어씁니다! '맵 정보' 메뉴에서 다른 이름을 선택하세요. +editor.save.overwrite = 이 맵의 이름은 이미 존재합니다! '맵 정보' 메뉴에서 다른 이름을 선택하세요. editor.import.exists = [scarlet]맵을 불러올 수 없음: [] 기존에 있던 '{0}' 맵이 이미 존재합니다! editor.import = 가져오기 editor.importmap = 맵 가져오기 @@ -318,12 +342,11 @@ editor.loadimage = 지형 가져오기 editor.saveimage = 지형 내보내기 editor.unsaved = [scarlet]변경사항을 저장하지 않았습니다![]\n정말로 나가시겠습니까? editor.resizemap = 맵 크기 조정 -editor.mapname = 맵 이름: +editor.mapname = 맵 이름 : editor.overwrite = [accept]경고!이 명령은 기존 맵을 덮어씌우게 됩니다. editor.overwrite.confirm = [scarlet]경고![] 이 이름을 가진 맵이 이미 있습니다. 덮어 쓰시겠습니까? editor.exists = 같은 이름의 맵이 이미 존재합니다. -editor.selectmap = 불러올 맵 선택: - +editor.selectmap = 불러올 맵 선택 : toolmode.replace = 재배치 toolmode.replace.description = 블록을 배치합니다. toolmode.replaceall = 모두 재배치 @@ -338,7 +361,6 @@ toolmode.fillteams = 팀 채우기 toolmode.fillteams.description = 블록 대신 팀 건물로 채웁니다. toolmode.drawteams = 팀 그리기 toolmode.drawteams.description = 블록 대신 팀 건물을 배치합니다. - filters.empty = [LIGHT_GRAY]필터가 없습니다!! 아래 버튼을 눌러 추가하세요. filter.distort = 왜곡 filter.noise = 맵 전체에 타일 혹은 블럭 뿌리기 @@ -370,7 +392,6 @@ filter.option.floor2 = 2번째 바닥 filter.option.threshold2 = 2번째 한계점 filter.option.radius = 반경 filter.option.percentile = 백분위수 - width = 넓이 : height = 높이 : menu = 메뉴 @@ -379,57 +400,53 @@ campaign = 캠페인 load = 불러오기 save = 저장 fps = FPS : {0} -ping = Ping : 초당 {0} -language.restart = 언어를 변경하려면 게임을 다시시작 해 주세요. +ping = Ping : {0}ms +language.restart = 언어를 변경하려면 게임을 다시 시작해 주세요. settings = 설정 -tutorial = 게임 방법 +tutorial = 튜토리얼 tutorial.retake = 튜토리얼 editor = 편집기 mapeditor = 맵 편집기 -donate = 기부 - -abandon = 포기 +abandon = 지역 포기 abandon.text = 이 구역의 모든 자원이 적에게 빼앗길 것입니다. locked = 잠김 -complete = [LIGHT_GRAY]완료 : -zone.requirement = 지역 {1} 에서 단계 {0} 달성 -requirement.core = Destroy Enemy Core in {0} -requirement.unlock = Unlock {0} -resume = 현재 진행 중인 지역 :\n[LIGHT_GRAY]{0} -bestwave = [LIGHT_GRAY]최고 점수 : {0} +complete = [LIGHT_GRAY]지역 해금 조건 : +requirement.wave = {1}지역에서 {0}단계 달성 +requirement.core = {0}지역에서 적 코어를 파괴 +requirement.unlock = {0}지역 해금 +resume = 현재 진행 중인 지역\n[LIGHT_GRAY]{0} +bestwave = [LIGHT_GRAY]달성한 최고 단계 : {0} launch = < 출격 > launch.title = 출격 성공 -launch.next = [LIGHT_GRAY]다음 출격기회는 {0} 단계에서 나타납니다. +launch.next = [LIGHT_GRAY]다음 출격 기회는 {0} 단계에서 나타납니다. launch.unable2 = [scarlet]출격할 수 없습니다.[] launch.confirm = 출격하게 되면 코어에 저장된 모든 자원이 창고로 들어갑니다.\n또한 출격한 지역에는 아무것도 남지 않습니다. -launch.skip.confirm = 만약 지금 출격하시지 않고 스킵하신다면, 다음 출격 단계까지 기다려야 합니다. +launch.skip.confirm = 만약 지금 출격하지 않고 스킵하신다면, 다음 출격 단계까지 기다려야 합니다. uncover = 지역 개방 configure = 코어 시작자원 설정 bannedblocks = 금지된 블럭들 addall = 모두 추가 -configure.locked = 단계를 지역 {0}에서 달성할 시 시작자원 설정이 해금됩니다. -configure.invalid = 해당 0 과 {0} 사이여야 합니다. +configure.locked = [lightgray]{0}시 시작자원 설정이 해금됩니다. +configure.invalid = 해당 값은 0 과 {0} 사이여야 합니다. zone.unlocked = [LIGHT_GRAY] 잠금 해제되었습니다! -zone.requirement.complete = 단계 {0} 달성:\n{1} 지역 요구사항이 충족되었습니다! -zone.config.complete = 단계 {0} 달성:\n시작자원 설정 기능이 해금되었습니다! +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 = 적 코어 파괴 add = 추가... boss.health = 보스 체력 - connectfail = [crimson]{0}[accent] 서버에 연결하지 못했습니다.[] error.unreachable = 서버에 연결하지 못했습니다.\n서버 주소가 정확히 입력되었나요? error.invalidaddress = 잘못된 주소입니다. error.timedout = 시간 초과!\n서버에 포트 포워딩이 설정되어 있고 주소가 올바른지 확인하십시오. -error.mismatch = 패킷 오류:\n클라이언트/서버 버전이 일치하지 않습니다.\n접속할려는 서버가 최신 버전의 Mindustry 인지 확인하세요! +error.mismatch = 패킷 오류\n클라이언트/서버 버전이 일치하지 않습니다.\n접속하려는 서버가 최신 버전인지 확인하세요! error.alreadyconnected = 이미 접속중입니다. error.mapnotfound = 맵 파일을 찾을 수 없습니다! error.io = 네트워크 I/O 오류. error.any = 알 수 없는 네트워크 오류. error.bloom = 블룸 그래픽 효과를 적용하지 못했습니다.\n당신의 기기가 이 기능을 지원하지 않는 것일 수도 있습니다. - zone.groundZero.name = 전초기지 zone.desertWastes.name = 쓰레기 사막 zone.craters.name = 크레이터 @@ -444,22 +461,20 @@ 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]이 지역에서의 착륙장소는 확실하지 않습니다. -zone.saltFlats.description = 이 소금 사막은 매우 척박하여 자원이 거의 없습니다.\n하지만 자원이 희소한 이곳에서도 적들의 요새가 발견되었습니다.그들을 사막의 모래로 만들어버리십시오. +zone.frozenForest.description = 이 지역도 산과 가까운 지역입니다 포자들이 흩뿌려져 있으며 극한의 추위도 포자를 막을 수 있을 것 같지 않습니다.\n화력 발전소를 짓고 전력을 확보하여 채광 드론을 사용하는 법을 배우십시오. +zone.desertWastes.description = 이 황무지는 끝을 알 수 없을 정도로 광활하고 십자가 형태의 버려진 구조물이 존재합니다.\n석탄이 존재하며 이를 화력발전에 쓰거나 흑연 정제에 쓰십시오.\n\n[lightgray]이 지역에서의 착륙장소는 확실하지 않습니다. +zone.saltFlats.description = 이 소금 사막은 매우 척박하여 자원이 거의 없습니다.\n하지만 자원이 희소한 이곳에서도 적들의 요새가 발견되었습니다. 그들을 사막의 모래로 만들어버리십시오. zone.craters.description = 물이 가득한 이 크레이터에는 옛 전쟁의 유물들이 쌓여있습니다.\n이곳을 다시 점령해 강화유리를 제작하고 물을 끌어올려 포탑과 드릴에 공급하여 더 좋은 효율로 방어선을 강화하십시오. -zone.ruinousShores.description = 이 지역은 과거 해안방어기지로 사용되었습니다.\n그러나 지금은 기본구조물만 남아있으니 이 지역을 어서 신속히 수리하여 외부로 세력을 확장한뒤 잃어버린 기술을 다시 회수하십시오. -zone.stainedMountains.description = 더 안쪽에는 포자에 오염된 산맥이 있지만, 이 곳은 포자에 오염되지 않았습니다.\n이 지역에서 티타늄을 채굴하고 이 것을 어떻게 사용하는지 배우십시오.\n\n적들은 이 곳에서 더 강력합니다. 더 강한 유닛들이 나올 때까지 시간을 낭비하지 마십시오. -zone.overgrowth.description = 이 곳은 포자들의 근원과 가까이에 있는 과성장 지대입니다. 적이 이 곳에 전초기지를 설립했습니다. 디거를 생산해 적의 코어를 박살내 우리가 잃어버린 것들을 되돌려받으십시오! -zone.tarFields.description = 산지와 사막 사이에 위치한 석유 생산지의 외곽 지역이며, 사용 가능한 타르가 매장되어 있는 희귀한 지역 중 하나입니다. 버려진 지역이기는 하나 이곳에는 위험한 적군들이 있습니다. 그들을 과소평가하지 마십시오.\n\n[lightgray]석유 생산기술을 익히는 것이 도움이 될 것입니다. +zone.ruinousShores.description = 이 지역은 과거 해안방어기지로 사용되었습니다.\n그러나 지금은 기본구조물만 남아있으니 이 지역을 어서 신속히 수리하여 외부로 세력을 확장한 뒤, 잃어버린 기술을 다시 회수하십시오. +zone.stainedMountains.description = 더 안쪽에는 포자에 오염된 산맥이 있지만, 이 곳은 포자에 오염되지 않았습니다.\n이 지역에서 티타늄을 채굴하고 이것을 어떻게 사용하는지 배우십시오.\n\n적들은 이곳에서 더 강력합니다. 더 강한 유닛들이 나올 때까지 시간을 낭비하지 마십시오. +zone.overgrowth.description = 이 곳은 포자들의 근원과 가까이에 있는 과성장 지대입니다. 적이 이 곳에 전초기지를 설립했습니다. 디거를 생산해 적의 코어를 박살 내고 우리가 잃어버린 것들을 되돌려받으십시오! +zone.tarFields.description = 산지와 사막 사이에 위치한 석유 생산지의 외곽 지역이며, 사용 가능한 타르가 매장되어 있는 희귀한 지역 중 하나입니다. 버려진 지역이지만 이곳에는 위험한 적군들이 있습니다. 그들을 과소평가하지 마십시오.\n\n[lightgray]석유 생산기술을 익히는 것이 도움이 될 것입니다. zone.desolateRift.description = 극도로 위험한 지역입니다. 자원은 풍부하지만 사용 가능한 공간은 거의 없습니다. 코어 파괴의 위험성이 높으니 가능한 빨리 떠나십시오. 또한 적의 공격 딜레이가 길다고 안심하지 마십시오. -zone.nuclearComplex.description = 과거 토륨의 생산, 연구와 처리를 위해 운영되었던 시설입니다. 금은 축소되어 폐허로 전락했으며, 다수의 적이 배치되어 있는 지역입니다. 그들은 끊임없이 당신을 공격할 것입니다.\n\n[lightgray]토륨의 다양한 사용법을 연구하고 익히십시오. +zone.nuclearComplex.description = 과거 토륨의 생산, 연구와 처리를 위해 운영되었던 시설입니다. 지금은 그저 폐허로 전락했으며, 다수의 적이 배치되어 있는 지역입니다. 그들은 끊임없이 당신을 공격할 것입니다.\n\n[lightgray]토륨의 다양한 사용법을 연구하고 익히십시오. zone.fungalPass.description = 고산지대과 포자지대 사이의 지역입니다. 소규모의 적 정찰기지가 있으니 디거와 크롤러를 이용해 적의 코어를 파괴하십시오. zone.impact0078.description = [ROYAL]죄송합니다. 아직 설명이 준비되지 않았습니다. zone.crags.description = [ROYAL]죄송합니다. 아직 설명이 준비되지 않았습니다. - settings.language = 언어 settings.data = 게임 데이터 settings.reset = 설정 초기화 @@ -471,15 +486,14 @@ settings.graphics = 그래픽 settings.cleardata = 게임 데이터 초기화... settings.clear.confirm = 정말로 초기화 하겠습니까?\n이 작업을 되돌릴 수 없습니다! settings.clearall.confirm = [scarlet]경고![]\n이 작업은 저장된 맵, 맵파일, 잠금 해제된 목록과 키 매핑, 그리고 모든 데이터를 삭제합니다.\n확인 버튼을 다시 눌러 모든 데이터를 삭제하고 게임에서 나갑니다. -settings.clearunlocks = 잠금 해제 초기화 -settings.clearall = 모두 초기화 paused = 일시 정지 +clear = 초기화 +banned = [scarlet]밴 yes = 예 no = 아니오 info.title = [accent]정보 error.title = [crimson]오류가 발생했습니다. error.crashtitle = 오류가 발생했습니다. -attackpvponly = [scarlet]오직 Pvp/공격 모드에서만 사용가능합니다. blocks.input = 소모 자원 blocks.output = 출력 자원 blocks.booster = 가속 @@ -495,6 +509,7 @@ blocks.shootrange = 사거리 blocks.size = 크기 blocks.liquidcapacity = 액체 용량 blocks.powerrange = 전력 범위 +blocks.powerconnections = Max Connections blocks.poweruse = 전력 사용 blocks.powerdamage = 전력/데미지 blocks.itemcapacity = 저장 용량 @@ -506,22 +521,22 @@ blocks.range = 사거리 blocks.drilltier = 드릴 blocks.drillspeed = 기본 드릴 속도 blocks.boosteffect = 가속 효과 -blocks.maxunits = 최대 활성유닛 +blocks.maxunits = 유지할 수 있는 유닛 최대 개체 수 blocks.health = 체력 blocks.buildtime = 건설 시간 blocks.buildcost = 건설 재료 blocks.inaccuracy = 오차각 -blocks.shots = 발포 횟수 +blocks.shots = 공격 속도 blocks.reload = 재장전 blocks.ammo = 탄약 - bar.drilltierreq = 더 좋은 드릴이 요구됨 -bar.drillspeed = 채광 속도 : {0}/s -bar.efficiency = 효율성 : {0}% -bar.powerbalance = 전력 : {0}/s +bar.drillspeed = 초당 {0}개 채굴중 +bar.pumpspeed = Pump Speed: {0}/s +bar.efficiency = 활성화율 : {0}% +bar.powerbalance = 초당 {0} 발전중 bar.powerstored = 총 전력 저장량 : {0}/{1} bar.poweramount = 전력 저장량 : {0} -bar.poweroutput = 전력 생산량 : {0}/s +bar.poweroutput = 초당 {0} 발전중 bar.items = 자원량 : {0} bar.capacity = 저장공간 : {0} bar.liquid = 액체 @@ -529,19 +544,17 @@ bar.heat = 발열 bar.power = 전력 bar.progress = 생산 진행도 bar.spawned = 최대 {1}기 중 {0}기 생산됨 - -bullet.damage = [stat]{0}[lightgray] 데미지 -bullet.splashdamage = [stat]{0}[lightgray] 범위 데미지 ~[stat] {1}[lightgray] 타일 +bullet.damage = [lightgray]피해량 : [stat]{0}[] +bullet.splashdamage = [lightgray]범위 피해량 : [stat]{0}[] / [lightgray]피해 범위 : [stat]{1}[lightgray] 타일 bullet.incendiary = [stat]방화 -bullet.homing = [stat]유도탄 -bullet.shock = [stat] +bullet.homing = [stat]유도 +bullet.shock = [stat]전격 bullet.frag = [stat]파편 -bullet.knockback = [stat]{0}[lightgray] 넉백 -bullet.freezing = [stat]동결 +bullet.knockback = 넉백 : [stat]{0}[lightgray] +bullet.freezing = [stat]빙결 bullet.tarred = [stat]타르 -bullet.multiplier = [stat]{0}[lightgray]x 탄약 소모율 -bullet.reload = [stat]{0}[lightgray]x 사격 속도 - +bullet.multiplier = 추가 타격 횟수 : [stat]{0}[lightgray] +bullet.reload = 공격 속도 : [stat]{0}[lightgray] unit.blocks = 블록 unit.powersecond = 전력/초 unit.liquidsecond = 액체/초 @@ -553,7 +566,7 @@ unit.seconds = 초 unit.persecond = /초 unit.timesspeed = x 배 unit.percent = % -unit.items = 아이템 +unit.items = 자원 category.general = 일반 category.power = 전력 category.liquids = 액체 @@ -563,7 +576,9 @@ category.shooting = 사격 category.optional = 보조 아이템 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] (재시작 필요)[] @@ -581,9 +596,11 @@ setting.difficulty.easy = 쉬움 setting.difficulty.normal = 보통 setting.difficulty.hard = 어려움 setting.difficulty.insane = 미침 -setting.difficulty.name = 난이도: +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 = 초 @@ -591,40 +608,45 @@ setting.fullscreen.name = 전체 화면 setting.borderlesswindow.name = 테두리 없는 창모드[LIGHT_GRAY] (재시작이 필요할 수 있습니다) setting.fps.name = FPS 표시 setting.vsync.name = VSync 활성화 -setting.lasers.name = 전력 노드 레이저 표시 -setting.pixelate.name = 픽셀화[LIGHT_GRAY] (애니메이션 효과가 꺼집니다) +setting.pixelate.name = 픽셀화[LIGHT_GRAY] (게임에 렉이 심할 경우 이 옵션을 켜주세요.) setting.minimap.name = 미니맵 보기 +setting.position.name = 플레이어 위치 표시 setting.musicvol.name = 음악 크기 setting.ambientvol.name = 배경음 크기 setting.mutemusic.name = 음소거 setting.sfxvol.name = 효과음 크기 setting.mutesound.name = 소리 끄기 -setting.crashreport.name = 오류 보고서 보내기 +setting.crashreport.name = 익명으로 오류 보고서 자동 전송 setting.savecreate.name = 자동 저장 활성화 -setting.publichost.name = 공용 서버 보이기 +setting.publichost.name = 공개 서버 보이기 setting.chatopacity.name = 채팅 투명도 +setting.lasersopacity.name = 전력 레이저 밝기 setting.playerchat.name = 채팅 말풍선 표시 public.confirm = 게임을 공개하시겠습니까?\n[lightgray]설정 - 게임 - 게임 서버 공개에서 다시 설정하실 수 있습니다. +public.beta = [accent]!정보![] 베타 버전은 공개 게임 서버를 열지 못합니다. uiscale.reset = UI 스케일이 변경되었습니다.\n"확인"버튼을 눌러 스케일을 확인하세요.\n[scarlet][accent] {0}[]초 후에 예전 설정으로 되돌리고 게임을 종료합니다... uiscale.cancel = 취소 & 나가기 -setting.bloom.name = 발광 효과 +setting.bloom.name = 화려한 이펙트 keybind.title = 조작키 설정 -keybinds.mobile = [scarlet]여기 대부분의 키들은 모바일에서 작동하지 않습니다. 기본적인 것들만 지원됩니다. +keybinds.mobile = [scarlet]대부분의 키들은 모바일에서 작동하지 않습니다. 기본적인 것들만 지원됩니다. category.general.name = 일반 category.view.name = 보기 category.multiplayer.name = 멀티플레이 command.attack = 공격 -command.rally = Rally +command.rally = 순찰 command.retreat = 후퇴 -keybind.gridMode.name = 블록 선택 -keybind.gridModeShift.name = 카테고리 선택 -keybind.press = 키를 누르세요. -keybind.press.axis = 축 또는 키를 누르세요. +keybind.clear_building.name = 설계도 초기화 +keybind.press = 키를 누르세요... +keybind.press.axis = 마우스 휠 또는 키를 누르세요... keybind.screenshot.name = 맵 스크린샷 keybind.move_x.name = 오른쪽/왼쪽 이동 keybind.move_y.name = 위 / 아래 중간 +keybind.schematic_select.name = 영역 설정 +keybind.schematic_menu.name = 설계도 메뉴 +keybind.schematic_flip_x.name = 설계도 X축 뒤집기 +keybind.schematic_flip_y.name = 설계도 Y축 뒤집기 keybind.fullscreen.name = 전체 화면 -keybind.select.name = 선택 +keybind.select.name = 선택/공격 keybind.diagonal_placement.name = 대각선 설치 keybind.pick.name = 블록 선택 keybind.break_block.name = 블록 파괴 @@ -634,6 +656,7 @@ keybind.zoom_hold.name = 길게 확대 keybind.zoom.name = 확대 keybind.menu.name = 메뉴 keybind.pause.name = 일시중지 +keybind.pause_building.name = 건설 일시정지/계속하기 keybind.minimap.name = 미니맵 keybind.dash.name = 달리기 keybind.chat.name = 채팅 @@ -645,7 +668,7 @@ 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 = 생존 @@ -658,10 +681,9 @@ mode.pvp.description = 실제 플레이어와 PvP를 합니다. 맵에 적어도 mode.attack.name = 공격 mode.attack.description = 적 기지를 파괴하세요. 맵에 빨간팀 코어가 있어야 플레이 가능합니다. mode.custom = 사용자 정의 규칙 - rules.infiniteresources = 무한 자원 -rules.wavetimer = 웨이브 타이머 -rules.waves = 웨이브 +rules.wavetimer = 단계 +rules.waves = 단계 rules.attack = 공격 모드 rules.enemyCheat = 무한한 적 자원 rules.unitdrops = 유닛 처치시 자원 약탈 @@ -671,21 +693,20 @@ rules.playerhealthmultiplier = 플레이어 체력 배수 rules.playerdamagemultiplier = 플레이어 공격력 배수 rules.unitdamagemultiplier = 유닛 공격력 배수 rules.enemycorebuildradius = 적 코어 건설 금지구역:[LIGHT_GRAY] (타일) -rules.respawntime = 리스폰 시간:[LIGHT_GRAY] (초) -rules.wavespacing = 웨이브 간격:[LIGHT_GRAY] (초) +rules.respawntime = 플레이어 부활 대기 시간:[LIGHT_GRAY] (초) +rules.wavespacing = 단계 간격 : [LIGHT_GRAY] (초) rules.buildcostmultiplier = 건설 소모 배수 rules.buildspeedmultiplier = 건설 속도 배수 -rules.waitForWaveToEnd = 웨이브가 끝날때까지 기다리는중 -rules.dropzoneradius = 드롭 구역 반경:[LIGHT_GRAY] (타일) -rules.respawns = 웨이브당 최대 리스폰 횟수 -rules.limitedRespawns = 리스폰 제한 -rules.title.waves = 웨이브 -rules.title.respawns = 리스폰 +rules.waitForWaveToEnd = 단계가 끝날때까지 기다리는중 +rules.dropzoneradius = 적 소환 구역 반경 : [LIGHT_GRAY] (타일) +rules.respawns = 단계당 최대 플레이어 부활 횟수 +rules.limitedRespawns = 플레이어 부활 제한 +rules.title.waves = 단계 +rules.title.respawns = 플레이어 부활 rules.title.resourcesbuilding = 자원 & 건축 rules.title.player = 플레이어들 rules.title.enemy = 적 rules.title.unit = 유닛 - content.item.name = 아이템 content.liquid.name = 액체 content.unit.name = 유닛 @@ -709,7 +730,7 @@ item.metaglass.name = 강화유리 item.scrap.name = 고철 liquid.water.name = 물 liquid.slag.name = 광재 -liquid.oil.name = 타르 +liquid.oil.name = 석유 liquid.cryofluid.name = 냉각수 mech.alpha-mech.name = 알파 mech.alpha-mech.weapon = 중무장 소총 @@ -728,26 +749,25 @@ 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 = 방화총 -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} - +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} block.sand-boulder.name = 사암 block.grass.name = 잔디 block.salt.name = 소금 @@ -775,11 +795,11 @@ block.kiln.name = 가마 block.graphite-press.name = 흑연 압축기 block.multi-press.name = 다중 압축기 block.constructing = {0} [LIGHT_GRAY](만드는중) -block.spawn.name = 적 스폰지점 -block.core-shard.name = 코어-조각 -block.core-foundation.name = 코어-기초 -block.core-nucleus.name = 코어-핵 -block.deepwater.name = 깊은물 +block.spawn.name = 적 소환지점 +block.core-shard.name = 코어:조각 +block.core-foundation.name = 코어:기초 +block.core-nucleus.name = 코어:핵 +block.deepwater.name = 깊은 물 block.water.name = 물 block.tainted-water.name = 오염된 물 block.darksand-tainted-water.name = 오염된 젖은 검은 모래 @@ -823,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 = 토륨 벽 @@ -837,13 +859,14 @@ block.lancer.name = 랜서 block.conveyor.name = 컨베이어 block.titanium-conveyor.name = 티타늄 컨베이어 block.armored-conveyor.name = 장갑 컨베이어 -block.armored-conveyor.description = 운송 속도는 티타늄 컨베이어와 비슷하나, 훨씬 단단합니다. 그러나 컨베이어외에는 자원을 받지 못합니다. \n\n[royal]체력이 늘어났지만, 벽만큼 단단하지는 않습니다. 단단하다고 해서 안심하지 마세요. +block.armored-conveyor.description = 운송 속도는 티타늄 컨베이어와 비슷하나, 훨씬 단단합니다. 그러나 컨베이어 외에는 자원을 받지 못합니다. \n\n[royal]설명은 이렇지만, 장갑 컨베이어와 자원을 내보내는 대상이 일직선상에 있을 시에는 자원을 받을 수 있습니다. block.junction.name = 교차기 block.router.name = 분배기 block.distributor.name = 대형 분배기 block.sorter.name = 필터 +block.inverted-sorter.name = 반전 필터 block.message.name = 메모 블럭 -block.overflow-gate.name = 오버플로 게이트 +block.overflow-gate.name = 포화 필터 block.silicon-smelter.name = 실리콘 제련소 block.phase-weaver.name = 메타 합성기 block.pulverizer.name = 분쇄기 @@ -855,7 +878,7 @@ block.separator.name = 원심 분리기 block.coal-centrifuge.name = 석탄 원심분리기 block.power-node.name = 전력 노드 block.power-node-large.name = 대형 전력 노드 -block.surge-tower.name = 서지 합금 타워 +block.surge-tower.name = 설금 타워 block.battery.name = 배터리 block.battery-large.name = 대형 배터리 block.combustion-generator.name = 화력 발전기 @@ -901,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 = 퓨즈 파이프 @@ -919,15 +942,15 @@ block.mass-driver.name = 매스 드라이버 block.blast-drill.name = 압축 공기분사 드릴 block.thermal-pump.name = 화력 펌프 block.thermal-generator.name = 열발전기 -block.alloy-smelter.name = 서지 합금 제련소 -block.mender.name = 멘더 +block.alloy-smelter.name = 설금 제련소 +block.mender.name = 소형 수리 프로젝터 block.mend-projector.name = 수리 프로젝터 -block.surge-wall.name = 서지 합금벽 -block.surge-wall-large.name = 큰 서지 합금벽 +block.surge-wall.name = 설금 벽 +block.surge-wall-large.name = 큰 설금 벽 block.cyclone.name = 사이클론 block.fuse.name = 퓨즈 block.shock-mine.name = 전격 지뢰 -block.overdrive-projector.name = 오버드라이브 프로젝터 +block.overdrive-projector.name = 과부하 프로젝터 block.force-projector.name = 보호막 프로젝터 block.arc.name = 아크 block.rtg-generator.name = RTG 발전기 @@ -953,18 +976,19 @@ 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.drill = 수동으로 채광하는 것은 효율이 낮습니다.\n[accent]드릴[]은 자동으로 드릴 바로아래에 있는 광물들을 채광합니다.\n드릴 카테고리의 기계식 드릴을 선택하여 구리 광맥위에 설치하세요.\n마우스 오른쪽 버튼으로 취소가 가능합니다. +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]궁금한 블럭의 정보를 아무거나 한 번 확인해보세요. -tutorial.conveyor = [accent]컨베이어[]는 붙어 있는 곳에서 받는 아이템을 코어로 운반합니다.\n드릴에서 코어까지 컨베이어 라인을 만드세요.\n[accent]컨베이어를 클릭 후 건설을 시작하려는 지점을 마우스 왼쪽 버튼으로 꾸욱 누른 뒤[] 드래그하여 설계하세요.\n\n[accent]컨베이어를 2개 이상 건설 후 광물을 코어로 운반하세요. -tutorial.conveyor.mobile = [accent]컨베이어[]는 붙어 있는 곳에서 받는 아이템을 코어로 운반합니다.\n드릴에서 코어까지 컨베이어 라인을 만드세요.\n[accent]컨베이어를 화면에 1초정도 클릭하여 작은 노란색 원이 잠깐 나타났다 사라질 때까지 기다리신 후[] 드래그하여 설계하세요.\n\n[accent]컨베이어를 2개 이상 건설 후 광물을 코어로 운반하세요. +tutorial.blockinfo = 블록들은 각각 능력이 다르며, 하위 티어의 드릴은 채광할 수 있는 광물의 종류가 적습니다.\n블럭의 정보를 확인하기 위해서는,[accent] 카테고리의 블럭을 누른 후, "?"버튼을 클릭하여 블럭의 정보를 확인하세요.[]\n[royal]궁금한 블럭의 정보를 아무거나 한번 확인해보세요. +tutorial.conveyor = [accent]컨베이어[]는 붙어있는 곳에서 받는 아이템을 코어로 운반합니다.\n드릴에서 코어까지 컨베이어 라인을 만드세요.\n[accent]컨베이어를 클릭 후, 건설을 시작하려는 지점을 마우스 왼쪽 버튼으로 꾸욱 누른 뒤[] 드래그하여 설계하세요.\n\n[accent]컨베이어를 2개 이상 건설 후 광물을 코어로 운반하세요. +tutorial.conveyor.mobile = [accent]컨베이어[]는 붙어있는 곳에서 받는 아이템을 코어로 운반합니다.\n드릴에서 코어까지 컨베이어 라인을 만드세요.\n[accent]컨베이어를 화면에 1초 정도 클릭하여 작은 노란색 원이 잠깐 나타났다 사라질 때까지 기다리신 후[] 드래그하여 설계하세요.\n\n[accent]컨베이어를 2개 이상 건설 후 광물을 코어로 운반하세요. tutorial.turret = 방어 구조물은 [LIGHT_GRAY]적[]을 물리치기 위해 반드시 필요합니다.\n포탑 카테고리의 듀오 포탑을 선택하신 후, 기지 근처에 듀오 포탑을 설치하세요. tutorial.drillturret = 듀오 포탑이 공격하기 위해서는[accent] 구리 탄약[]을 필요로 합니다.\n포탑 근처의 구리 광맥에 드릴을 설치하고 컨베이어로 포탑과 이어서 포탑에 구리를 공급하세요.\n또는 직접 코어에서 광물을 꺼내 포탑에 넣을 수도 있습니다. tutorial.pause = 싱글 플레이에서는 게임을 [accent]일시정지[]할 수 있습니다.\n일시정지하면 교전과 더불어 건설까지 일시정지됩니다.\n\n[accent]스페이스 버튼[]을 눌러 일시정지하세요. @@ -974,11 +998,10 @@ tutorial.unpause.mobile = 게임을 진행하기 위해 같은 위치의 버튼 tutorial.breaking = 설계를 방해하는 블록을 제거하기 위해서 [accent]첫 번째 지점을 마우스 오른쪽 버튼[]으로 누른 뒤 드래그하여 범위를 지정해서 제거하세요.[]\n\n[accent]코어 근처의 조각 블럭 3개[]를 제거하세요. tutorial.breaking.mobile = 설계를 방해하는 블록을 제거하기 위해서 [accent]망치 버튼을 눌러 제거모드[]로 변경하신 후, 첫번째 지점을 누른 후 드래그하여 범위를 지정한뒤 V버튼을 클릭해 블럭을 제거하세요.\n\n[accent]코어 근처의 조각벽 3개[]를 제거하세요. tutorial.withdraw = [accent]코어나 창고, 공장[]같은 자원을 넣을 수 있는 일부 블럭에서는 직접 자원을 빼낼 수도 있습니다.\n[accent]코어를 클릭 후 자원을 눌러서 자원을 빼내세요. -tutorial.deposit = 자원을 다시 블록에 넣을수도 있습니다.\n\n[accent]당신의 기체에서 코어로 드래그[]하여 자원을 되돌려 넣으세요. -tutorial.waves = [LIGHT_GRAY]적[]이 접근합니다.\n당신의 기체는 적을 향해 클릭하여 공격할 수 있습니다. 또한, 구리를 더 캐내고 포탑을 더 지어서 방어를 강화하세요.\n\n[accent]2단계 동안 코어를 보호하세요.[] +tutorial.deposit = 자원을 다시 블록에 넣을 수도 있습니다.\n\n[accent]당신의 기체에서 코어로 드래그[]하여 자원을 되돌려 넣으세요. +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]액체를 활용하기 위한 필수품입니다. @@ -995,16 +1018,16 @@ item.surge-alloy.description = 순간적으로 전압이 증가하는 전기 특 item.spore-pod.description = 석유를 만들거나 탄약과 합성해 연료로 전환하는데 사용됩니다. item.blast-compound.description = 터렛 및 건설의 재료로 사용되는 휘발성 폭발물.\n연료로도 사용할 수 있지만, 별로 추천하지는 않습니다. item.pyratite.description = 인화성을 가진 재료로, 주로 터렛의 탄약으로 사용됩니다. -liquid.water.description = 여러 포탑을 가속하는데에 사용할 수 있고, 파도와 멜트다운의 탄약으로도 사용되며 여러 공장에서도 사용되는 무구한 가능성을 가진 액체입니다. -liquid.slag.description = 다양한 종류의 금속들이 함께 섞여 녹아있습니다. 셉터를 이용해 다른 광물들로 분리하거나 탄약으로 사용해 적 부대를 향해 살포할 수 있습니다. +liquid.water.description = 여러 포탑을 가속하는 데 사용할 수 있고, 파도와 멜트다운의 탄약으로도 사용되며 여러 공장에서도 사용되는 무구한 가능성을 가진 액체입니다. +liquid.slag.description = 다양한 종류의 금속들이 함께 섞여 녹아있습니다. 원심분리기를 이용해 다른 광물들로 분리하거나 탄약으로 사용해 적 부대를 향해 살포할 수 있습니다. liquid.oil.description = 연소, 폭발 또는 냉각제로 사용될 수 있다. -liquid.cryofluid.description = 건물을 냉각시키는데 가장 효과적인 액체. +liquid.cryofluid.description = 건물을 냉각시키는 데 가장 효과적인 액체. mech.alpha-mech.description = 표준 기체.\n적절한 속도와 공격력을 갖추고 있습니다. mech.delta-mech.description = 빠르게 이동하는 적을 처치하기 위한 가벼운 기체.\n구조물에는 거의 피해를 주지 않지만, 전격 무기를 사용하여 많은 적군을 매우 빠르게 죽일 수 있습니다. mech.tau-mech.description = 지원형 기체.\n총을 발사하여 건물을 치료하고 회복 능력 사용으로 화재를 진압하거나, 반경 내 아군을 치유시킵니다. mech.omega-mech.description = 지상 기체 최종판이자 건물 파괴용으로 적합한 부피가 크고 튼튼한 기체.\n방어 모드는 최대 90% 의 피해를 줄일 수 있습니다. mech.dart-ship.description = 표준 비행선.\n빠르고 가볍지만 공격력이 거의 없고 채광 속도가 느립니다. -mech.javelin-ship.description = 치고 빠지는 공격을 위한 비행선.\n처음에는 느리지만, 가속도가 붙어 엄청난 속도로 미사일 피해를 입힐 수 있으며, 전격 능력을 사용할 수 있습니다.\n\n[royal]지나가기만 해도 보호막을 전부 파괴합니다. +mech.javelin-ship.description = 치고 빠지는 공격을 위한 비행선.\n처음에는 느리지만, 가속도가 붙어 엄청난 속도로 비행하여 적 기지를 향해 미사일을 퍼붓습니다. 전격 능력을 사용할 수 있습니다.\n\n[royal]지나가기만 해도 보호막을 전부 파괴합니다. mech.trident-ship.description = 대형 공중 폭격능력과 빠른 건설능력을 가진 폭격기입니다. mech.glaive-ship.description = 크고 잘 무장된 총을 가진 비행선.\n방화용 리피터가 장착되어 있으며, 가속도와 최대속도가 높습니다. unit.draug.description = 가장 기본적인 채굴 드론입니다 저렴하게 생산 가능하며 자동으로 구리와 납을 캐내 가까운 코어에 저장합니다. @@ -1013,37 +1036,39 @@ unit.phantom.description = 첨단 드론 유닛. 플레이어의 건설을 도 unit.dagger.description = 기본 지상 유닛입니다. unit.crawler.description = 지상 유닛. 적이 가까이에 있으면 폭발합니다. unit.titan.description = 고급 지상 유닛입니다.\n원거리 총 대신에 근접 화염 방사기를 가지고 있으며, 지상과 공중 둘다 공격할 수 있습니다. -unit.fortress.description = 중포 지상 유닛.\n높은 공격력을 가진 총과 높은 체력을 가지고 있습니다. +unit.fortress.description = 중무장 포병 지상 유닛.\n높은 공격력을 가진 총과 높은 체력을 가지고 있습니다. unit.eruptor.description = 지상 유닛. 광재를 넣은 파도와 같은 무기를 장착했습니다. unit.wraith.description = 적 핵심 건물 및 유닛을 집중적으로 공격하는 방식을 사용하는 전투기 입니다. unit.ghoul.description = 무겁고 튼튼한 지상 폭격기 입니다.\n주로 적 건물로 이동하여 엄청난 폭격을 가합니다. -unit.revenant.description = 플래이어가 생산가능한 최종 공중 전투기. 폭발물을 쓰는 스웜 포탑과 같은 무기를 사용합니다. -block.message.description = 글을 작성할 수 있습니다. 이 것을 이용하여 같은 팀과 소통을 해보세요. +unit.revenant.description = 플레이어가 생산가능한 최종 공중 전투기. 폭발물을 쓰는 스웜 포탑과 같은 무기를 사용합니다. +block.message.description = 글을 작성할 수 있습니다. 이것을 이용하여 같은 팀과 소통을 해보세요. block.graphite-press.description = 석탄 덩어리를 흑연으로 압축합니다. -block.multi-press.description = 흑연 압축기의 상향 버전입니다. 물과 전력을 이용해 석탄을 빠르고 효율적으로 압축합니다. +block.multi-press.description = 흑연 압축기의 상위 버전입니다. 물과 전력을 이용해 석탄을 빠르고 효율적으로 압축합니다. block.silicon-smelter.description = 석탄과 모래를 사용해 실리콘을 생산합니다. block.kiln.description = 모래와 납을 사용해 강화유리를 만듭니다. 소량의 전력이 필요합니다. block.plastanium-compressor.description = 석유와 티타늄으로 플라스터늄을 생산합니다. -block.phase-weaver.description = 토륨과 많은 량의 모래로 메타를 합성합니다. -block.alloy-smelter.description = 티타늄, 납, 실리콘, 구리로부터 서지 합금을 생산합니다. -block.cryofluidmixer.description = 물과 티타늄을 냉각에 훨씬 더 효과적인 냉동액으로 결합시킵니다. +block.phase-weaver.description = 토륨과 많은 양의 모래로 메타를 합성합니다. +block.alloy-smelter.description = 티타늄, 납, 실리콘, 구리로 서지 합금을 생산합니다. +block.cryofluidmixer.description = 물과 티타늄을 냉각에 훨씬 더 효과적인 냉각수로 결합시킵니다. block.blast-mixer.description = 포자를 사용하여 파이라타이트를 폭발성 화합물로 변환시킵니다. block.pyratite-mixer.description = 석탄, 납, 모래를 가연성이 높은 파이라타이트로 만듭니다. block.melter.description = 고철을 녹여 파도의 탄약 혹은 원심 분리기에 사용할 수 있는 액체인 광재로 만듭니다. block.separator.description = 광재룰 각종 자원으로 재활용 할 수 있게 해 주는 건물입니다. block.spore-press.description = 포자를 압축해 기름을 추출합니다. -block.pulverizer.description = 고철을 갈아 모래로 만듭니다.맵에 모래가 부족할 때 유용합니다. +block.pulverizer.description = 고철을 갈아 모래로 만듭니다. 맵에 모래가 부족할 때 유용합니다. block.coal-centrifuge.description = 석유로 석탄을 만듭니다. block.incinerator.description = 불필요한 자원을 전기를 사용해 소각시킬 수 있는 건물입니다. block.power-void.description = 이어져있는 건물의 전기를 모두 없앱니다.\n샌드박스에서만 건설가능. block.power-source.description = 무한한 전력을 공급해주는 블록입니다.\n샌드박스에서만 건설가능. block.item-source.description = 자원을 선택하면 그 자원이 무한하게 생성되는 블록입니다.\n샌드박스에서만 건설가능. block.item-void.description = 자원을 사라지게 만듭니다.\n샌드박스에서만 건설가능. -block.liquid-source.description = 무한한 액체를 출력해냅니다.\n샌드박스에서만 건설가능. +block.liquid-source.description = 무한한 액체를 출력합니다.\n샌드박스에서만 건설가능. 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 = 토륨 벽만큼 강하지 않지만 벽을 향해 날아오는 총알이 너무 강력하지 않으면 총알을 튕겨냅니다. @@ -1053,7 +1078,7 @@ block.surge-wall-large.description = 설금 벽 4개를 뭉친 블럭입니다. block.door.description = 눌러서 열고 닫을 수 있는 문.\n만약 문이 열리면, 적들은 총을 쏘며 문을 통과할 수 있습니다. block.door-large.description = 문 4개를 뭉친 블럭입니다. block.mender.description = 주변 블록들을 주기적으로 치료합니다. -block.mend-projector.description = 주변 블록들을 수리기보다 더 넓은 범위, 더 많은 회복량, 더 빠른 속도로 수리합니다. +block.mend-projector.description = 주변 블록들을 멘더보다 더 넓은 범위, 더 많은 회복량, 더 빠른 속도로 수리합니다. block.overdrive-projector.description = 드릴과 컨베이어와 같은 인근 건물의 속도를 높여줍니다. block.force-projector.description = 육각형 보호막을 만들고, 내구도가 다 닳기 전까지 보호막 내로 들어오는 모든 공격을 방어합니다. block.shock-mine.description = 지뢰를 밟는 적에게 피해를 줍니다. 적에게는 거의 보이지 않습니다. 일단 설치 완료된 후에는 적 유닛이 공격하지 않습니다. 그러나 지뢰가 있는 곳은 피해가니 주의하세요. @@ -1063,13 +1088,14 @@ block.junction.description = 2개의 컨베이어 벨트를 교차시키는 다 block.bridge-conveyor.description = 자원 수송 블록.\n지형이나 건물을 넘어 최대 3개 타일을 건너뛰고 자원을 운송할 수 있습니다. block.phase-conveyor.description = 고급 자원 수송 블록.\n지형이나 건물을 넘어 최대 11개 타일을 건너뛰고 자원을 운송할 수 있습니다. 전기를 사용하고, 기본 터널 컨베이어보다 빠릅니다. block.sorter.description = 자원을 넣어서 필터에 설정된 자원일 경우 바로 앞으로 통과하며, 그렇지 않을 경우 옆으로 이동시킵니다. -block.router.description = 한 방향에서 자원을 넣을 시 최대 3개의 방향으로 균등하게 내보냅니다. 자원을 한곳에서 여러 방향으로 분배하는 데 유용합니다. +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 = 자원 수송 포탑\n자원을 모아 전기를 사용하여 또 다른 매스 드라이버로 발사합니다.\n[ROYAL]받을 때도 전기를 사용합니다. -block.mechanical-pump.description = 느린 속도로 물을 퍼올리나 전기를 사용하지 않는 펌프입니다. -block.rotary-pump.description = 전기를 사용해 빠른 속도로 물을 끌어올릴 수 있는 펌프입니다.\n\n[ROYAL]타일당 물을 퍼올리는 속도가 가장 빠릅니다. -block.thermal-pump.description = 3x3범위의 액체타일에서 액체를 빠르게 퍼올리나 타일당 퍼올리는 속도는 동력 펌프보다 느립니다. +block.overflow-gate.description = 평소에는 자원의 들어온 방향으로 자원을 통과시키지만, 정면이 자원으로 꽉 차거나 다른 사유로 막힐 시 옆으로 자원을 내보냅니다. +block.mass-driver.description = 자원 수송 포탑\n모인 자원을 전기를 사용하여 또 다른 매스 드라이버로 발사합니다.\n[ROYAL]받을 때도 전기를 사용합니다. +block.mechanical-pump.description = 느린 속도로 액체를 퍼올리나, 전기를 사용하지 않는 펌프입니다. +block.rotary-pump.description = 전기를 사용해 빠른 속도로 액체를 끌어올릴 수 있는 펌프입니다.\n\n[ROYAL]타일당 액체를 퍼올리는 속도가 가장 빠릅니다. +block.thermal-pump.description = 가장 강력한 펌프. block.conduit.description = 기본 파이프\n액체를 배치된 방향으로 느리게 운송합니다. block.pulse-conduit.description = 고급 파이프\n기본 파이프보다 액체 운송 속도가 빠릅니다. block.liquid-router.description = 액체를 다른 방향으로 분배할 수 있게 하는 블럭입니다. @@ -1083,40 +1109,40 @@ block.surge-tower.description = 전기를 연결된 대상과 연동시킵니다 block.battery.description = 전력 생산량에 여유가 있을경우, 생산된 잉여 전력을 여기에 저장합니다.\n\n[ROYAL]이것을 이용해 한순간에 많은 전력을 사용하는 포탑들을 보조가능합니다. block.battery-large.description = 일반 배터리보다 훨씬 많은 량의 전력을 저장합니다.\n\n[ROYAL]배터리 9개를 설치하는 것보다 효율이 좋습니다. block.combustion-generator.description = 인화성 물질을 태워 소량의 전력을 생산합니다. -block.thermal-generator.description = 건설가능한 열이 있는 타일 위에 건설하면 전력을 생산합니다.\n\n[ROYAL]용암 웅덩이 혹은 열기지대에서 무한정 열을 발산합니다. +block.thermal-generator.description = 열이 있는 타일 위에 건설하면 전력을 생산합니다.\n\n[ROYAL]용암 웅덩이 혹은 열기지대에서 무한정 열을 발산합니다. block.turbine-generator.description = 화력 발전기보다 효율적이지만, 액체가 추가적으로 필요합니다.\n\n[ROYAL]일반 타일에서 물추출기 1개로 2개가 가동가능합니다. block.differential-generator.description = 냉각수와 파이라타이트의 온도 차를 이용해 안정적으로 원자로에 버금가는 양의 전기를 생산합니다. -block.rtg-generator.description = 방사성동위원소 열전기 발전기\n토륨또는 메타를 사용하며, 냉각이 필요없는 발전을 하지만 토륨 원자로에 비해 발전량이 매우 적습니다. +block.rtg-generator.description = 방사성동위원소 열전기 발전기\n토륨 또는 메타를 사용하며, 냉각이 필요 없는 발전을 하지만 토륨 원자로에 비해 발전량이 매우 적습니다. block.solar-panel.description = 태양광으로 극소량의 전기을 생산합니다. block.solar-panel-large.description = 일반 태양 전지판보다 훨씬 발전량이 많지만, 건축비도 훨씬 비쌉니다. block.thorium-reactor.description = 토륨을 이용해 막대한 양의 전기를 생산합니다. 지속적인 냉각이 필요하며 냉각제의 양이 부족하면 크게 폭발합니다.\n\n[royal]폭발로 인한 피해를 버틸 수 있는 건물은 없습니다. -block.impact-reactor.description = 최첨단 발전기\n폭발물과 냉각수를 이용해 최고의 효율로 매우 많은 양의 전기를 생산할 수 있습니다. 발전을 시작하는데 전기가 필요하며 발전기를 가동하는데 시간이 많이 걸립니다.\n[royal]오버드라이브 프로젝터로 10000이상의 전기를 생산할 수 있으며, 가동중에 전기가 끊기면 가동을 다시 해야되기 때문에 창고,물탱크,배터리 등을 주위에 설치하고 나서 가동하는 것을 추천드립니다. -block.mechanical-drill.description = 싸구려 드릴. 적절한 타일 위에 놓였을때 매우 느린 속도로 채광합니다.\n\n[ROYAL]구리와 납은 채광 드론으로 대체가 가능합니다. +block.impact-reactor.description = 최첨단 발전기\n폭발물과 냉각수를 이용해 최고의 효율로 매우 많은 양의 전기를 생산할 수 있습니다. 발전을 시작하는 데 전기가 필요하며 발전기를 가동하는 데 시간이 많이 걸립니다.\n[royal]오버드라이브 프로젝터로 10000이상의 전기를 생산할 수 있으며, 가동중에 전기가 끊기면 가동을 다시 해야되기 때문에 창고, 물탱크, 배터리 등을 주위에 설치하고 나서 가동하는 것을 추천드립니다. +block.mechanical-drill.description = 싸구려 드릴. 적절한 타일 위에 설치되었을 때 매우 느린 속도로 채광합니다.\n\n[ROYAL]구리와 납은 채광 드론으로 대체가 가능합니다. block.pneumatic-drill.description = 기압을 이용하여 보다 빠르게 단단한 물질을 채광할 수 있는 향상된 드릴.\n\n[ROYAL]전기를 사용하지 않는 드릴이라도 물과 오버드라이브를 이용하여 가속할 수 있습니다. -block.laser-drill.description = 토륨을 채광할 수 있는 고급 드릴입니다. 전력과 물을 공급하여 빠른 속도로 채광할 수 있습니다.\n\n[ROYAL]드릴아래에 배치된 광물타일의 비율에 따라 채광량이 달라집니다. -block.blast-drill.description = 최상위 드릴입니다. 많은량의 전력이 필요합니다.\n\n[ROYAL]물추출기 하나면 충분합니다. +block.laser-drill.description = 토륨을 채광할 수 있는 고급 드릴입니다. 전력과 물을 공급하여 빠른 속도로 채광할 수 있습니다.\n\n[ROYAL]드릴 아래에 배치된 광물타일의 비율에 따라 채광량이 달라집니다. +block.blast-drill.description = 최상위 드릴입니다. 많은 양의 전력이 필요합니다.\n\n[ROYAL]물추출기 하나면 충분합니다. block.water-extractor.description = 땅에서 물을 추출합니다. 근처에 호수가 없을 때 사용하세요.\n\n[ROYAL]물추출기의 효율이 달라지는 타일이 있습니다. block.cultivator.description = 소량의 포자를 산업용으로 사용가능한 포자로 배양하는 건물입니다. -block.oil-extractor.description = 대량의 전력과 물을 사용하여 모래에서 기름을 추출합니다. 근처에 직접적인 석유 공급원이 없을때 사용하세요.\n\n[royal]모래 또는 고철을 이용하여 창조경제가 가능합니다. +block.oil-extractor.description = 대량의 전력과 물을 사용하여 모래에서 석유를 추출합니다. 근처에 직접적인 석유 공급원이 없을 때 사용하세요.\n\n[royal]모래 또는 고철을 이용하여 창조경제가 가능합니다. block.core-shard.description = 코어의 1단계 형태입니다.\n이것이 파괴되면 플레이하고 있는 지역과의 연결이 끊어지니 적의 공격에 파괴되지 않도록 주의하세요.\n[ROYAL]연결이 끊긴다는 말은 게임오버와 일맥상통합니다. block.core-foundation.description = 코어의 2단계 형태입니다.\n첫 번째 코어보다 더 튼튼하고 더 많은 자원을 저장할 수 있습니다.\n\n[ROYAL]크기도 좀 더 큽니다. block.core-nucleus.description = 코어의 3단계이자 마지막 형태입니다.\n최고로 튼튼하며 막대한 양의 자원들을 저장할 수 있습니다. -block.vault.description = 각종 대량의 자원을 저장할 수 있습니다.[LIGHT_GRAY]언로더[]를 사용하여 창고에서 물건을 회수할 수 있습니다.\n\n[royal]포탑의 탄약, 핵융합로의 폭발물, 원자로 냉각수의 티타늄등 여러 자원들의 여분을 미리 저장하여 혹시모를 사태를 예방하세요. -block.container.description = 각종 소량의 자원을 저장할 수 있습니다.[LIGHT_GRAY]언로더[]를 사용하여 컨테이너에서 자원을 회수할 수 있습니다.\n\n[royal]또는 컨테이너를 클릭하고 자원을 눌러 자원을 강탈해갈수도 있습니다. -block.unloader.description = 컨테이너, 창고 또는 코어에서 인접한 블록으로 자원을 출하합니다. 출하시킬 자원의 종류는 언로더를 눌러 지정할 수 있습니다. -block.launch-pad.description = 출격할 필요 없이 자원을 수송시킵시다.\n\n[royal]캠페인에서 이 것을 이용해 게임 중에 테크 트리를 올릴 수 있습니다. +block.vault.description = 각종 자원을 대량으로 저장할 수 있습니다.[LIGHT_GRAY]언로더[]를 사용하여 창고에서 물건을 회수할 수 있습니다.\n\n[royal]포탑의 탄약, 핵융합로의 폭발물, 원자로 냉각수의 티타늄등 여러 자원들의 여분을 미리 저장하여 혹시 모를 사태를 예방하세요. +block.container.description = 각종 자원을 저장할 수 있습니다.[LIGHT_GRAY]언로더[]를 사용하여 컨테이너에서 자원을 회수할 수 있습니다.\n\n[royal]또는 컨테이너를 클릭하고 자원을 눌러 자원을 빼낼 수도 있습니다. +block.unloader.description = 컨테이너, 창고 또는 코어에서 인접한 블록으로 자원을 내보냅니다. 내보낼 자원의 종류는 언로더를 눌러 지정할 수 있습니다. +block.launch-pad.description = 출격할 필요 없이 자원을 수송시킵시다.\n\n[royal]캠페인에서 이것을 이용해 게임 중에 연구가 가능합니다. block.launch-pad-large.description = 출격 패드의 강화버전\n더 많은 자원을 더 자주 출격시킵니다.\n\n[ROYAL]크기도 더 큽니다. block.duo.description = 소형 포탑입니다.\n가장 기본적인 포탑으로 약한 탄환을 발사합니다. block.scatter.description = 중형 대공 포탑입니다.\n납이나 고철 덩어리를 적에게 쏩니다. block.scorch.description = 소형 포탑입니다.\n지상의 적을 매우 강력한 화염으로 지져버립니다. 근거리에서 효과적입니다.\n\n[royal]유닛 상대로 무지막지한 공격력을 보여줍니다. -block.hail.description = 소형 포탑입니다.\n장거리로 포탄을 발사합니다. +block.hail.description = 소형 포탑입니다.\n장거리 포탄을 발사합니다. block.wave.description = 중형 포탑입니다. 대상에게 포탑에 공급된 액체를 발사합니다. 물또는 냉각수가 공급되면 자동으로 불을 끕니다. block.lancer.description = 중형 포탑입니다.\n적을 레이저로 관통합니다. block.arc.description = 소형 포탑입니다.\n적을 전기로 지집니다. block.swarmer.description = 중형 포탑입니다.\n지상과 공중 적 모두를 공격하는 유도 미사일 포탑입니다. block.salvo.description = 중형 포탑입니다.\n3연발 탄환을 발사합니다. block.fuse.description = 대형 포탑입니다.\n강력한 단거리 빔을 쏩니다. -block.ripple.description = 대형 포탑입니다.\n여러 발의 사격을 동시에 합니다. +block.ripple.description = 대형 포탑입니다.\n여러 발의 탄환을 동시에 사격합니다. block.cyclone.description = 대형 포탑입니다.\n초고속으로 사격합니다. block.spectre.description = 초대형 포탑입니다.\n한 번에 두 발의 강력한 총알을 쏩니다. block.meltdown.description = 초대형 포탑.\n장거리의 강력한 열광선을 발사합니다. diff --git a/core/assets/bundles/bundle_nl.properties b/core/assets/bundles/bundle_nl.properties index d133d0bddb..0633347d3d 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 @@ -16,11 +17,29 @@ screenshot.invalid = Map is te groot, Mogelijk niet genoeg ruimte op apparaat. gameover = Spel afgelopen gameover.pvp = het[accent] {0}[] team heeft gewonnen! highscore = [accent]Nieuw topscore! +copied = Copied. load.sound = Geluid load.map = Mappen load.image = Afbeeldingen load.content = inhoud load.system = Systeem +load.mod = Mods +schematic = Schematic +schematic.add = Save Schematic... +schematics = Schematics +schematic.replace = A schematic by that name already exists. Replace it? +schematic.import = Import Schematic... +schematic.exportfile = Export File +schematic.importfile = Import File +schematic.browseworkshop = Browse Workshop +schematic.copy = Copy to Clipboard +schematic.copy.import = Import from Clipboard +schematic.shareworkshop = Share on Workshop +schematic.flip = [accent][[{0}][]/[accent][[{1}][]: Flip Schematic +schematic.saved = Schematic saved. +schematic.delete.confirm = This schematic will be utterly eradicated. +schematic.rename = Rename Schematic +schematic.info = {0}x{1}, {2} blocks stat.wave = Waves Verslagen:[accent] {0} stat.enemiesDestroyed = Vijanden Vernietigd:[accent] {0} stat.built = Gebouwen Gebouwd:[accent] {0} @@ -29,6 +48,7 @@ stat.deconstructed = Gebouwen Gesloopt:[accent] {0} stat.delivered = Middelen Gelanceerd: stat.rank = Eindrang: [accent]{0} launcheditems = [accent]Gelanceerde items +launchinfo = [unlaunched][[LAUNCH] your core to obtain the items indicated in blue. map.delete = Weet je zeker dat je de map wilt verwijderen? "[accent]{0}[]"? level.highscore = Topscore: [accent]{0} level.select = Selecteer Level @@ -40,17 +60,50 @@ database = Core Database savegame = Opslaan loadgame = Laden joingame = Treed toe -addplayers = Add/Remove Players customgame = Aangepast spel newgame = Nieuw spel none = minimap = Minimap +position = Position close = Aflsuiten website = Website quit = Stoppen +save.quit = Save & Quit maps = Mappen +maps.browse = Browse Maps continue = Ga door maps.none = [LIGHT_GRAY]Geen map gevonden! +invalid = Invalid +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.alpha = [accent](Alpha) +mods = Mods +mods.none = [LIGHT_GRAY]No mods found! +mods.guide = Modding Guide +mods.report = Report Bug +mods.openfolder = Open Mod Folder +mod.enabled = [lightgray]Enabled +mod.disabled = [scarlet]Disabled +mod.disable = Disable +mod.delete.error = Unable to delete mod. File may be in use. +mod.missingdependencies = [scarlet]Missing dependencies: {0} +mod.nowdisabled = [scarlet]Mod '{0}' is missing dependencies:[accent] {1}\n[lightgray]These mods need to be downloaded first.\nThis mod will be automatically disabled. +mod.enable = Enable +mod.requiresrestart = The game will now close to apply the mod changes. +mod.reloadrequired = [scarlet]Reload Required +mod.import = Import Mod +mod.import.github = Import Github Mod +mod.remove.confirm = This mod will be deleted. +mod.author = [LIGHT_GRAY]Author:[] {0} +mod.missing = This save contains mods that you have recently updated or no longer have installed. Save corruption may occur. Are you sure you want to load it?\n[lightgray]Mods:\n{0} +mod.preview.missing = Before publishing this mod in the workshop, you must add an image preview.\nPlace an image named[accent] preview.png[] into the mod's folder and try again. +mod.folder.missing = Only mods in folder form can be published on the workshop.\nTo convert any mod into a folder, simply unzip its file into a folder and delete the old zip, then restart your game or reload your mods. about.button = Over name = Naam: noname = Maak eerst een[accent] Speler naam[]. @@ -65,12 +118,14 @@ players = {0} Spelers online players.single = {0} Speler online server.closing = [accent]Server aan het sluiten... server.kicked.kick = Je bent verwijderd van deze sessie. +server.kicked.whitelist = You are not whitelisted here. server.kicked.serverClose = Server afgesloten... server.kicked.vote = Je bent ge vote-kicked. Tot ziens. server.kicked.clientOutdated = Verouderde versie! Update jouw spel! server.kicked.serverOutdated = Verouderde server! Vraag de host om te upgraden! server.kicked.banned = Je bent verbannen van deze server. server.kicked.typeMismatch = Deze server is niet compitabel met jouw bouwtype. +server.kicked.playerLimit = This server is full. Wait for an empty slot. server.kicked.recentKick = Je bent reeds verwijderd.\nWacht voordat je opnieuw verbindt. server.kicked.nameInUse = Er is al iemand met die naam\nop deze server. server.kicked.nameEmpty = Je gekozen naam is niet geldig. @@ -129,7 +184,6 @@ server.port = Port: server.addressinuse = Address already in use! server.invalidport = Invalid port number! server.error = [crimson]Error hosting server: [accent]{0} -save.old = This save is for an older version of the game, and can no longer be used.\n\n[LIGHT_GRAY]Save backwards compatibility will be implemented in the full 4.0 release. save.new = New Save save.overwrite = Are you sure you want to overwrite\nthis save slot? overwrite = Overwrite @@ -163,6 +217,7 @@ warning = Warning. confirm = Confirm delete = Delete view.workshop = View In Workshop +workshop.listing = Edit Workshop Listing ok = OK open = Open customize = Customize @@ -180,7 +235,12 @@ classic.export.text = [accent]Mindustry[] has just had a major update.\nClassic quit.confirm = Are you sure you want to quit? quit.confirm.tutorial = Are you sure you know what you're doing?\nThe tutorial can be re-taken in[accent] Settings->Game->Re-Take Tutorial.[] loading = [accent]Loading... +reloading = [accent]Reloading Mods... saving = [accent]Saving... +cancelbuilding = [accent][[{0}][] to clear plan +selectschematic = [accent][[{0}][] to select+copy +pausebuilding = [accent][[{0}][] to pause building +resumebuilding = [scarlet][[{0}][] to resume building wave = [accent]Wave {0} wave.waiting = [LIGHT_GRAY]Wave in {0} wave.waveInProgress = [LIGHT_GRAY]Wave in progress @@ -199,11 +259,18 @@ map.nospawn = This map does not have any cores for the player to spawn in! Add a map.nospawn.pvp = This map does not have any enemy cores for player to spawn into! Add[SCARLET] red[] cores to this map in the editor. map.nospawn.attack = This map does not have any enemy cores for player to attack! Add[SCARLET] red[] cores to this map in the editor. map.invalid = Error loading map: corrupted or invalid map file. -map.publish.error = Error publishing map: {0} +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 -map.publish = Map published. -map.publishing = [accent]Publishing map... +missing = This item has been deleted or moved.\n[lightgray]The workshop listing has now been automatically un-linked. +publishing = [accent]Publishing... +publish.confirm = Are you sure you want to publish this?\n\n[lightgray]Make sure you agree to the Workshop EULA first, or your items will not show up! +publish.error = Error publishing item: {0} +steam.error = Failed to initialize Steam services.\nError: {0} editor.brush = Brush editor.openin = Open In Editor editor.oregen = Ore Generation @@ -333,7 +400,6 @@ campaign = Campaign load = Load save = Save fps = FPS: {0} -tps = TPS: {0} ping = Ping: {0}ms language.restart = Please restart your game for the language settings to take effect. settings = Settings @@ -341,12 +407,13 @@ tutorial = Tutorial tutorial.retake = Re-Take Tutorial editor = Editor mapeditor = Map Editor -donate = Donate abandon = Abandon abandon.text = This zone and all its resources will be lost to the enemy. locked = Locked complete = [LIGHT_GRAY]Complete: -zone.requirement = Wave {0} in zone {1} +requirement.wave = Reach Wave {0} in {1} +requirement.core = Destroy Enemy Core in {0} +requirement.unlock = Unlock {0} resume = Resume Zone:\n[LIGHT_GRAY]{0} bestwave = [LIGHT_GRAY]Best Wave: {0} launch = < LAUNCH > @@ -357,11 +424,13 @@ launch.confirm = This will launch all resources in your core.\nYou will not be a launch.skip.confirm = If you skip now, you will not be able to launch until later waves. uncover = Uncover configure = Configure Loadout +bannedblocks = Banned Blocks +addall = Add All configure.locked = [LIGHT_GRAY]Unlock configuring loadout:\nWave {0}. configure.invalid = Amount must be a number between 0 and {0}. zone.unlocked = [LIGHT_GRAY]{0} unlocked. zone.requirement.complete = Wave {0} reached:\n{1} zone requirements met. -zone.config.complete = Wave {0} reached:\nLoadout config unlocked. +zone.config.unlocked = Loadout unlocked:[lightgray]\n{0} zone.resources = Resources Detected: zone.objective = [lightgray]Objective: [accent]{0} zone.objective.survival = Survive @@ -417,15 +486,14 @@ settings.graphics = Graphics settings.cleardata = Clear Game Data... settings.clear.confirm = Are you sure you want to clear this data?\nWhat is done cannot be undone! settings.clearall.confirm = [scarlet]WARNING![]\nThis will clear all data, including saves, maps, unlocks and keybinds.\nOnce you press 'ok' the game will wipe all data and automatically exit. -settings.clearunlocks = Clear Unlocks -settings.clearall = Clear All paused = [accent]< Paused > +clear = Clear +banned = [scarlet]Banned yes = Yes no = No info.title = Info error.title = [crimson]An error has occured error.crashtitle = An error has occured -attackpvponly = [scarlet]Only available in Attack/PvP modes blocks.input = Input blocks.output = Output blocks.booster = Booster @@ -441,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 @@ -462,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} @@ -506,7 +576,9 @@ 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 setting.animatedshields.name = Animated Shields setting.antialias.name = Antialias[LIGHT_GRAY] (requires restart)[] @@ -527,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 @@ -536,6 +610,7 @@ setting.fps.name = Show FPS setting.vsync.name = VSync setting.pixelate.name = Pixelate [LIGHT_GRAY](may decrease performance) setting.minimap.name = Show Minimap +setting.position.name = Show Player Position setting.musicvol.name = Music Volume setting.ambientvol.name = Ambient Volume setting.mutemusic.name = Mute Music @@ -547,6 +622,8 @@ setting.publichost.name = Public Game Visibility setting.chatopacity.name = Chat Opacity setting.lasersopacity.name = Power Laser Opacity setting.playerchat.name = Display In-Game Chat +public.confirm = Do you want to make your game public?\n[accent]Anyone will be able to join your games.\n[lightgray]This can be changed later in Settings->Game->Public Game Visibility. +public.beta = Note that beta versions of the game cannot make public lobbies. uiscale.reset = UI scale has been changed.\nPress "OK" to confirm this scale.\n[scarlet]Reverting and exiting in[accent] {0}[] settings... uiscale.cancel = Cancel & Exit setting.bloom.name = Bloom @@ -558,13 +635,16 @@ category.multiplayer.name = Multiplayer command.attack = Attack command.rally = Rally command.retreat = Retreat -keybind.gridMode.name = Block Select -keybind.gridModeShift.name = Category Select +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.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 = Toggle Fullscreen keybind.select.name = Select/Shoot keybind.diagonal_placement.name = Diagonal Placement @@ -576,12 +656,14 @@ keybind.zoom_hold.name = Zoom Hold keybind.zoom.name = Zoom 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.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 @@ -593,6 +675,7 @@ mode.survival.name = Survival mode.survival.description = The normal mode. Limited resources and automatic incoming waves. mode.sandbox.name = Sandbox mode.sandbox.description = Infinite resources and no timer for waves. +mode.editor.name = Editor mode.pvp.name = PvP mode.pvp.description = Fight against other players locally. mode.attack.name = Attack @@ -760,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 @@ -779,6 +864,7 @@ block.junction.name = Junction block.router.name = Router block.distributor.name = Distributor block.sorter.name = Sorter +block.inverted-sorter.name = Inverted Sorter block.message.name = Message block.overflow-gate.name = Overflow Gate block.silicon-smelter.name = Silicon Smelter @@ -897,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.[] @@ -980,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. @@ -999,6 +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.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 1151996f3c..a26e7d27dc 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,11 +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 load.image = Images load.content = Content load.system = System +load.mod = Mods +schematic = Schematic +schematic.add = Save Schematic... +schematics = Schematics +schematic.replace = A schematic by that name already exists. Replace it? +schematic.import = Import Schematic... +schematic.exportfile = Export File +schematic.importfile = Import File +schematic.browseworkshop = Browse Workshop +schematic.copy = Copy to Clipboard +schematic.copy.import = Import from Clipboard +schematic.shareworkshop = Share on Workshop +schematic.flip = [accent][[{0}][]/[accent][[{1}][]: Flip Schematic +schematic.saved = Schematic saved. +schematic.delete.confirm = This schematic will be utterly eradicated. +schematic.rename = Rename Schematic +schematic.info = {0}x{1}, {2} blocks stat.wave = Je overleefde tot aanvalsgolf: [accent]{0}[]. stat.enemiesDestroyed = Vijanden vernietigd:[accent] {0} stat.built = Gebouwen gebouwd:[accent] {0} @@ -29,6 +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. map.delete = Ben je zeker dat je de kaart "[accent]{0}[]" wilt verwijderen? level.highscore = Beste score: [accent]{0} level.select = Selecteer level @@ -40,11 +60,11 @@ database = Kern Database savegame = opslaan loadgame = openen joingame = Multiplayer -addplayers = Voeg toe/verwijder spelers customgame = Aangepaste versie newgame = Nieuw spel none = minimap = Kaartje +position = Position close = Sluit website = Website quit = Verlaat @@ -60,6 +80,30 @@ 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.alpha = [accent](Alpha) +mods = Mods +mods.none = [LIGHT_GRAY]No mods found! +mods.guide = Modding Guide +mods.report = Report Bug +mods.openfolder = Open Mod Folder +mod.enabled = [lightgray]Enabled +mod.disabled = [scarlet]Disabled +mod.disable = Disable +mod.delete.error = Unable to delete mod. File may be in use. +mod.missingdependencies = [scarlet]Missing dependencies: {0} +mod.nowdisabled = [scarlet]Mod '{0}' is missing dependencies:[accent] {1}\n[lightgray]These mods need to be downloaded first.\nThis mod will be automatically disabled. +mod.enable = Enable +mod.requiresrestart = The game will now close to apply the mod changes. +mod.reloadrequired = [scarlet]Reload Required +mod.import = Import Mod +mod.import.github = Import Github Mod +mod.remove.confirm = This mod will be deleted. +mod.author = [LIGHT_GRAY]Author:[] {0} +mod.missing = This save contains mods that you have recently updated or no longer have installed. Save corruption may occur. Are you sure you want to load it?\n[lightgray]Mods:\n{0} +mod.preview.missing = Before publishing this mod in the workshop, you must add an image preview.\nPlace an image named[accent] preview.png[] into the mod's folder and try again. +mod.folder.missing = Only mods in folder form can be published on the workshop.\nTo convert any mod into a folder, simply unzip its file into a folder and delete the old zip, then restart your game or reload your mods. about.button = Extra info name = Naam: noname = Kies eerst[accent] een naam[]. @@ -140,7 +184,6 @@ server.port = Poort: server.addressinuse = Dit adres wordt al gebruikt! server.invalidport = Ongeldige poort! server.error = [crimson]Error hosting server: [accent]{0} -save.old = Deze save word niet meer ondersteund\n\n[LIGHT_GRAY]Terugwaardse compatibiliteit zal geïmplementeerd worden in de volledige 4.0 versie save.new = Nieuwe save save.overwrite = Ben je zeker dat je deze save\nwil overschrijven? overwrite = Overschrijf @@ -174,6 +217,7 @@ warning = Waarschuwing. confirm = Bevestig delete = Verwijder view.workshop = View In Workshop +workshop.listing = Edit Workshop Listing ok = OK open = Open customize = Pas aan @@ -191,7 +235,12 @@ classic.export.text = [accent]Mindustry[] has just had a major update.\nClassic quit.confirm = Weet je zeker dat je wilt stoppen? quit.confirm.tutorial = Are you sure you know what you're doing?\nThe tutorial can be re-taken in[accent] Settings->Game->Re-Take Tutorial.[] loading = [accent]Aan het laden... +reloading = [accent]Reloading Mods... saving = [accent]Aan het opslaan... +cancelbuilding = [accent][[{0}][] to clear plan +selectschematic = [accent][[{0}][] to select+copy +pausebuilding = [accent][[{0}][] to pause building +resumebuilding = [scarlet][[{0}][] to resume building wave = [accent]Golf {0} wave.waiting = [LIGHT_GRAY]Golf in {0} wave.waveInProgress = [LIGHT_GRAY]Wave in progress @@ -210,11 +259,18 @@ map.nospawn = This map does not have any cores for the player to spawn in! Add a map.nospawn.pvp = This map does not have any enemy cores for player to spawn into! Add[SCARLET] non-blue[] cores to this map in the editor. map.nospawn.attack = This map does not have any enemy cores for player to attack! Add[SCARLET] red[] cores to this map in the editor. map.invalid = Error loading map: corrupted or invalid map file. -map.publish.error = Error publishing map: {0} +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 -map.publish = Map published. -map.publishing = [accent]Publishing map... +missing = This item has been deleted or moved.\n[lightgray]The workshop listing has now been automatically un-linked. +publishing = [accent]Publishing... +publish.confirm = Are you sure you want to publish this?\n\n[lightgray]Make sure you agree to the Workshop EULA first, or your items will not show up! +publish.error = Error publishing item: {0} +steam.error = Failed to initialize Steam services.\nError: {0} editor.brush = Brush editor.openin = Open In Editor editor.oregen = Ore Generation @@ -344,7 +400,6 @@ campaign = Campaign load = Load save = Save fps = FPS: {0} -tps = TPS: {0} ping = Ping: {0}ms language.restart = Please restart your game for the language settings to take effect. settings = Settings @@ -352,12 +407,13 @@ tutorial = Tutorial tutorial.retake = Re-Take Tutorial editor = Editor mapeditor = Map Editor -donate = Donate abandon = Abandon abandon.text = This zone and all its resources will be lost to the enemy. locked = Locked complete = [LIGHT_GRAY]Reach: -zone.requirement = Wave {0} in zone {1} +requirement.wave = Reach Wave {0} in {1} +requirement.core = Destroy Enemy Core in {0} +requirement.unlock = Unlock {0} resume = Resume Zone:\n[LIGHT_GRAY]{0} bestwave = [LIGHT_GRAY]Best Wave: {0} launch = < LAUNCH > @@ -368,11 +424,13 @@ launch.confirm = This will launch all resources in your core.\nYou will not be a launch.skip.confirm = If you skip now, you will not be able to launch until later waves. uncover = Uncover configure = Configure Loadout +bannedblocks = Banned Blocks +addall = Add All configure.locked = [LIGHT_GRAY]Unlock configuring loadout:\nWave {0}. configure.invalid = Amount must be a number between 0 and {0}. zone.unlocked = [LIGHT_GRAY]{0} unlocked. zone.requirement.complete = Wave {0} reached:\n{1} zone requirements met. -zone.config.complete = Wave {0} reached:\nLoadout config unlocked. +zone.config.unlocked = Loadout unlocked:[lightgray]\n{0} zone.resources = Resources Detected: zone.objective = [lightgray]Objective: [accent]{0} zone.objective.survival = Survive @@ -428,15 +486,14 @@ settings.graphics = Graphics settings.cleardata = Clear Game Data... settings.clear.confirm = Are you sure you want to clear this data?\nWhat is done cannot be undone! settings.clearall.confirm = [scarlet]WARNING![]\nThis will clear all data, including saves, maps, unlocks and keybinds.\nOnce you press 'ok' the game will wipe all data and automatically exit. -settings.clearunlocks = Clear Unlocks -settings.clearall = Clear All paused = [accent]< Paused > +clear = Clear +banned = [scarlet]Banned yes = Yes no = No info.title = Info error.title = [crimson]An error has occured error.crashtitle = An error has occured -attackpvponly = [scarlet]Only available in Attack/PvP modes blocks.input = Input blocks.output = Output blocks.booster = Booster @@ -452,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 @@ -473,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} @@ -517,7 +576,9 @@ 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 setting.animatedshields.name = Animated Shields setting.antialias.name = Antialias[LIGHT_GRAY] (requires restart)[] @@ -538,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 @@ -547,6 +610,7 @@ setting.fps.name = Show FPS setting.vsync.name = VSync setting.pixelate.name = Pixelate [LIGHT_GRAY](may decrease performance, disables animations) setting.minimap.name = Show Minimap +setting.position.name = Show Player Position setting.musicvol.name = Music Volume setting.ambientvol.name = Ambient Volume setting.mutemusic.name = Mute Music @@ -558,6 +622,8 @@ setting.publichost.name = Public Game Visibility setting.chatopacity.name = Chat Opacity setting.lasersopacity.name = Power Laser Opacity setting.playerchat.name = Display In-Game Chat +public.confirm = Do you want to make your game public?\n[accent]Anyone will be able to join your games.\n[lightgray]This can be changed later in Settings->Game->Public Game Visibility. +public.beta = Note that beta versions of the game cannot make public lobbies. uiscale.reset = UI scale has been changed.\nPress "OK" to confirm this scale.\n[scarlet]Reverting and exiting in[accent] {0}[] settings... uiscale.cancel = Cancel & Exit setting.bloom.name = Bloom @@ -569,13 +635,16 @@ category.multiplayer.name = Multiplayer command.attack = Attack command.rally = Rally command.retreat = Retreat -keybind.gridMode.name = Block Select -keybind.gridModeShift.name = Category Select +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.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 = Toggle Fullscreen keybind.select.name = Select/Shoot keybind.diagonal_placement.name = Diagonal Placement @@ -587,12 +656,14 @@ keybind.zoom_hold.name = Zoom Hold keybind.zoom.name = Zoom 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.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 @@ -604,6 +675,7 @@ mode.survival.name = Survival mode.survival.description = The normal mode. Limited resources and automatic incoming waves. mode.sandbox.name = Sandbox mode.sandbox.description = Infinite resources and no timer for waves. +mode.editor.name = Editor mode.pvp.name = PvP mode.pvp.description = Fight against other players locally. mode.attack.name = Attack @@ -771,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 @@ -790,6 +864,7 @@ block.junction.name = Junction block.router.name = Router block.distributor.name = Distributor block.sorter.name = Sorter +block.inverted-sorter.name = Inverted Sorter block.message.name = Message block.overflow-gate.name = Overflow Gate block.silicon-smelter.name = Silicon Smelter @@ -908,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.[] @@ -991,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. @@ -1010,6 +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.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 8f1a734b96..5286ad94e8 100644 --- a/core/assets/bundles/bundle_pl.properties +++ b/core/assets/bundles/bundle_pl.properties @@ -3,6 +3,7 @@ credits = Zasłużeni contributors = Tłumacze i pomocnicy discord = Odwiedź nasz serwer Discord! link.discord.description = Oficjalny serwer Discord Mindustry +link.reddit.description = The Mindustry subreddit link.github.description = Kod źródłowy gry link.changelog.description = Informacje o aktualizacjach link.dev-builds.description = Niestabilne wersje gry @@ -16,12 +17,29 @@ screenshot.invalid = Zrzut ekranu jest zbyt duży. Najprawdopodobniej brakuje mi gameover = Koniec Gry gameover.pvp = Zwyciężyła drużyna [accent]{0}[]! highscore = [YELLOW] Nowy rekord! +copied = Copied. load.sound = Dźwięki load.map = Mapy load.image = Obrazy load.content = Treść load.system = System load.mod = Mody +schematic = Schematic +schematic.add = Save Schematic... +schematics = Schematics +schematic.replace = A schematic by that name already exists. Replace it? +schematic.import = Import Schematic... +schematic.exportfile = Export File +schematic.importfile = Import File +schematic.browseworkshop = Browse Workshop +schematic.copy = Copy to Clipboard +schematic.copy.import = Import from Clipboard +schematic.shareworkshop = Share on Workshop +schematic.flip = [accent][[{0}][]/[accent][[{1}][]: Flip Schematic +schematic.saved = Schematic saved. +schematic.delete.confirm = This schematic will be utterly eradicated. +schematic.rename = Rename Schematic +schematic.info = {0}x{1}, {2} blocks stat.wave = Fale powstrzymane:[accent] {0} stat.enemiesDestroyed = Przeciwnicy zniszczeni:[accent] {0} stat.built = Budynki zbudowane:[accent] {0} @@ -42,11 +60,11 @@ database = Centralna baza danych savegame = Zapisz Grę loadgame = Wczytaj Grę joingame = Dołącz Do Gry -addplayers = Dodaj/Usuń Graczy customgame = Własna Gra newgame = Nowa Gra none = minimap = Minimapa +position = Position close = Zamknij website = Strona Gry quit = Wyjdź @@ -62,16 +80,30 @@ uploadingcontent = Przesyłanie Zawartości uploadingpreviewfile = Przesyłanie Pliku Podglądu committingchanges = Zatwierdzanie Zmian done = Gotowe +feature.unsupported = Your device does not support this feature. 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.openfolder = Open Mod Folder mod.enabled = [lightgray]Włączony mod.disabled = [scarlet]Wyłączony +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 = Gra się wyłączy aby wprowadzić zmiany moda. +mod.reloadrequired = [scarlet]Reload Required mod.import = Importuj Mod +mod.import.github = Import Github Mod 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. about.button = O Grze name = Nazwa: noname = Najpierw wybierz [accent]nazwę gracza[] @@ -152,7 +184,6 @@ server.port = Port: server.addressinuse = Adres jest już w użyciu! server.invalidport = Nieprawidłowy numer portu. server.error = [crimson]Błąd hostowania serwera: [accent]{0} -save.old = Ten zapis jest ze starej wersji i gra nie może go teraz wczytać.\n\n[LIGHT_GRAY]Wsparcie starych zapisów będzie w pełnej wersji 4.0. save.new = Nowy zapis save.overwrite = Czy na pewno chcesz nadpisać zapis gry? overwrite = Nadpisz @@ -186,6 +217,7 @@ warning = Uwaga. confirm = Potwierdź delete = Usuń view.workshop = Pokaż w Warsztacie +workshop.listing = Edit Workshop Listing ok = OK open = Otwórz customize = Dostosuj @@ -203,7 +235,12 @@ classic.export.text = [accent]Mindustry[] otrzymało ostatnio ważną aktualizac quit.confirm = Czy na pewno chcesz wyjść? quit.confirm.tutorial = Czy jesteś pewien tego co robisz?\nSamouczek może zostać powtórzony w[accent] Opcje->Gra->Powtórz samouczek.[] 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 wave = [accent]Fala {0} wave.waiting = Fala za {0} wave.waveInProgress = [LIGHT_GRAY]Fala w trakcie @@ -222,14 +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. -map.publish.error = Błąd podczas publikowania mapy: {0} -map.update = Aktualizuj Mapę -map.load.error = Błąd podczaj pobierania danych z warsztatu: {0} -map.menu = Wybierz co chcesz zrobić z tą mapą. -map.changelog = Lista Zmian (opcjonalna) +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 -map.publish = Opublikowano mapę. -map.publishing = [accent]Publikowanie mapy... +missing = This item has been deleted or moved.\n[lightgray]The workshop listing has now been automatically un-linked. +publishing = [accent]Publishing... +publish.confirm = Are you sure you want to publish this?\n\n[lightgray]Make sure you agree to the Workshop EULA first, or your items will not show up! +publish.error = Error publishing item: {0} +steam.error = Failed to initialize Steam services.\nError: {0} editor.brush = Pędzel editor.openin = Otwórz w Edytorze editor.oregen = Generacja Złóż @@ -359,7 +400,6 @@ campaign = Kampania load = Wczytaj save = Zapisz fps = FPS: {0} -tps = TPS: {0} ping = Ping: {0}ms language.restart = Uruchom grę ponownie, aby ustawiony język zaczął funkcjonować. settings = Ustawienia @@ -367,12 +407,13 @@ tutorial = Poradnik tutorial.retake = Ponów Samouczek editor = Edytor mapeditor = Edytor Map -donate = Wspomóż Nas abandon = Opuść abandon.text = Ta strefa i wszystkie jej surowce będą przejęte przez przeciwników. locked = Zablokowane complete = [LIGHT_GRAY]Ukończone: -zone.requirement = Fala {0} w strefie {1} +requirement.wave = Reach Wave {0} in {1} +requirement.core = Destroy Enemy Core in {0} +requirement.unlock = Unlock {0} resume = Kontynuuj Strefę:\n[LIGHT_GRAY]{0} bestwave = [LIGHT_GRAY]Najwyższa fala: {0} launch = < WYSTRZEL > @@ -383,11 +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 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.complete = Fala {0} osiągnięta:\nKonfiguracja ładunku odblokowana. +zone.config.unlocked = Loadout unlocked:[lightgray]\n{0} zone.resources = Wykryte Zasoby: zone.objective = [lightgray]Cel: [accent]{0} zone.objective.survival = Przeżyj @@ -443,15 +486,14 @@ settings.graphics = Grafika settings.cleardata = Wyczyść Dane Gry... settings.clear.confirm = Czy jesteś pewien że chcesz usunąć te dane?\nPo tym nie ma powrotu! settings.clearall.confirm = [scarlet]UWAGA![]\nTo wykasuje wszystkie dane, włącznie z zapisanymi grami i mapami, ustawienami, i znanymi technologiami.\nKiedy naciśniesz 'ok', gra usunie wszystkie swoje dane i automatycznie wyłączy się. -settings.clearunlocks = Wyczyść Listę Przedmiotów -settings.clearall = Wyczyść Wszystko paused = [accent]< Wstrzymano > +clear = Clear +banned = [scarlet]Banned yes = Tak no = Nie info.title = Informacje error.title = [crimson]Wystąpił błąd error.crashtitle = Wystąpił błąd -attackpvponly = [scarlet]Dostępne tylko w trybach Atak/PvP blocks.input = Wejście blocks.output = Wyjście blocks.booster = Wzmacniacz @@ -467,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 @@ -488,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} @@ -532,7 +576,9 @@ 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 setting.animatedshields.name = Animowana Tarcza setting.antialias.name = Antyaliasing[LIGHT_GRAY] (wymaga restartu)[] @@ -553,6 +599,8 @@ setting.difficulty.insane = Szalony setting.difficulty.name = Poziom trudności setting.screenshake.name = Trzęsienie się 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 @@ -562,6 +610,7 @@ setting.fps.name = Pokazuj FPS setting.vsync.name = Synchronizacja pionowa setting.pixelate.name = Pikselacja [LIGHT_GRAY](wyłącza animacje) setting.minimap.name = Pokaż Minimapę +setting.position.name = Show Player Position setting.musicvol.name = Głośność muzyki setting.ambientvol.name = Głośność otoczenia setting.mutemusic.name = Wycisz muzykę @@ -574,6 +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. 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 @@ -585,13 +635,16 @@ category.multiplayer.name = Multiplayer command.attack = Atakuj command.rally = Zbierz command.retreat = Wycofaj -keybind.gridMode.name = Wybieranie Bloku -keybind.gridModeShift.name = Wybieranie Kategorii +keybind.clear_building.name = Clear Building 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.fullscreen.name = Przełącz Pełny Ekran keybind.select.name = Zaznacz keybind.diagonal_placement.name = Budowa po skosie @@ -603,12 +656,14 @@ 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.minimap.name = Minimapa keybind.dash.name = Przyspieszenie keybind.chat.name = Czat keybind.player_list.name = Lista graczy keybind.console.name = Konsola keybind.rotate.name = Obracanie +keybind.rotateplaced.name = Rotate Existing (Hold) keybind.toggle_menus.name = Zmiana widoczności menu keybind.chat_history_prev.name = Przewiń wiadomości w górę keybind.chat_history_next.name = Przewiń wiadomości w dół @@ -788,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 @@ -807,6 +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.message.name = Wiadomość block.overflow-gate.name = Brama Przepełnieniowa block.silicon-smelter.name = Huta Krzemu @@ -925,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.[] @@ -1008,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. @@ -1027,6 +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.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 new file mode 100644 index 0000000000..57245a179f --- /dev/null +++ b/core/assets/bundles/bundle_pt.properties @@ -0,0 +1,1167 @@ +credits.text = Created by [ROYAL]Anuken[] - [SKY]anukendev@gmail.com[] +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 +link.trello.description = Trello Oficial para Atualizações Planejadas +link.itch.io.description = Pagina da Itch.io com os Descarregamentos +link.google-play.description = Listamento do google play store +link.wiki.description = Wiki oficial do Mindustry +linkfail = Falha ao abrir a ligação\nO Url foi copiado +screenshot = Screenshot gravado para {0} +screenshot.invalid = Mapa grande demais, Potencialmente sem memória suficiente para captura. +gameover = O núcleo foi destruído. +gameover.pvp = O time[accent] {0}[] ganhou! +highscore = [YELLOW]Novo recorde! +copied = Copiado. +load.sound = Sons +load.map = Mapas +load.image = Imagens +load.content = Conteúdo +load.system = Sistema +load.mod = Mods +schematic = Esquema +schematic.add = 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 +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}][]: Tornar Esquema +schematic.saved = Esquema gravado. +schematic.delete.confirm = Este esquema irá ser completamente apagado. +schematic.rename = Renomear Esquema +schematic.info = {0}x{1}, {2} blocos +stat.wave = Hordas derrotadas:[accent] {0} +stat.enemiesDestroyed = Inimigos Destruídos:[accent] {0} +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} +launcheditems = [accent]Itens lançados +launchinfo = [unlaunched][[LAUNCH] your core to obtain the items indicated in blue. +map.delete = Certeza que quer deletar o mapa "[accent]{0}[]"? +level.highscore = Melhor\npontuação: [accent] {0} +level.select = Seleção de Fase +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 +savegame = Gravar Jogo +loadgame = Carregar Jogo +joingame = Entrar no Jogo +customgame = Jogo Customi-/nzado +newgame = Novo Jogo +none = +minimap = Mini-Mapa +position = Posição +close = Fechar +website = Site +quit = Sair +save.quit = Gravar e sair +maps = Mapas +maps.browse = Pesquisar mapas +continue = Continuar +maps.none = [LIGHT_GRAY]Nenhum Mapa Encontrado! +invalid = Inválido +preparingconfig = Preparando configuração +preparingcontent = Preparando conteúdo +uploadingcontent = Enviando conteúdo +uploadingpreviewfile = Enviando ficheiro de pré-visualização +committingchanges = Enviando mudanças +done = Feito +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.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} +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 = Sobre +name = Nome: +noname = Escolha[accent] um nome[] primeiro. +filename = Nome do ficheiro: +unlocked = Novo bloco Desbloqueado! +completed = [accent]Completado +techtree = Árvore de tecnologia +research.list = [LIGHT_GRAY]Pesquise: +research = Pesquisa +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.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.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.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 +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 +hostserver.mobile = Hospedar\nJogo +host = Hospedar +hosting = [accent]Abrindo servidor... +hosts.refresh = Atualizar +hosts.discovering = Descobrindo jogos em lan +hosts.discovering.any = Descobrindo jogos +server.refreshing = Atualizando servidor +hosts.none = [lightgray]Nenhum jogo lan encontrado! +host.invalid = [scarlet]Não foi possivel Hospedar. +trace = Traçar jogador +trace.playername = Nome do jogador: [accent]{0} +trace.ip = IP: [accent]{0} +trace.id = ID unico: [accent]{0} +trace.mobile = Cliente móvel: [accent]{0} +trace.modclient = Cliente Customizado: [accent]{0} +invalidid = ID do cliente invalido! Reporte o bug. +server.bans = Banidos +server.bans.none = Nenhum jogador banido encontrado! +server.admins = Administradores +server.admins.none = Nenhum administrador encontrado! +server.add = Adicionar servidor +server.delete = Certeza que quer deletar o servidor? +server.edit = Editar servidor +server.outdated = [crimson]Servidor desatualizado![] +server.outdated.client = [crimson]Cliente desatualizado![] +server.version = [lightgray]Versão: {0} +server.custombuild = [yellow]Versão customizada +confirmban = Certeza que quer banir este jogador? +confirmkick = Certeza que quer expulsar o jogador? +confirmvotekick = Você tem certeza de que quer votar para expulsar este jogador? +confirmunban = Certeza que quer desbanir este jogador? +confirmadmin = Certeza que quer fazer este jogador um administrador? +confirmunadmin = Certeza que quer remover o estatus de adminstrador deste jogador? +joingame.title = Entrar no jogo +joingame.ip = IP: +disconnect = Desconectado. +disconnect.error = Erro de conexão. +disconnect.closed = Conexão fechada. +disconnect.timeout = Tempo esgotado. +disconnect.data = Falha ao abrir os dados do mundo! +cantconnect = Impossível conectar ([accent]{0}[]). +connecting = [accent]Conectando... +connecting.data = [accent]Carregando dados do mundo... +server.port = Porte: +server.addressinuse = Endereço em uso! +server.invalidport = Numero de porta invalido! +server.error = [crimson]Erro ao hospedar o servidor: [accent]{0} +save.new = Novo gravamento +save.overwrite = Você tem certeza que quer sobrescrever este gravamento? +overwrite = Gravar sobre +save.none = Nenhum gravamento encontrado! +saveload = [accent]Gravando... +savefail = Falha ao gravar jogo! +save.delete.confirm = Certeza que quer deletar este gravamento? +save.delete = Deletar +save.export = Exportar save +save.import.invalid = [accent]Este gravamento é inválido! +save.import.fail = [crimson]Falha ao importar gravamento: [accent]{0} +save.export.fail = [crimson]Falha ao exportar gravamento: [accent]{0} +save.import = Importar gravamento +save.newslot = Nome do gravamento: +save.rename = Renomear +save.rename.text = Novo jogo: +selectslot = Selecione um lugar para gravar. +slot = [accent]Slot {0} +editmessage = Edit Message +save.corrupted = [accent]Ficheiro corrompido ou inválido! +empty = +on = Ligado +off = Desligado +save.autosave = Autogravar: {0} +save.map = Mapa: {0} +save.wave = Horda {0} +save.mode = Gamemode: {0} +save.date = Último gravamento: {0} +save.playtime = Tempo De Jogo: {0} +warning = Aviso. +confirm = Confirmar +delete = Excluir +view.workshop = Ver na oficina +workshop.listing = Edit Workshop Listing +ok = OK +open = Abrir +customize = Customizar +cancel = Cancelar +openlink = Abrir Ligação +copylink = Copiar ligação +back = Voltar +data.export = Exportar dados +data.import = Importar dados +data.exported = Dados exportados. +data.invalid = Estes dados de jogo não são válidos. +data.import.confirm = Importar dados externos irá deletar[scarlet] todos[] os seus dados atuais.\n[accent]Isso não pode ser desfeito![]\n\nQuando sua data é importada, seu jogo ira sair imediatamente. +classic.export = Exportar dados clássicos +classic.export.text = [accent]Mindustry[] acabou de ter uma grande atualização.\nForam detectados gravamentos ou mapas na versão clássica (v3.5 build 40). Você gostaria de exportar estes gravamentos para a pasta inicial do seu celular, para usar no Mindustry Classic? +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... +saving = [accent]Gravando... +cancelbuilding = [accent][[{0}][] to clear plan +selectschematic = [accent][[{0}][] to select+copy +pausebuilding = [accent][[{0}][] to pause building +resumebuilding = [scarlet][[{0}][] to resume building +wave = [accent]Horda {0} +wave.waiting = Horda em {0} +wave.waveInProgress = [LIGHT_GRAY]Horda Em Progresso +waiting = Aguardando... +waiting.players = Esperando por jogadores... +wave.enemies = [LIGHT_GRAY]{0} inimigos restantes +wave.enemy = [LIGHT_GRAY]{0} inimigo restante +loadimage = Carregar\nimagem +saveimage = Gravarr\nimagem +unknown = Desconhecido +custom = Customizado +builtin = Embutido +map.delete.confirm = Certeza que quer deletar este mapa? Isto não pode ser desfeito! +map.random = [accent]Mapa aleatório +map.nospawn = Este mapa não possui nenhum núcleo para o jogador nascer! Adicione um núcleo[accent] amarelo[] para este mapa no editor. +map.nospawn.pvp = Esse mapa não tem núcleos inimigos para os jogadores nascerem! Adicione[SCARLET] Núcleos vermelhos[] no mapa no editor. +map.nospawn.attack = Esse mapa não tem nenhum núcleo inimigo para o jogador atacar! coloque[SCARLET] Núcleos[] vermelhos no editor. +map.invalid = Erro ao carregar o mapa: Ficheiro de mapa invalido ou corrupto. +workshop.update = Atualizar Item +workshop.error = Error fetching workshop details: {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 +changelog = Changelog (optional): +eula = EULA do 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} +steam.error = Failed to initialize Steam services.\nError: {0} +editor.brush = Pincel +editor.openin = Abrir no Editor +editor.oregen = Geração de minério +editor.oregen.info = Geração de minério: +editor.mapinfo = Informação do mapa +editor.author = Autor: +editor.description = Descrição: +editor.nodescription = Um mapa deve ter uma descrição de no mínimo 4 caracteres antes de ser publicado. +editor.waves = Hordas: +editor.rules = Regras: +editor.generation = Geração: +editor.ingame = Editar em jogo +editor.publish.workshop = Publicar na oficina +editor.newmap = Novo mapa +workshop = Oficina +waves.title = Hordas +waves.remove = Remover +waves.never = +waves.every = a cada +waves.waves = Hordas(s) +waves.perspawn = por spawn +waves.to = para +waves.boss = Chefe +waves.preview = Pré visualizar +waves.edit = Editar... +waves.copy = Copiar para área de transferência +waves.load = Carregar da área de transferência +waves.invalid = Hordas inválidas na área de transferência. +waves.copied = Hordas copiadas. +waves.none = Sem hordas definidas.\nNote que layouts vazios de hordas serão automaticamente substituídos pelo layout padrão. +editor.default = [LIGHT_GRAY] +details = Detalhes... +edit = Editar... +editor.name = Nome: +editor.spawn = Criar unidade +editor.removeunit = Remover unidade +editor.teams = Times +editor.errorload = Erro ao carregar o ficheiro:\n[accent]{0} +editor.errorsave = Erro ao gravar o ficheiro:\n[accent]{0} +editor.errorimage = Isso é uma imagem, não um mapa. Não vá por aí mudando extensões esperando que funcione.\n\nSe você quer importar um mapa legacy, Use o botão 'Importar mapa legacy'no editor. +editor.errorlegacy = Esse mapa é velho demais, E usa um formato de mapa legacy que não é mais suportado. +editor.errornot = Este não é um ficheiro de mapa. +editor.errorheader = Este ficheiro de mapa não é mais válido ou está corrompido. +editor.errorname = O mapa não tem nome definido. +editor.update = Atualizar +editor.randomize = Aleatorizar +editor.apply = Aplicar +editor.generate = Gerar +editor.resize = Redimen-\nsionar +editor.loadmap = Carregar\nmapa +editor.savemap = Gravar\nmapa +editor.saved = Gravado! +editor.save.noname = Seu mapa não tem um nome! Coloque um no menu de "Informação do mapa" +editor.save.overwrite = O seu mapa substitui um mapa já construído! Coloque um nome diferente no menu "Informação do mapa" +editor.import.exists = [scarlet]Não foi possivel importar:[] Um mapa construído chamado '{0}' Já existe! +editor.import = Importar... +editor.importmap = Importar Mapa +editor.importmap.description = Importar um mapa existente +editor.importfile = Importar ficheiro +editor.importfile.description = Importar um ficheiro externo +editor.importimage = Importar imagem do terreno +editor.importimage.description = Importar uma imagem de terreno externa +editor.export = Exportar... +editor.exportfile = Exportar ficheiro +editor.exportfile.description = Exportar um ficheiro de mapa +editor.exportimage = Exportar imagem de terreno +editor.exportimage.description = Exportar um ficheiro de imagem de mapa +editor.loadimage = Carregar\nImagem +editor.saveimage = Gravar\nImagem +editor.unsaved = [scarlet]Você tem alterações não gradavas![]\nTem certeza que quer sair? +editor.resizemap = Redimensionar Mapa +editor.mapname = Nome do Mapa: +editor.overwrite = [accent]Aviso!\nIsso Substitui um mapa existente. +editor.overwrite.confirm = [scarlet]Aviso![] Um mapa com esse nome já existe. Tem certeza que deseja substituir? +editor.exists = Já existe um mapa com este nome. +editor.selectmap = Selecione uma mapa para carregar: +toolmode.replace = Substituir +toolmode.replace.description = Desenha apenas em blocos sólidos. +toolmode.replaceall = Substituir tudo +toolmode.replaceall.description = Substituir todos os blocos no mapa +toolmode.orthogonal = Linha reta +toolmode.orthogonal.description = Desenha apenas linhas retas. +toolmode.square = Square +toolmode.square.description = Pincel quadrado. +toolmode.eraseores = Apagar minérios +toolmode.eraseores.description = Apaga apenas minérios. +toolmode.fillteams = Encher times +toolmode.fillteams.description = Muda o time do qual todos os blocos pertencem. +toolmode.drawteams = Desenhar times +toolmode.drawteams.description = Muda o time do qual o bloco pertence. +filters.empty = [LIGHT_GRAY]Sem filtro! Adicione um usando o botão abaixo. +filter.distort = Distorcedor +filter.noise = Geração aleatória +filter.median = Mediano +filter.oremedian = Minério Mediano +filter.blend = Misturar +filter.defaultores = Minérios padrão +filter.ore = Minério +filter.rivernoise = Geração aleatória de rios +filter.mirror = Espelhar +filter.clear = Excluir +filter.option.ignore = Ignorar +filter.scatter = Dispersão +filter.terrain = Terreno +filter.option.scale = Escala +filter.option.chance = Chance +filter.option.mag = Magnitude +filter.option.threshold = Margem +filter.option.circle-scale = Escala de círculo +filter.option.octaves = Oitavas +filter.option.falloff = Caída +filter.option.angle = Ângulo +filter.option.block = Bloco +filter.option.floor = Chão +filter.option.flooronto = Chão alvo +filter.option.wall = Parede +filter.option.ore = Minério +filter.option.floor2 = Chão secundário +filter.option.threshold2 = Margem secundária +filter.option.radius = Raio +filter.option.percentile = Percentual +width = Largura: +height = Altura: +menu = Menu +play = Jogar +campaign = Campa-/nnha +load = Carregar +save = Gravar +fps = FPS: {0} +ping = Ping: {0}ms +language.restart = Por favor, reinicie seu jogo para a tradução tomar efeito. +settings = Configu-/nrações +tutorial = Tutorial +tutorial.retake = Refazer Tutorial +editor = Editor +mapeditor = Editor de mapa +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} +resume = Resumir Zona:\n[LIGHT_GRAY]{0} +bestwave = [LIGHT_GRAY]Melhor: {0} +launch = Lançar +launch.title = Lançamento feito com sucesso +launch.next = [LIGHT_GRAY]Próxima oportunidade na Horda {0} +launch.unable2 = [scarlet]Impossível lançar.[] +launch.confirm = Isto vai lançar todos os seus recursos no seu núcleo.\nVoce não será capaz de retornar para esta base. +launch.skip.confirm = Se você pular a 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 +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.resources = Recursos detectados: +zone.objective = [lightgray]Objetivo: [accent]{0} +zone.objective.survival = Sobreviver +zone.objective.attack = Destruir o núcleo inimigo +add = Adicionar... +boss.health = Saúde do chefe +connectfail = [crimson]Falha ao entrar no servidor: [accent]{0} +error.unreachable = Servidor inalcançável. +error.invalidaddress = Endereço inválido. +error.timedout = Desconectado!\nTenha certeza que o anfitrião tenha feito redirecionamento de portas e que o endereço esteja correto! +error.mismatch = Erro de pacote:\nPossivel incompatibilidade com a versão do cliente/servidor.\nTenha certeza que você e o anfitrião tenham a última versão! +error.alreadyconnected = Já conectado. +error.mapnotfound = Ficheiro de mapa não encontrado! +error.io = Erro I/O de internet. +error.any = Erro de rede desconhecido. +error.bloom = Falha ao inicializar bloom.\nSeu aparelho talvez não o suporte. +zone.groundZero.name = Marco zero +zone.desertWastes.name = Ruínas do Deserto +zone.craters.name = As crateras +zone.frozenForest.name = Floresta congelada +zone.ruinousShores.name = Costas Ruinosas +zone.stainedMountains.name = Montanhas manchadas +zone.desolateRift.name = Fenda desolada +zone.nuclearComplex.name = Complexo de Produção Nuclear +zone.overgrowth.name = Crescimento excessivo +zone.tarFields.name = Campos de Piche +zone.saltFlats.name = Planícies de sal +zone.impact0078.name = Impacto 0078 +zone.crags.name = Penhascos +zone.fungalPass.name = Passagem Fúngica +zone.groundZero.description = Uma ótima localização para começar de novo. Baixa ameaça inimiga. Poucos recursos.\nColete o máximo de chumbo e cobre possível.\nContinue! +zone.frozenForest.description = Até aqui, perto das montanhas, os esporos se espalharam. As baixas temperaturas não podem contê-los para sempre.\n\nComeçe a busca por energia. Construa geradores à combustão. Aprenda a usar os reparadores (menders). +zone.desertWastes.description = Estas ruínas são vastas, imprevisíveis, e cruzadas por estruturas abandonadas.\nCarvão está presente na região. O queime por energia, ou sintetize grafite.\n\n[lightgray]Este local de pouso não pode ser garantido. +zone.saltFlats.description = Nos arredores do deserto estão as Planícies de Sal. Poucos recursos podem ser encontrados neste lugar.\n\nO inimigo ergueu um complexo de armazenamento aqui. Erradique seu núcleo. Não deixe nada de pé. +zone.craters.description = Água se acumulou nesta cratera, relíquia de guerras antigas. Recupere a área. Colete areia. Derreta metavidro. Bombeie água para resfriar torretas e brocas. +zone.ruinousShores.description = Depois das ruínas está o litoral. Uma vez, este local abrigou uma matriz de defesa costeira. Não restou muito disso. Apenas as estruturas de defesa mais básicas restaram ilesas, todo o resto se reduziu a sucata.\nContinue a expansão para fora. Redescubra a tecnologia. +zone.stainedMountains.description = Mais para o interior estão as montanhas, ainda intocadas por esporos.\nExtraia o titânio abundante nesta área. Aprenda como usá-lo.\n\nA presença inimiga é maior aqui. Não os dê tempo de enviar suas tropas mais fortes. +zone.overgrowth.description = Esta área tem crescimento excessivo, mais perto da fonte de esporos.\nO inimgo estabeleceu um posto avançado aqui. Construa unidades dagger. Destrua-o. Recupere o que sobrou. +zone.tarFields.description = Nos arredores de uma zona de produção de petróleo, entre as montanhas e o deserto. Uma das poucas áreas com reservas utilizáveis de piche.\nApesar de abandonada, esta área possui perigosas forças inimigas por perto. Não as subestime.\n\n[lightgray]Pesquise tecnologias de processamento de petróleo se possível. +zone.desolateRift.description = Uma zona extremamente perigosa. Recursos abundantes, porém pouco espaço. Alto risco de destruição. Saia o mais rápido possível. Não seja enganado pelo longo espaço de tempo entre os ataques inimigos. +zone.nuclearComplex.description = Uma antiga instalação para produção e processamento de tório, reduzido a ruínas.\n[lightgray]Pesquise o tório e seus muitos usos.\n\nO inimigo está presente aqui em grandes números, constantemente à procura de atacantes. +zone.fungalPass.description = 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.data = Dados do jogo +settings.reset = Restaurar Padrões +settings.rebind = Religar +settings.controls = Controles +settings.game = Jogo +settings.sound = Som +settings.graphics = Gráficos +settings.cleardata = Apagar dados... +settings.clear.confirm = Certeza que quer limpar a os dados?\nOque é feito não pode ser desfeito! +settings.clearall.confirm = [scarlet]Aviso![]\nIsso vai limpar toda a data, Incluindo saves, mapas, Keybinds e desbloqueados.\nQuando apertar 'ok' Vai apagar toda a data e sair automaticamente. +paused = Pausado +clear = Clear +banned = [scarlet]Banned +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.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.itemsmoved = Velocidade de movimento +blocks.launchtime = Tempo entre tiros +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 +blocks.basepowergeneration = Geração de poder base +blocks.productiontime = Tempo de produção +blocks.repairtime = Tempo de reparo total do bloco +blocks.speedincrease = Aumento de velocidade +blocks.range = Distância +blocks.drilltier = Furáveis +blocks.drillspeed = Velocidade da broca base +blocks.boosteffect = Efeito do Boost +blocks.maxunits = Máximo de unidades ativas +blocks.health = Saúde +blocks.buildtime = Tempo de construção +blocks.buildcost = Custo de construção +blocks.inaccuracy = Imprecisão +blocks.shots = Tiros +blocks.reload = Tiros por segundo +blocks.ammo = Munição +bar.drilltierreq = Broca melhor necessária. +bar.drillspeed = Velocidade da broca: {0}/s +bar.pumpspeed = Pump Speed: {0}/s +bar.efficiency = Eficiência: {0}% +bar.powerbalance = Energia: {0} +bar.powerstored = Armazenada: {0}/{1} +bar.poweramount = Energia: {0} +bar.poweroutput = Saída de energia: {0} +bar.items = Itens: {0} +bar.capacity = Capacidade: {0} +bar.liquid = Liquido +bar.heat = Aquecimento +bar.power = Poder +bar.progress = Progresso da construção +bar.spawned = Unidades: {0}/{1} +bullet.damage = [stat]{0}[lightgray] dano +bullet.splashdamage = [stat]{0}[lightgray] Dano em área ~[stat] {1}[lightgray] Blocos +bullet.incendiary = [stat]Incendiário +bullet.homing = [stat]Guiado +bullet.shock = [stat]Choque +bullet.frag = [stat]Fragmentação +bullet.knockback = [stat]{0}[lightgray]Impulso +bullet.freezing = [stat]Congelamento +bullet.tarred = [stat]Grudento +bullet.multiplier = [stat]{0}[lightgray]x multiplicador de munição +bullet.reload = [stat]{0}[lightgray]x cadência de tiro +unit.blocks = Blocos +unit.powersecond = Unidades de energia/segundo +unit.liquidsecond = Unidades de líquido/segundo +unit.itemssecond = itens/segundo +unit.liquidunits = Unidades de liquido +unit.powerunits = Unidades de energia +unit.degrees = Graus +unit.seconds = segundos +unit.persecond = por segundo +unit.timesspeed = x Velocidade +unit.percent = % +unit.items = itens +category.general = Geral +category.power = Poder +category.liquids = Líquidos +category.items = Itens +category.crafting = Construindo +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 +setting.animatedshields.name = Escudos animados +setting.antialias.name = Filtro suavizante[LIGHT_GRAY] (reinicialização requerida)[] +setting.indicators.name = Indicador de aliados +setting.autotarget.name = Alvo automatico +setting.keyboard.name = Controles de mouse e teclado +setting.touchscreen.name = Controles de Touchscreen +setting.fpscap.name = FPS Máximo +setting.fpscap.none = Nenhum +setting.fpscap.text = {0} FPS +setting.uiscale.name = Escala da IU[lightgray] (reinicialização requerida)[] +setting.swapdiagonal.name = Sempre colocação diagnoal +setting.difficulty.training = Treinamento +setting.difficulty.easy = Fácil +setting.difficulty.normal = Normal +setting.difficulty.hard = Difícil +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 +setting.fullscreen.name = Ecrã inteiro +setting.borderlesswindow.name = Janela sem borda[LIGHT_GRAY] (Pode precisar reiniciar) +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.musicvol.name = Volume da Música +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.savecreate.name = Criar gravamentos automaticamente +setting.publichost.name = Visibilidade do jogo público +setting.chatopacity.name = Opacidade do chat +setting.lasersopacity.name = Power Laser Opacity +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.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 +setting.bloom.name = Bloom +keybind.title = Refazer teclas +keybinds.mobile = [scarlet]A maior parte das teclas aqui não são funcionais em aparelhos móveis. Apenas movimento básico é suportado. +category.general.name = Geral +category.view.name = Ver +category.multiplayer.name = Multijogador +command.attack = Atacar +command.rally = Reunir +command.retreat = Recuar +keybind.clear_building.name = Limpar Edificio +keybind.press = Pressione uma tecla... +keybind.press.axis = Pressione uma Axis ou tecla... +keybind.screenshot.name = Captura do mapa +keybind.move_x.name = mover_x +keybind.move_y.name = mover_y +keybind.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 = Alterar ecrã inteiro +keybind.select.name = selecionar +keybind.diagonal_placement.name = Colocação diagonal +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.name = Zoom +keybind.menu.name = Menu +keybind.pause.name = Pausar +keybind.pause_building.name = Pause/Resume Building +keybind.minimap.name = Minimapa +keybind.dash.name = Correr +keybind.chat.name = Conversa +keybind.player_list.name = Lista_de_jogadores +keybind.console.name = console +keybind.rotate.name = Girar +keybind.rotateplaced.name = Rotate Existing (Hold) +keybind.toggle_menus.name = Ativar menus +keybind.chat_history_prev.name = Historico do chat anterior +keybind.chat_history_next.name = Historico do proximo chat +keybind.chat_scroll.name = Rolar chat +keybind.drop_unit.name = Soltar unidade +keybind.zoom_minimap.name = Zoom do minimapa +mode.help.title = Descrição dos modos +mode.survival.name = Sobrevivência +mode.survival.description = O modo normal. Recursos limitados e hordas automáticas. +mode.sandbox.name = Sandbox +mode.sandbox.description = Recursos infinitos e sem tempo para ataques. +mode.editor.name = Editor +mode.pvp.name = JXJ +mode.pvp.description = Lutar contra outros jogadores locais. +mode.attack.name = Ataque +mode.attack.description = Sem hordas, com o objetivo de destruir a base inimiga. +mode.custom = Regras personalizadas +rules.infiniteresources = Recursos infinitos +rules.wavetimer = Tempo de horda +rules.waves = Hordas +rules.attack = Modo de ataque +rules.enemyCheat = Recursos de IA Infinitos +rules.unitdrops = Unidade solta +rules.unitbuildspeedmultiplier = Multiplicador de velocidade de criação de unidade +rules.unithealthmultiplier = Multiplicador de vida de unidade +rules.playerhealthmultiplier = Multiplicador da vida de jogador +rules.playerdamagemultiplier = Multiplicador do dano de jogador +rules.unitdamagemultiplier = Multiplicador de dano de Unidade +rules.enemycorebuildradius = Raio de "Não-criação" de core inimigo:[LIGHT_GRAY] (blocos) +rules.respawntime = Tempo de renascimento:[LIGHT_GRAY] (seg) +rules.wavespacing = Espaço entre hordas:[LIGHT_GRAY] (seg) +rules.buildcostmultiplier = Multiplicador de custo de construção +rules.buildspeedmultiplier = Multiplicador de velocidade de construção +rules.waitForWaveToEnd = hordas esperam inimigos +rules.dropzoneradius = Raio da zona de spawn:[LIGHT_GRAY] (blocos) +rules.respawns = Respawn maximos por horda +rules.limitedRespawns = Respawn limitados +rules.title.waves = Hordas +rules.title.respawns = Respawns +rules.title.resourcesbuilding = Recursos e Construções +rules.title.player = Jogadores +rules.title.enemy = Inimigos +rules.title.unit = Unidades +content.item.name = Itens +content.liquid.name = Liquidos +content.unit.name = Unidades +content.block.name = Blocos +content.mech.name = Armaduras +item.copper.name = Cobre +item.lead.name = Chumbo +item.coal.name = Carvão +item.graphite.name = Grafite +item.titanium.name = Titânio +item.thorium.name = Urânio +item.silicon.name = Sílicio +item.plastanium.name = Plastânio +item.phase-fabric.name = Tecido de fase +item.surge-alloy.name = Liga de surto +item.spore-pod.name = Cápsula de esporos +item.sand.name = Areia +item.blast-compound.name = Composto de explosão +item.pyratite.name = Piratita +item.metaglass.name = Metavidro +item.scrap.name = Sucata +liquid.water.name = Água +liquid.slag.name = Escória +liquid.oil.name = Petróleo +liquid.cryofluid.name = Crio Fluido +mech.alpha-mech.name = Alfa +mech.alpha-mech.weapon = Repetidor pesado +mech.alpha-mech.ability = Regeneração +mech.delta-mech.name = Delta +mech.delta-mech.weapon = Gerador Arc +mech.delta-mech.ability = Descarga +mech.tau-mech.name = Tau +mech.tau-mech.weapon = Laser reestruturador +mech.tau-mech.ability = Tiro reparador +mech.omega-mech.name = Omega +mech.omega-mech.weapon = Enxame de mísseis +mech.omega-mech.ability = Configuração Armadurada +mech.dart-ship.name = Dardo +mech.dart-ship.weapon = Repetidor +mech.javelin-ship.name = Javelin +mech.javelin-ship.weapon = Mísseis explosivos +mech.javelin-ship.ability = Acelerador de explosão +mech.trident-ship.name = Tridente +mech.trident-ship.weapon = Carga de bombas +mech.glaive-ship.name = Glaive +mech.glaive-ship.weapon = Repetidor de fogo +item.explosiveness = [LIGHT_GRAY]Explosibilidade: {0} +item.flammability = [LIGHT_GRAY]Inflamabilidade: {0} +item.radioactivity = [LIGHT_GRAY]Radioatividade: {0} +unit.health = [LIGHT_GRAY]Vida: {0} +unit.speed = [LIGHT_GRAY]Velocidade: {0} +mech.weapon = [LIGHT_GRAY]Arma: {0} +mech.health = [LIGHT_GRAY]Saúde: {0} +mech.itemcapacity = [LIGHT_GRAY]Capacidade de itens: {0} +mech.minespeed = [LIGHT_GRAY]Velocidade de mineração: {0} +mech.minepower = [LIGHT_GRAY]Poder de mineração: {0} +mech.ability = [LIGHT_GRAY]Habilidade: {0} +mech.buildspeed = [LIGHT_GRAY]Velocidade de construção: {0}% +liquid.heatcapacity = [LIGHT_GRAY]Capacidade de aquecimento: {0} +liquid.viscosity = [LIGHT_GRAY]Viscosidade: {0} +liquid.temperature = [LIGHT_GRAY]Temperatura: {0} +block.sand-boulder.name = Pedregulho de areia +block.grass.name = Grama +block.salt.name = Sal +block.saltrocks.name = Pedras De Sal +block.pebbles.name = Pedrinhas +block.tendrils.name = Gavinhas +block.sandrocks.name = Pedras de areia +block.spore-pine.name = Pinheiro de esporo +block.sporerocks.name = Pedras de esporo +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.moss.name = Musgo +block.shrubs.name = Arbusto +block.spore-moss.name = Musgo de esporos +block.shalerocks.name = Rohas 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 +block.scrap-wall-gigantic.name = Muro gigante de sucata +block.thruster.name = Propulsor +block.kiln.name = Forno para metavidro +block.graphite-press.name = Prensa de grafite +block.multi-press.name = Multi-Prensa +block.constructing = {0}\n[LIGHT_GRAY](Construindo) +block.spawn.name = Spawn dos inimigos +block.core-shard.name = Fragmento do núcleo +block.core-foundation.name = Fundação do núcleo +block.core-nucleus.name = Núcleo do núcleo +block.deepwater.name = Água profunda +block.water.name = Água +block.tainted-water.name = Água contaminada +block.darksand-tainted-water.name = Água contaminada sobre areia escura +block.tar.name = Piche +block.stone.name = Pedra +block.sand.name = Areia +block.darksand.name = Areia escura +block.ice.name = Gelo +block.snow.name = Neve +block.craters.name = Crateras +block.sand-water.name = Água sobre areia +block.darksand-water.name = Água sobre areia escura +block.char.name = Char +block.holostone.name = Pedra holo +block.ice-snow.name = Gelo de neve +block.rocks.name = Rochas +block.icerocks.name = Rochas de gelo +block.snowrocks.name = Rochas de neve +block.dunerocks.name = Rochas da duna +block.pine.name = Pinheiro +block.white-tree-dead.name = Árvore branca morta +block.white-tree.name = Árvore branca +block.spore-cluster.name = Aglomerado de esporos +block.metal-floor.name = Chão de metal +block.metal-floor-2.name = Chão de metal 2 +block.metal-floor-3.name = Chão de metal 3 +block.metal-floor-5.name = Chão de metal 5 +block.metal-floor-damaged.name = Chão de metal danificado +block.dark-panel-1.name = Painel escuro 1 +block.dark-panel-2.name = Painel escuro 2 +block.dark-panel-3.name = Painel escuro 3 +block.dark-panel-4.name = Painel escuro 4 +block.dark-panel-5.name = Painel escuro 5 +block.dark-panel-6.name = Painel escuro 6 +block.dark-metal.name = Metal escuro +block.ignarock.name = Rocha ígnea +block.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.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 +block.thorium-wall-large.name = Parede de tório grande +block.door.name = Porta +block.door-large.name = Porta Grande +block.duo.name = Dupla +block.scorch.name = Queimada +block.scatter.name = Dispersão +block.hail.name = Granizo +block.lancer.name = Lançador +block.conveyor.name = Esteira +block.titanium-conveyor.name = Esteira de Titânio +block.armored-conveyor.name = Esteira Armadurada +block.armored-conveyor.description = Move os itens com a mesma velocidade das esteiras de titânio, mas tem mais armadura. Não aceita itens dos lados de nada além de outras esteiras. +block.junction.name = Junção +block.router.name = Roteador +block.distributor.name = Distribuidor +block.sorter.name = Ordenador +block.inverted-sorter.name = Inverted Sorter +block.message.name = Mensagem +block.overflow-gate.name = Portão Sobrecarregado +block.silicon-smelter.name = Fundidora de silicio +block.phase-weaver.name = Palheta de fase +block.pulverizer.name = Pulverizador +block.cryofluidmixer.name = Misturador de Crio Fluido +block.melter.name = Aparelho de fusão +block.incinerator.name = Incinerador +block.spore-press.name = Prensa de Esporo +block.separator.name = Separador +block.coal-centrifuge.name = Centrifuga de carvão +block.power-node.name = Célula de energia +block.power-node-large.name = Célula de energia Grande +block.surge-tower.name = Torre de surto +block.battery.name = Bateria +block.battery-large.name = Bateria Grande +block.combustion-generator.name = Gerador a combustão +block.turbine-generator.name = Gerador de Turbina +block.differential-generator.name = Gerador diferencial +block.impact-reactor.name = Reator De Impacto +block.mechanical-drill.name = Broca Mecânica +block.pneumatic-drill.name = Broca Pneumática +block.laser-drill.name = Broca a Laser +block.water-extractor.name = Extrator de água +block.cultivator.name = Cultivador +block.dart-mech-pad.name = Controle da armadura Dart +block.delta-mech-pad.name = Controle da armadura Delta +block.javelin-ship-pad.name = Controle da nave Javelin +block.trident-ship-pad.name = Controle da nave Tridente +block.glaive-ship-pad.name = Controle da nave Glaive +block.omega-mech-pad.name = Controle da armadura Omega +block.tau-mech-pad.name = Controle da armadura Tau +block.conduit.name = Cano +block.mechanical-pump.name = Bomba Mecânica +block.item-source.name = Criador de itens +block.item-void.name = Destruidor de itens +block.liquid-source.name = Criador de líquidos +block.power-void.name = Anulador de energia +block.power-source.name = Criador de energia +block.unloader.name = Descarregador +block.vault.name = Cofre +block.wave.name = Onda +block.swarmer.name = Enxame +block.salvo.name = Salvo +block.ripple.name = Ondulação +block.phase-conveyor.name = Esteira de Fases +block.bridge-conveyor.name = Esteira-Ponte +block.plastanium-compressor.name = Compressor de Plastânio +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.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 +block.phantom-factory.name = Fábrica de drone de construção Phantom +block.wraith-factory.name = Fábrica de lutadores Wraith +block.ghoul-factory.name = Fábrica de Bombardeiros Ghoul +block.dagger-factory.name = Fábrica de mech Dagger +block.crawler-factory.name = Fábrica de mech Crawler +block.titan-factory.name = Fábrica de mech titan +block.fortress-factory.name = Fábrica de mech Fortress +block.revenant-factory.name = Fábrica de lutadores Revenant +block.repair-point.name = Ponto de Reparo +block.pulse-conduit.name = Cano de Pulso +block.phase-conduit.name = Cano de Fase +block.liquid-router.name = Roteador de Líquido +block.liquid-tank.name = Tanque de Líquido +block.liquid-junction.name = Junção de Líquido +block.bridge-conduit.name = Cano Ponte +block.rotary-pump.name = Bomba Rotatória +block.thorium-reactor.name = Reator a Tório +block.mass-driver.name = Drive de Massa +block.blast-drill.name = Broca de Explosão +block.thermal-pump.name = Bomba térmica +block.thermal-generator.name = Gerador Térmico +block.alloy-smelter.name = Fundidora de Liga +block.mender.name = Reparador +block.mend-projector.name = Projetor de reparo +block.surge-wall.name = Parede de liga de surto +block.surge-wall-large.name = Parede de liga de surto grande +block.cyclone.name = Ciclone +block.fuse.name = Fundir +block.shock-mine.name = Mina de Choque +block.overdrive-projector.name = Projetor de sobrecarga +block.force-projector.name = Projetor de campo de força +block.arc.name = Arco Elétrico +block.rtg-generator.name = Gerador GTR +block.spectre.name = Espectro +block.meltdown.name = Fusão +block.container.name = Contâiner +block.launch-pad.name = Plataforma de lançamento +block.launch-pad-large.name = Plataforma de lançamento grande +team.blue.name = Azul +team.crux.name = Vermelho +team.sharded.name = orange +team.orange.name = Laranja +team.derelict.name = derelict +team.green.name = Verde +team.purple.name = Roxo +unit.spirit.name = Drone Spirit +unit.draug.name = Drone minerador Draug +unit.phantom.name = Drone Phantom +unit.dagger.name = Dagger +unit.crawler.name = Crawler +unit.titan.name = Titan +unit.ghoul.name = Bombardeiro Ghoul +unit.wraith.name = Lutador Wraith +unit.fortress.name = Fortaleza +unit.revenant.name = Revenant +unit.eruptor.name = Eruptor +unit.chaos-array.name = Arraia do caos +unit.eradicator.name = Erradicador +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.[] +tutorial.conveyor = [accent]Esteiras[] São usadas para transportar itens até o núcleo.\nFaça uma linha de Esteiras da mineradora até o núcleo. +tutorial.conveyor.mobile = [accent]Esteiras[] são usadas para transportar itens até o núcleo.\nFaça uma linha de esteiras da broca até o núcleo.\n[accent] Coloque uma linha segurando por alguns segundos[] e arrastando em uma direção.\n\n[accent]{0}/{1} esteiras postas em linha\n[accent]0/1 itens entregues +tutorial.turret = Estruturas defensivas devem ser construidas para repelir[LIGHT_GRAY] o inimigo[].\nConstrua uma torre dupla perto de sua base. +tutorial.drillturret = Torretas duplas precisam de[accent] cobre[] como munição para atirar.\nColoque uma broca próxima à torre para carregá-la com o cobre minerado. +tutorial.pause = Durante uma batalha, você pode[accent] pausar o jogo.[]\nVocê pode enfileirar construções enquanto o jogo está pausado.\n\n[accent]Pressione a barra de espaço para pausar. +tutorial.pause.mobile = Durante uma batalha, você pode[accent] pausar o jogo.[]\nVocê pode enfileirar construções enquanto o jogo está pausado.\n\n[accent]Pressione este botão no canto superior direito para pausar. +tutorial.unpause = Agora pressione novamente a barra de espaço para despausar. +tutorial.unpause.mobile = Agora pressione novamente para despausar. +tutorial.breaking = Blocos precisam frequentemente ser destruídos.\n[accent]Segure e arraste o botão direito[] para destruir todos os blocos em uma seleção.[]\n\n[accent]Destrua todos esses blocos de sucata à esquerda do seu núcleo usando a seleção em área. +tutorial.breaking.mobile = Blocos precisam frequentemente ser destruídos.\n[accent]Selecione o modo de destruição (ícone de martelo)[], e toque em um bloco para começar a quebrar.\nDestrua uma área segurando seu dedo por alguns segundos[] e arrastando em uma direção.\nPressione o botão de "visto" para confirmar a destruição.\n\n[accent]Destrua todos esses blocos de sucata à esquerda do seu núcleo usando a seleção em área. +tutorial.withdraw = Em algumas situações é necessário pegar itens diretamente do bloco.\nPara fazer isto, [accent]toque em um bloco[] com itens e [accent]toque no item[] no inventário.\nMúltiplos itens podem ser removidos [accent]ao segurar[].\n\n[accent]Tire um pouco de cobre do núcleo.[] +tutorial.deposit = Deposite itens em blocos arrastando da sua nave até o bloco.\n\n[accent]Deposite seu cobre de volta no núcleo.[] +tutorial.waves = O[LIGHT_GRAY] inimigo[] se aproxima.\n\nDefenda seu núcleo por 2 hordas. Construa mais torretas. +tutorial.waves.mobile = O[lightgray] inimigo[] se aproxima.\n\nDefenda seu núcleo por 2 hordas. Seu drone vai atirar nos inimigos automaticamente.\nConstrua mais torretas e brocas. Minere mais cobre. +tutorial.launch = Quando você atinge uma horda específica, Você é capaz de[accent] lançar o núcleo[], deixando suas defesas para trás e[accent] obtendo todos os recursos em seu núcleo.[]\nEstes recursos podem ser usados para pesquisar novas tecnologias.\n\n[accent]Pressione o botão lançar. +item.copper.description = O material mais básico. Usado em todos os tipos de blocos. +item.lead.description = Material de começo basico. usado extensivamente em blocos de transporte de líquidos e eletrônicos. +item.metaglass.description = Composto de vidro super resistente. Extensivamente usado para distribuição e armazenagem de líquidos. +item.graphite.description = Carbono mineralizado, usado como munição e para isolação elétrica. +item.sand.description = Um material comum que é usado extensivamente em derretimento, tanto em ligas como em fluxo. +item.coal.description = Matéria vegetal fossilizada, formada muito depois de semeada. Usado extensivamente para produção de combustível e recursos. +item.titanium.description = Um material raro super leve usado extensivamente no transporte de líquidos, em brocas e drones aéreos. +item.thorium.description = Um metal denso e radioativo, Usado como suporte material e combustivel nuclear. +item.scrap.description = Pedaços remanescentes de estruturas e unidades destruidas. Contem traços de diferentes metais. +item.silicon.description = Condutor extremamente importante, com aplicação em paineis solares e aparelhos complexos. +item.plastanium.description = Material leve e maleável usado em drones aéreos avançados e como munição de fragmentação. +item.phase-fabric.description = Uma substância quase sem peso usada em eletrônica avançada e tecnologia de auto-reparo. +item.surge-alloy.description = Uma liga avançada com propriedades elétricas únicas. +item.spore-pod.description = Uma cápsula de esporos sintéticos, sintetizada de concentrações atmosféricas para propósitos industriais. Usada para conversão em petróleo, explosivos e combustíveis. +item.blast-compound.description = Um composto instável usado em bombas e em explosivos. Sintetizado de cápsulas de esporos e outras substâncias voláteis. Uso como combustível não é recomendado. +item.pyratite.description = Substância extremamente inflamável usada em armas incendiárias. +liquid.water.description = O líquido mais útil, comumente usado em resfriamento de máquinas e no processamento de lixo. Dá pra beber, também. +liquid.slag.description = Vários metais derretidos misturados juntos. Pode ser separado em seus minerais constituentes, ou jogado nas unidades inimigas como uma arma. +liquid.oil.description = Um líquido usado na produção de materias avançados. Pode ser convertido em carvão como combustível, ou pulverizado e incendiado como arma. +liquid.cryofluid.description = A maneira mais eficiente de resfriar qualquer coisa, até seu corpo quando está calor, mas não faça isto. +mech.alpha-mech.description = A Armadura padrão. Tem uma saida de dano e velocidade decente; Pode criar até 3 drones Para capacidades ofensivas aumentadas. +mech.delta-mech.description = Uma armadura rápida, de baixa durabilidade, feita para ataques rápidos. Dá pouco dano às estruturas, mas pode matar grandes grupos de unidades inimigas muito rapidamente com sua arma ARC. +mech.tau-mech.description = A armadura de suporte. Conserta blocos aliados Atirando neles. Pode extinguir o fogo e consertar aliados em uma distancia Com sua habilidade de consertar. +mech.omega-mech.description = Uma armadura volumosa e bem armadurada, Feita para assaltos da primeira linha. Sua habilidade de armadura Pode bloquear 90% de dano. +mech.dart-ship.description = Nave padrão. Consideravelmente leve e rapido, Tem pouca capacidade ofensiva e baixa velocidade de mineração. +mech.javelin-ship.description = Uma nave de ataque hit-and-run (atacar e correr). Quando inicialmente lento, pode acelerar a altas velocidades e voar até bases inimigas, dando altas quantidades de dano com seus raios e mísseis. +mech.trident-ship.description = Um bombardeiro pesado. Consideravelmente bem armadurado. +mech.glaive-ship.description = Uma nave armada, bem armadurada. Com um repetidor incendario equipado. Boa aceleração e máxima velocidade. +unit.draug.description = Um drone de mineração primitivo. Barato para produzir. Descartável. Minera automaticamente cobre e chumbo nas proximidades. Entrega os recursos minerados para o núcleo mais próximo. +unit.spirit.description = Um drone draug modificado, desenhado para reparo em vez de mineração. Automaticamente conserta qualquer bloco danificado na área. +unit.phantom.description = Um drone avançado. Segue utilizadores. Ajuda na construção de blocos. +unit.dagger.description = A mais básica armadura terrestre. Barato para produzir. Esmagadora quando usada em enxames. +unit.crawler.description = Uma unidade terrestre que consiste em um despojado quadro com grandes explosivos amarrados no topo. Não particularmente durável. Explode no contato com inimigos. +unit.titan.description = Uma avançada unidade terrestre armadurada. Ataca alvos aéreos e terrestres. Equipada com dois pequenos lança chamas. +unit.fortress.description = Uma armadura de artilharia pesada. Equipada com dois canhões tipo granizo modificados para assalto de longa distância em estruturas e unidades inimigas. +unit.eruptor.description = Uma unidade pesada desenhada para derrubar estruturas. Atira um monte de escória nas fortificações inimigas, derretendo e colocando-as em chamas. +unit.wraith.description = Uma rápida, unidade interceptadora hit-and-run (atacar e correr). Mira em geradores de energia. +unit.ghoul.description = Um bombardeiro pesado. Rompe estruturas inimigas, mirando em infraestrutura crítica. +unit.revenant.description = Uma matriz de mísseis pesada e flutuante. +block.message.description = Armazena uma mensagem. Usado para comunicação entre aliados. +block.graphite-press.description = Comprime pedaços de carvão em lâminas de grafite puro. +block.multi-press.description = Uma versão melhorada da prensa de grafite. Usa água e energia para processar carvão rápida e eficientemente. +block.silicon-smelter.description = Reduz areia com carvão puro. Produz silício silicio. +block.kiln.description = Derrete chumbo e areia no composto conhecido como metavidro. Requer pequenas quantidades de energia. +block.plastanium-compressor.description = Produz plastânio usando petróleo e titânio. +block.phase-weaver.description = Produz tecido de fase usando tório radioativo e areia. Requer massivas quantidades de energia para funcionar. +block.alloy-smelter.description = Combina titânio, chumbo, silicio e cobre para produzir liga de surto. +block.cryofluidmixer.description = Mistura água e pó fino de titânio para produzir criofluido. Essencial para o uso do reator a tório. +block.blast-mixer.description = Quebra e mistura aglomerados de esporos com piratita para produzir composto de explosão. +block.pyratite-mixer.description = Mistura carvão, cobre e areia em piratita altamente inflamável +block.melter.description = Derrete sucata em escória para processamento posterior ou uso em torretas. +block.separator.description = Separa escória em seus minerais componentes, oferece o resultado refriado. +block.spore-press.description = Comprime cápsulas de esporos em petróleo. +block.pulverizer.description = Esmaga sucata em areia. Util quando esta em falta de areia natural. +block.coal-centrifuge.description = Solidifica petróleo em carvão. +block.incinerator.description = Se livra de itens em excesso ou liquidos. +block.power-void.description = Destroi qualquer energia que entre dentro. Apenas caixa de areia. +block.power-source.description = Infinitivamente da energia. Apenas caixa de areia. +block.item-source.description = Infinivamente da itens. Apenas caixa de areia. +block.item-void.description = Destroi qualquer item que entre sem requerir energia. Apenas caixa de areia. +block.liquid-source.description = Infinitivamente da Liquidos. Apenas caixa de areia. +block.copper-wall.description = Um bloco defensivo e barato.\nUtil para proteger o núcleo e torretas no começo. +block.copper-wall-large.description = Um bloco defensivo e barato.\nUtil para proteger o núcleo e torretas no começo.\nOcupa 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. +block.phase-wall-large.description = Um muro revestido com um composto especial baseado em tecido de fase. Desvia a maioria das balas no impacto.\nSOcupa múltiplos blocos. +block.surge-wall.description = Um bloco defensivo extremamente durável.\nSe carrega com eletricidade no contato com as balas, soltando-s aleatoriamente. +block.surge-wall-large.description = Um bloco defensivo extremamente durável.\nSe carrega com eletricidade no contato com as balas, soltando-s aleatoriamente.\nOcupa multiplos blocos. +block.door.description = Uma pequeda porta. Pode ser aberta e fechada ao tocar. +block.door-large.description = Uma grande porta. Pode ser aberta e fechada ao tocar.\nOcupa múltiplos blocos. +block.mender.description = Periodicamente repara blocos vizinhos. Mantem as defesas reparadas em e entre ondas.\nPode usar silício para aumentar o alcance e a eficiência. +block.mend-projector.description = Uma versão melhorada do reparador. Repara blocos vizinhos.\nPode usar tecido de fase para aumentar o alcance e a eficiência. +block.overdrive-projector.description = Aumenta a velocidade de construções vizinhas.\nPode usar tecido de fase para aumentar o alcance e a eficiência. +block.force-projector.description = Cria um campo de forca hexagonal em volta de si mesmo, Protegendo construções e unidades dentro de dano por balas. +block.shock-mine.description = Danifica inimigos em cima da mina. Quase invisivel ao inimigo. +block.conveyor.description = Bloco de transporte de item basico. Move os itens a frente e os deposita automaticamente em torretas ou construtores. Rotacionavel. +block.titanium-conveyor.description = Bloco de transporte de item avançado. Move itens mais rapidos que esteiras padrões. +block.junction.description = Funciona como uma ponte Para duas esteiras que estejam se cruzando. Util em situações que tenha duas esteiras diferentes carregando materiais diferentes para lugares diferentes. +block.bridge-conveyor.description = Bloco de transporte de itens avancado. Possibilita o transporte de itens acima de 3 blocos de construção ou paredes. +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.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. +block.mass-driver.description = Bloco de transporte de itens supremo. Coleta itens severos e atira eles em outro mass driver de uma longa distancia. +block.mechanical-pump.description = Uma bomba barata com baixa saída de líquidos, mas sem consumo de energia. +block.rotary-pump.description = Uma bomba avançada. Bombeia mais líquido, mas requer energia. +block.thermal-pump.description = A bomba final. +block.conduit.description = Bloco básico de transporte de líquidos. Move líquidos para a frente. Usado em conjunto com bombas e outros canos. +block.pulse-conduit.description = Bloco avancado de transporte de liquido. Transporta liquidos mais rápido e armazena mais que os canos padrões. +block.liquid-router.description = Aceita liquidos de uma direcão e os joga em 3 direções igualmente. Pode armazenar uma certa quantidade de liquido. Util para espalhar liquidos de uma fonte para multiplos alvos. +block.liquid-tank.description = Armazena grandes quantidades de liquido. Use quando a demanda de materiais não for constante ou para guardar itens para resfriar blocos vitais. +block.liquid-junction.description = Age como uma ponte para dois canos que se cruzam. Útil em situações em que há dois cano carregando liquidos diferentes até localizações diferentes. +block.bridge-conduit.description = Bloco de transporte de liquidos avancados. Possibilita o transporte de liquido sobre 3 blocos acima de construções ou paredes +block.phase-conduit.description = Bloco avancado de transporte de liquido. Usa energia para teleportar liquidos para outro cano de fase em uma grande distância. +block.power-node.description = Transmite energia para células conectadas. A célula vai receber energia ou alimentar qualquer bloco adjacente. +block.power-node-large.description = Uma célula de energia avançada com maior alcance e mais conexões. +block.surge-tower.description = Uma célula de energia com um extremo alcance mas com menos conexões disponíveis. +block.battery.description = Armazena energia em tempos de energia excedente. Libera energia em tempos de déficit. +block.battery-large.description = Guarda muito mais energia que uma beteria comum. +block.combustion-generator.description = Gera energia usando combustível ou petróleo. +block.thermal-generator.description = Gera uma quantidade grande de energia usando lava. +block.turbine-generator.description = Mais eficiente que o gerador de Combustão, Mas requer agua adicional. +block.differential-generator.description = Generates large amounts of energy. Utilizes the temperature difference between cryofluid and burning pyratite. +block.rtg-generator.description = Um Gerador termoelétrico de radioisótopos Que não precisa de refriamento Mas da muito menos energia que o reator de torio. +block.solar-panel.description = Gera pequenas quantidades de energia do sol. +block.solar-panel-large.description = Da 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 posto em blocos apropriados, retira itens em um ritmo lento e indefinitavamente. +block.pneumatic-drill.description = Uma broca improvisada que é mais rápida e capaz de processar materiais mais duros usando a pressão do ar +block.laser-drill.description = Possibilita a mineração ainda mais rapida usando tecnologia a laser, Mas requer poder adcionalmente torio radioativo pode ser recuperado com essa mineradora +block.blast-drill.description = A melhor mineradora. Requer muita energia. +block.water-extractor.description = Extrai água do chão. Use quando não tive nenhum lago proximo +block.cultivator.description = Cultiva o solo com agua para pegar bio materia. +block.oil-extractor.description = Usa altas quantidades de energia Para extrair oleo da areia. Use quando não tiver fontes de oleo por perto +block.core-shard.description = Primeira iteração da cápsula do núcleo. Uma vez destruida, o controle da região inteira é perdido. Não deixe isso acontecer. +block.core-foundation.description = A segunda versão do núcleo. Melhor armadura. Guarda mais recursos. +block.core-nucleus.description = A terceira e ultima iteração do núcleo. Extremamente bem armadurada. Guarda quantidades massivas de recursos. +block.vault.description = Carrega uma alta quantidade de itens. Usado para criar fontes Quando não tem uma necessidade constante de materiais. Um[LIGHT_GRAY] Descarregador[] pode ser usado para recuperar esses itens do container. +block.container.description = Carrega uma baixa quantidade de itens. Usado para criar fontes Quando não tem uma necessidade constante de materiais. Um[LIGHT_GRAY] Descarregador[] pode ser usado para recuperar esses itens do container. +block.unloader.description = Descarrega itens de um container, Descarrega em uma esteira ou diretamente em um bloco adjacente. O tipo de item que pode ser descarregado pode ser mudado clicando no descarregador. +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.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.ripple.description = Uma grande torre que atira simultaneamente. +block.cyclone.description = Uma grande torre de tiro rapido. +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. +block.draug-factory.description = Produz drones de mineração drawg. +block.spirit-factory.description = produz drones Spirit de reparo estrutural. +block.phantom-factory.description = Produz drones de construção avançados. +block.wraith-factory.description = Produz unidades rápidas hit-and-run (atacar e correr) +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.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. diff --git a/core/assets/bundles/bundle_pt_BR.properties b/core/assets/bundles/bundle_pt_BR.properties index 23d54036fe..5c7edb10df 100644 --- a/core/assets/bundles/bundle_pt_BR.properties +++ b/core/assets/bundles/bundle_pt_BR.properties @@ -3,6 +3,7 @@ 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 = 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 @@ -16,13 +17,29 @@ screenshot.invalid = Mapa grande demais, Potencialmente sem memória suficiente gameover = O núcleo foi destruído. gameover.pvp = O time[accent] {0}[] ganhou! highscore = [YELLOW]Novo recorde! - +copied = Copied. 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.replace = A schematic by that name already exists. Replace it? +schematic.import = Import Schematic... +schematic.exportfile = Export File +schematic.importfile = Import File +schematic.browseworkshop = Browse Workshop +schematic.copy = Copy to Clipboard +schematic.copy.import = Import from Clipboard +schematic.shareworkshop = Share on Workshop +schematic.flip = [accent][[{0}][]/[accent][[{1}][]: Flip Schematic +schematic.saved = Schematic saved. +schematic.delete.confirm = This schematic will be utterly eradicated. +schematic.rename = Rename Schematic +schematic.info = {0}x{1}, {2} blocks stat.wave = Hordas derrotadas:[accent] {0} stat.enemiesDestroyed = Inimigos Destruídos:[accent] {0} stat.built = Construções construídas:[accent] {0} @@ -31,7 +48,7 @@ stat.deconstructed = Construções desconstruídas:[accent] {0} stat.delivered = Recursos lançados: stat.rank = Rank Final: [accent]{0} launcheditems = [accent]Itens lançados - +launchinfo = [unlaunched][[LAUNCH] your core to obtain the items indicated in blue. map.delete = Certeza que quer deletar o mapa "[accent]{0}[]"? level.highscore = Melhor\npontuação: [accent] {0} level.select = Seleção de Fase @@ -43,11 +60,11 @@ database = banco do núcleo savegame = Salvar Jogo loadgame = Carregar Jogo joingame = Entrar no Jogo -addplayers = Adicionar/Remover Jogador customgame = Jogo Customi-/nzado newgame = Novo Jogo none = minimap = Mini-Mapa +position = Posição close = Fechar website = Site quit = Sair @@ -63,7 +80,30 @@ uploadingcontent = Fazendo upload do conteúdo uploadingpreviewfile = Fazendo upload do arquivo de pré visualização committingchanges = Enviando mudanças done = Feito - +feature.unsupported = Your device does not support this feature. +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 +mods.openfolder = Open Mod Folder +mod.enabled = [lightgray]Enabled +mod.disabled = [scarlet]Disabled +mod.disable = Disable +mod.delete.error = Unable to delete mod. File may be in use. +mod.missingdependencies = [scarlet]Missing dependencies: {0} +mod.nowdisabled = [scarlet]Mod '{0}' is missing dependencies:[accent] {1}\n[lightgray]These mods need to be downloaded first.\nThis mod will be automatically disabled. +mod.enable = Enable +mod.requiresrestart = The game will now close to apply the mod changes. +mod.reloadrequired = [scarlet]Reload Required +mod.import = Import Mod +mod.import.github = Import Github Mod +mod.remove.confirm = This mod will be deleted. +mod.author = [LIGHT_GRAY]Author:[] {0} +mod.missing = This save contains mods that you have recently updated or no longer have installed. Save corruption may occur. Are you sure you want to load it?\n[lightgray]Mods:\n{0} +mod.preview.missing = Before publishing this mod in the workshop, you must add an image preview.\nPlace an image named[accent] preview.png[] into the mod's folder and try again. +mod.folder.missing = Only mods in folder form can be published on the workshop.\nTo convert any mod into a folder, simply unzip its file into a folder and delete the old zip, then restart your game or reload your mods. about.button = Sobre name = Nome: noname = Escolha[accent] um nome[] primeiro. @@ -144,7 +184,6 @@ server.port = Porte: server.addressinuse = Senha em uso! server.invalidport = Numero de porta invalido! server.error = [crimson]Erro ao hospedar o servidor: [accent]{0} -save.old = Este save é para uma versão antiga do jogo, e não pode ser usado.\n\n[LIGHT_GRAY]Salvar versões antigas vai ser implementado na versão 4.0 completa save.new = Novo salvamento save.overwrite = Você tem certeza que quer sobrescrever este salvamento? overwrite = Salvar sobre @@ -178,6 +217,7 @@ warning = Aviso. confirm = Confirmar delete = Excluir view.workshop = Ver na oficina +workshop.listing = Edit Workshop Listing ok = OK open = Abrir customize = Customizar @@ -195,7 +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... 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 wave = [accent]Horda {0} wave.waiting = Horda em {0} wave.waveInProgress = [LIGHT_GRAY]Horda Em Progresso @@ -214,11 +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. -map.publish.error = Erro ao publicar o mapa: {0} +workshop.update = Update Item +workshop.error = Error fetching workshop details: {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 +changelog = Changelog (optional): eula = EULA do Steam -map.publish = Mapa publicado. -map.publishing = [accent]Publicando mapa... +missing = This item has been deleted or moved.\n[lightgray]The workshop listing has now been automatically un-linked. +publishing = [accent]Publishing... +publish.confirm = Are you sure you want to publish this?\n\n[lightgray]Make sure you agree to the Workshop EULA first, or your items will not show up! +publish.error = Error publishing item: {0} +steam.error = Failed to initialize Steam services.\nError: {0} editor.brush = Pincel editor.openin = Abrir no Editor editor.oregen = Geração de minério @@ -295,7 +347,6 @@ editor.overwrite = [accent]Aviso!\nIsso Substitui um mapa existente. editor.overwrite.confirm = [scarlet]Aviso![] Um mapa com esse nome já existe. Tem certeza que deseja substituir? editor.exists = Já existe um mapa com este nome. editor.selectmap = Selecione uma mapa para carregar: - toolmode.replace = Substituir toolmode.replace.description = Desenha apenas em blocos sólidos. toolmode.replaceall = Substituir tudo @@ -310,7 +361,6 @@ toolmode.fillteams = Encher times toolmode.fillteams.description = Muda o time do qual todos os blocos pertencem. toolmode.drawteams = Desenhar times toolmode.drawteams.description = Muda o time do qual o bloco pertence. - filters.empty = [LIGHT_GRAY]Sem filtro! Adicione um usando o botão abaixo. filter.distort = Distorcedor filter.noise = Geração aleatória @@ -342,7 +392,6 @@ filter.option.floor2 = Chão secundário filter.option.threshold2 = Margem secundária filter.option.radius = Raio filter.option.percentile = Percentual - width = Largura: height = Altura: menu = Menu @@ -351,7 +400,6 @@ campaign = Campa-/nnha load = Carregar save = Salvar fps = FPS: {0} -tps = TPS: {0} ping = Ping: {0}ms language.restart = Por favor, reinicie seu jogo para a tradução tomar efeito. settings = Configu-/nrações @@ -359,13 +407,13 @@ tutorial = Tutorial tutorial.retake = Refazer Tutorial editor = Editor mapeditor = Editor de mapa -donate = Doar - abandon = Abandonar abandon.text = Esta zona e todos os seus recursos serão perdidos para o inimigo. locked = Trancado complete = [LIGHT_GRAY]Completo: -zone.requirement = Horda {0} Na zona {1} +requirement.wave = Reach Wave {0} in {1} +requirement.core = Destroy Enemy Core in {0} +requirement.unlock = Unlock {0} resume = Resumir Zona:\n[LIGHT_GRAY]{0} bestwave = [LIGHT_GRAY]Melhor: {0} launch = Lançar @@ -376,18 +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 = Blocos Banidos +addall = Add All 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.complete = Horda {0} Alcançada:\nConfiguração do carregamento desbloqueado. +zone.config.unlocked = Loadout unlocked:[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 - connectfail = [crimson]Falha ao entrar no servidor: [accent]{0} error.unreachable = Servidor inalcançável. error.invalidaddress = Endereço inválido. @@ -398,7 +447,6 @@ error.mapnotfound = Arquivo de mapa não encontrado! error.io = Erro I/O de internet. error.any = Erro de rede desconhecido. error.bloom = Falha ao inicializar bloom.\nSeu dispositivo talvez não o suporte. - zone.groundZero.name = Marco zero zone.desertWastes.name = Ruínas do Deserto zone.craters.name = As crateras @@ -413,7 +461,6 @@ zone.saltFlats.name = Planícies de sal zone.impact0078.name = Impacto 0078 zone.crags.name = Penhascos zone.fungalPass.name = Passagem Fúngica - zone.groundZero.description = Uma ótima localização para começar de novo. Baixa ameaça inimiga. Poucos recursos.\nColete o máximo de chumbo e cobre possível.\nContinue! zone.frozenForest.description = Até aqui, perto das montanhas, os esporos se espalharam. As baixas temperaturas não podem contê-los para sempre.\n\nComeçe a busca por energia. Construa geradores à combustão. Aprenda a usar os reparadores (menders). zone.desertWastes.description = Estas ruínas são vastas, imprevisíveis, e cruzadas por estruturas abandonadas.\nCarvão está presente na região. O queime por energia, ou sintetize grafite.\n\n[lightgray]Este local de pouso não pode ser garantido. @@ -428,7 +475,6 @@ 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.data = Dados do jogo settings.reset = Restaurar Padrões @@ -440,17 +486,16 @@ 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.clearunlocks = Limpar liberados -settings.clearall = Limpar tudo paused = Pausado +clear = Clear +banned = [scarlet]Banido yes = Sim no = Não info.title = [accent]Informação error.title = [crimson]Ocorreu um Erro. error.crashtitle = Ocorreu um Erro -attackpvponly = [scarlet]Apenas disponivel em modo de ataque/JVJ blocks.input = Entrada -blocks.output = Saida +blocks.output = Saída blocks.booster = Booster block.unknown = [LIGHT_GRAY]??? blocks.powercapacity = Capacidade de Energia @@ -464,6 +509,7 @@ 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 @@ -483,9 +529,9 @@ blocks.inaccuracy = Imprecisão blocks.shots = Tiros blocks.reload = Tiros por segundo blocks.ammo = Munição - bar.drilltierreq = Broca melhor necessária. bar.drillspeed = Velocidade da broca: {0}/s +bar.pumpspeed = Pump Speed: {0}/s bar.efficiency = Eficiência: {0}% bar.powerbalance = Energia: {0} bar.powerstored = Armazenada: {0}/{1} @@ -498,7 +544,6 @@ bar.heat = Aquecimento bar.power = Poder bar.progress = Progresso da construção bar.spawned = Unidades: {0}/{1} - bullet.damage = [stat]{0}[lightgray] dano bullet.splashdamage = [stat]{0}[lightgray] Dano em área ~[stat] {1}[lightgray] Blocos bullet.incendiary = [stat]Incendiário @@ -510,7 +555,6 @@ bullet.freezing = [stat]Congelamento bullet.tarred = [stat]Grudento bullet.multiplier = [stat]{0}[lightgray]x multiplicador de munição bullet.reload = [stat]{0}[lightgray]x cadência de tiro - unit.blocks = Blocos unit.powersecond = Unidades de energia/segundo unit.liquidsecond = Unidades de líquido/segundo @@ -532,7 +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.animatedwater.name = Água animada setting.animatedshields.name = Escudos animados setting.antialias.name = Filtro suavizante[LIGHT_GRAY] (reinicialização requerida)[] @@ -553,6 +599,8 @@ setting.difficulty.insane = Insano setting.difficulty.name = Dificuldade setting.screenshake.name = Balanço da Tela 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 autosalvamento setting.seconds = {0} Segundos @@ -562,6 +610,7 @@ 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.musicvol.name = Volume da Música setting.ambientvol.name = Volume do ambiente setting.mutemusic.name = Desligar Música @@ -573,6 +622,8 @@ setting.publichost.name = Visibilidade do jogo público setting.chatopacity.name = Opacidade do chat setting.lasersopacity.name = Power Laser Opacity 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.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 setting.bloom.name = Bloom @@ -584,13 +635,16 @@ category.multiplayer.name = Multijogador command.attack = Atacar command.rally = Reunir command.retreat = Recuar -keybind.gridMode.name = Seleção de blocos -keybind.gridModeShift.name = Seleção de categoria +keybind.clear_building.name = Clear Building keybind.press = Pressione uma tecla... keybind.press.axis = Pressione uma Axis ou tecla... keybind.screenshot.name = Captura do mapa keybind.move_x.name = mover_x keybind.move_y.name = mover_y +keybind.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 = Alterar tela cheia keybind.select.name = selecionar keybind.diagonal_placement.name = Colocação diagonal @@ -602,12 +656,14 @@ 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.minimap.name = Minimapa keybind.dash.name = Correr keybind.chat.name = Conversa keybind.player_list.name = Lista_de_jogadores keybind.console.name = console keybind.rotate.name = Girar +keybind.rotateplaced.name = Rotate Existing (Hold) keybind.toggle_menus.name = Ativar menus keybind.chat_history_prev.name = Historico do chat anterior keybind.chat_history_next.name = Historico do proximo chat @@ -619,6 +675,7 @@ mode.survival.name = Sobrevivência mode.survival.description = O modo normal. Recursos limitados e hordas automáticas. mode.sandbox.name = Sandbox mode.sandbox.description = Recursos infinitos e sem tempo para ataques. +mode.editor.name = Editor mode.pvp.name = JXJ mode.pvp.description = Lutar contra outros jogadores locais. mode.attack.name = Ataque @@ -651,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 @@ -660,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 @@ -674,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 @@ -786,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 @@ -805,6 +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.message.name = Mensagem block.overflow-gate.name = Portão Sobrecarregado block.silicon-smelter.name = Fundidora de silicio @@ -878,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 @@ -915,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 = Fantasma unit.eruptor.name = Eruptor unit.chaos-array.name = Arraia do caos unit.eradicator.name = Erradicador @@ -923,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.[] @@ -941,7 +1002,6 @@ tutorial.deposit = Deposite itens em blocos arrastando da sua nave até o bloco. tutorial.waves = O[LIGHT_GRAY] inimigo[] se aproxima.\n\nDefenda seu núcleo por 2 hordas. Construa mais torretas. tutorial.waves.mobile = O[lightgray] inimigo[] se aproxima.\n\nDefenda seu núcleo por 2 hordas. Seu drone vai atirar nos inimigos automaticamente.\nConstrua mais torretas e brocas. Minere mais cobre. tutorial.launch = Quando você atinge uma horda específica, Você é capaz de[accent] lançar o núcleo[], deixando suas defesas para trás e[accent] obtendo todos os recursos em seu núcleo.[]\nEstes recursos podem ser usados para pesquisar novas tecnologias.\n\n[accent]Pressione o botão lançar. - item.copper.description = O material mais básico. Usado em todos os tipos de blocos. item.lead.description = Material de começo basico. usado extensivamente em blocos de transporte de líquidos e eletrônicos. item.metaglass.description = Composto de vidro super resistente. Extensivamente usado para distribuição e armazenagem de líquidos. @@ -1007,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. @@ -1026,6 +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.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. @@ -1048,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. @@ -1070,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. @@ -1091,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 b020766974..2e62e13817 100644 --- a/core/assets/bundles/bundle_ru.properties +++ b/core/assets/bundles/bundle_ru.properties @@ -3,12 +3,13 @@ credits = Авторы contributors = Переводчики и помощники discord = Присоединяйтесь к нашему Discord! link.discord.description = Официальный Discord-сервер Mindustry +link.reddit.description = Сабреддит Mindustry 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.itch.io.description = Страница itch.io с загрузками игры +link.google-play.description = Скачать для Android с Google Play link.wiki.description = Официальная вики linkfail = Не удалось открыть ссылку!\nURL-адрес был скопирован в буфер обмена. screenshot = Cкриншот сохранён в {0} @@ -16,35 +17,54 @@ screenshot.invalid = Карта слишком большая, возможно, gameover = Игра окончена gameover.pvp = [accent]{0}[] команда победила! highscore = [accent]Новый рекорд! +copied = Скопировано. load.sound = Звуки load.map = Карты load.image = Изображения load.content = Содержимое load.system = Система +load.mod = Модификации +schematic = Схема +schematic.add = Сохранить схему... +schematics = Схемы +schematic.replace = Схема с таким именем уже существует. Заменить её? +schematic.import = Импортировать схему... +schematic.exportfile = Экспортировать файл +schematic.importfile = Импортировать файл +schematic.browseworkshop = Просмотр Мастерской +schematic.copy = Скопировать в буфер обмена +schematic.copy.import = Вставить из буфера обмена +schematic.shareworkshop = Поделиться в Мастерской +schematic.flip = [accent][[{0}][]/[accent][[{1}][]: Отразить схему +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} +stat.rank = Финальный ранг: [accent]{0} launcheditems = [accent]Запущенные предметы +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 = Загрузить игру joingame = Сетевая игра -addplayers = Доб./Удалить игроков customgame = Пользовательская игра newgame = Новая игра none = <ничего> minimap = Мини-карта +position = Позиция close = Закрыть website = Веб-сайт quit = Выход @@ -60,6 +80,30 @@ uploadingcontent = Выгрузка содержимого uploadingpreviewfile = Выгрузка файла предпросмотра committingchanges = Внесение изменений done = Готово +feature.unsupported = Your device does not support this feature. +mods.alphainfo = Имейте в виду, что модификации находятся в альфа-версии и могут содержать много ошибок[]. Докладывайте о любых проблемах, которые Вы найдете в Mindustry Github или Discord. +mods.alpha = [accent](Альфа) +mods = Модификации +mods.none = [LIGHT_GRAY]Модификации не найдены! +mods.guide = Руководство по созданию модификаций +mods.report = Доложить об ошибке +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]Не найдены родительские модификации: {0} +mod.nowdisabled = [scarlet]Модификации '{0}' требуются родительские модификации:[accent] {1}\n[lightgray]Сначала нужно загрузить их.\nЭта модификация будет автоматически отключена. +mod.enable = Включить +mod.requiresrestart = Теперь игра закроется, чтобы применить изменения в модификациях. +mod.reloadrequired = [scarlet]Необходим перезапуск +mod.import = Импортировать модификацию +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Чтобы конвертировать любой мод в папку, просто извлеките его из архива и удалите старый архив .zip, затем перезапустите игру или перезагрузите модификации. about.button = Об игре name = Имя: noname = Для начала, придумайте[accent] себе имя[]. @@ -84,17 +128,17 @@ server.kicked.typeMismatch = Этот сервер не совместим с в server.kicked.playerLimit = Этот сервер заполнен. Дождитесь свободного слота. server.kicked.recentKick = Вас недавно выгнали.\nПодождите немного перед следующим подключением. server.kicked.nameInUse = На этом сервере есть кто-то с этим именем. -server.kicked.nameEmpty = Ваше имя должно содержать хотя бы один символ или цифру. +server.kicked.nameEmpty = Выбранное Вами имя недопустимо. server.kicked.idInUse = Вы уже на этом сервере! Соединение с двумя учетными записями не разрешено. server.kicked.customClient = Этот сервер не поддерживает пользовательские сборки. Загрузите официальную версию. server.kicked.gameover = Игра окончена! server.versions = Ваша версия:[accent] {0}[]\nВерсия сервера:[accent] {1}[] -host.info = Кнопка [accent]Сервер[] запускает сервер на порте [accent]6567[]. \nЛюбой пользователь в той же [lightgray]локальной сети или WiFi[] должен увидеть ваш сервер в своём списке серверов.\n\nЕсли Вы хотите, чтобы люди могли подключаться откуда угодно по IP, то требуется [accent]переадресация (проброс) портов[] и наличие [red]ВНЕШНЕГО[] WAN адреса (WAN адрес [red]НЕ должен[] начинаться с [red]10[][lightgray].x.x.x[], [red]100.64[][lightgray].x.x[], [red]172.16[][lightgray].x.x[], [red]192.168[][lightgray].x.x[], [red]127[][lightgray].x.x.x[])!\nКлиентам мобильных операторов нужно уточнять информацию в личном кабинете на сайте вашего оператора!\n\n[lightgray]Примечание: Если у кого-то возникают проблемы с подключением к вашей игре по локальной сети, убедитесь, что Вы разрешили доступ Mindustry к вашей локальной сети в настройках брандмауэра. Обратите внимание, что публичные сети иногда не позволяют обнаружение сервера. +host.info = Кнопка [accent]Сервер[] запускает сервер на порте [scarlet]6567[]. \nЛюбой пользователь в той же [lightgray]локальной сети или WiFi[] должен увидеть ваш сервер в своём списке серверов.\n\nЕсли Вы хотите, чтобы люди могли подключаться откуда угодно по IP, то требуется [accent]переадресация (проброс) портов[] и наличие [red]ВНЕШНЕГО[] WAN адреса (WAN адрес [red]НЕ должен[] начинаться с [red]10[][lightgray].x.x.x[], [red]100.64[][lightgray].x.x[], [red]172.16[][lightgray].x.x[], [red]192.168[][lightgray].x.x[], [red]127[][lightgray].x.x.x[])!\nКлиентам мобильных операторов нужно уточнять информацию в личном кабинете на сайте вашего оператора!\n\n[lightgray]Примечание: Если у кого-то возникают проблемы с подключением к вашей игре по локальной сети, убедитесь, что Вы разрешили доступ Mindustry к вашей локальной сети в настройках брандмауэра. Обратите внимание, что публичные сети иногда не позволяют обнаружение сервера. join.info = Здесь Вы можете ввести [accent]IP-адрес сервера[] для подключения или открыть [accent]локальную сеть[] для подключения к другим серверам.\nПоддерживаются оба многопользовательских режима: LAN и WAN.\n\n[lightgray]Примечание: это НЕ автоматический глобальный список серверов; если Вы хотите подключиться к кому-то по IP, вам нужно спросить у хоста его IP-адрес. hostserver = Запустить многопользовательский сервер invitefriends = Пригласить друзей hostserver.mobile = Запустить\nсервер -host = Сервер +host = Открыть сервер hosting = [accent]Открытие сервера… hosts.refresh = Обновить hosts.discovering = Поиск локальных игр @@ -108,7 +152,7 @@ trace.ip = IP: [accent]{0} trace.id = ID: [accent]{0} trace.mobile = Мобильный клиент: [accent]{0} trace.modclient = Пользовательский клиент: [accent]{0} -invalidid = Недопустимый идентификатор клиента! Отправьте отчёт об ошибке. +invalidid = Недопустимый уникальный идентификатор клиента! Отправьте отчёт об ошибке. server.bans = Блокировки server.bans.none = Заблокированных игроков нет! server.admins = Администраторы @@ -127,7 +171,7 @@ confirmunban = Вы действительно хотите разблокиро confirmadmin = Вы действительно хотите сделать этого игрока администратором? confirmunadmin = Вы действительно хотите убрать этого игрока из администраторов? joingame.title = Присоединиться к игре -joingame.ip = IP: +joingame.ip = Адрес: disconnect = Отключено. disconnect.error = Ошибка соединения. disconnect.closed = Соединение закрыто. @@ -140,7 +184,6 @@ server.port = Порт: server.addressinuse = Данный адрес уже используется! server.invalidport = Неверный номер порта! server.error = [crimson]Ошибка создания сервера. -save.old = Это сохранение для старой версии игры и больше не может использоваться.\n\n[lightgray]Совместимость сохранений будет реализована в финальной версии 4.0. save.new = Новое сохранение save.overwrite = Вы уверены, что хотите перезаписать\nэтот слот для сохранения? overwrite = Перезаписать @@ -161,7 +204,7 @@ selectslot = Выберите сохранение. slot = [accent]Слот {0} editmessage = Редактировать сообщение save.corrupted = [accent]Сохранённый файл повреждён или имеет недопустимый формат!\nЕсли Вы только что обновили свою игру, это, вероятно, из-за изменения формата сохранения, и [scarlet]не является[] ошибкой. -empty = <Пусто> +empty = <пусто> on = Вкл off = Выкл save.autosave = Автосохранение: {0} @@ -174,6 +217,7 @@ warning = Предупреждение. confirm = Подтверждение delete = Удалить view.workshop = Просмотреть в Мастерской +workshop.listing = Изменить информацию в Мастерской ok = ОК open = Открыть customize = Настроить правила @@ -184,21 +228,26 @@ back = Назад data.export = Экспортировать данные data.import = Импортировать данные data.exported = Данные экспортированы. -data.invalid = Эти игровые данные являются недействительными +data.invalid = Эти игровые данные являются недействительными. data.import.confirm = Импорт внешних данных сотрёт[scarlet] все[] ваши игровые данные.\n[accent]Это не может быть отменено![]\n\nКак только данные импортированы, ваша игра немедленно закроется. -classic.export = Экспортировать данные с классической версии? +classic.export = Экспортировать данные классической версии classic.export.text = [accent]Mindustry[] получил глобальное обновление.\nБыло обнаружено Классическое (версия 3.5 сборка 40) сохранение или карта. Вы хотите экспортировать эти сохранения в домашнюю папку вашего телефона, для использования в приложении Mindustry Classic? quit.confirm = Вы уверены, что хотите выйти? -quit.confirm.tutorial = Вы уверены, что знаете Что делаете?\nОбучение может быть повторно запущено через[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 = [lightgray]Волна через {0} wave.waveInProgress = [lightgray]Волна продолжается waiting = [lightgray]Ожидание… waiting.players = Ожидание игроков… -wave.enemies = [lightgray]{0} противник. осталось -wave.enemy = [lightgray]{0} противник остался +wave.enemies = Враги: [lightgray]{0} +wave.enemy = Остался [lightgray]{0} враг loadimage = Загрузить изображение saveimage = Сохранить изображение unknown = Неизвестно @@ -210,11 +259,18 @@ map.nospawn = Эта карта не имеет ни одного ядра, в map.nospawn.pvp = У этой карты нет вражеских ядер, в которых игрок может появиться! Добавьте[SCARLET] не оранжевое[] ядро на эту карту в редакторе. map.nospawn.attack = У этой карты нет вражеских ядер для атаки игроком! Добавьте[SCARLET] красное[] ядро на эту карту в редакторе. map.invalid = Ошибка загрузки карты: повреждённый или недопустимый файл карты. -map.publish.error = Ошибка при публикации карты: {0} -map.publish.confirm = Вы уверены, что хотите опубликовать эту карту?\n\n[lightgray]Убедитесь, что вы согласны с EULA Мастерской, иначе ваши карты не будут отображаться! +workshop.update = Обновить содержимое +workshop.error = Ошибка загрузки информации из Мастерской: {0} +map.publish.confirm = Вы уверены, что хотите опубликовать эту карту?\n\n[lightgray]Убедитесь, что Вы согласны с EULA Мастерской, иначе ваши карты не будут отображаться! +workshop.menu = Выберите, что Вы хотите сделать с этим предметом. +workshop.info = Информация о предмете +changelog = Список изменений (необязательно): eula = Лицензионное соглашение Steam с конечным пользователем -map.publish = Карта опубликована. -map.publishing = [accent]Отправка карты… +missing = Этот предмет был удалён или перемещён.\n[lightgray]Публикация в Мастерской была автоматически удалена. +publishing = [accent]Отправка... +publish.confirm = Вы уверены, что хотите опубликовать этот предмет?\n\n[lightgray]Убедитесь, что Вы согласны с EULA Мастерской, иначе ваши предметы не будут отображаться! +publish.error = Ошибка отправки предмета: {0} +steam.error = Failed to initialize Steam services.\nError: {0} editor.brush = Кисть editor.openin = Открыть в редакторе editor.oregen = Генерация руд @@ -227,9 +283,9 @@ editor.waves = Волны: editor.rules = Правила: editor.generation = Генерация: editor.ingame = Редактировать в игре -editor.publish.workshop = Опубликовать в Мастерской Steam +editor.publish.workshop = Опубликовать в Мастерской editor.newmap = Новая карта -workshop = Workshop +workshop = Мастерская waves.title = Волны waves.remove = Удалить waves.never = <никогда> @@ -344,7 +400,6 @@ campaign = Кампания load = Загрузить save = Сохранить fps = FPS: {0} -tps = TPS: {0} ping = Пинг: {0}мс language.restart = Перезагрузите игру, чтобы языковые настройки вступили в силу. settings = Настройки @@ -352,12 +407,13 @@ tutorial = Обучение tutorial.retake = Перепройти обучение editor = Редактор mapeditor = Редактор карт -donate = Пожертво\nвать abandon = Покинуть abandon.text = Эта зона и все её ресурсы будут отданы противнику. locked = Заблокировано complete = [lightgray]Достигнута: -zone.requirement = Волна {0} в зоне {1} +requirement.wave = Достигните {0} волны в зоне {1} +requirement.core = Уничтожьте вражеское ядро в зоне {0} +requirement.unlock = Разблокируйте {0} resume = Возобновить зону:\n[lightgray]{0} bestwave = [lightgray]Лучшая волна: {0} launch = < ЗАПУСК > @@ -368,11 +424,13 @@ launch.confirm = Это [accent]запустит[] все ресурсы в Ва launch.skip.confirm = Если Вы пропустите сейчас, то Вы не сможете произвести [accent]запуск[] до более поздних волн. uncover = Раскрыть configure = Конфигурация выгрузки -configure.locked = [lightgray]Возможность разблокировки выгрузки ресурсов будет доступна на {0}-ой волне. -configure.invalid = Amount must be a number between 0 and {0}. +bannedblocks = Запрещённые блоки +addall = Добавить всё +configure.locked = [lightgray]Разблокировка выгрузки ресурсов: {0}. +configure.invalid = Количество должно быть числом между 0 и {0}. zone.unlocked = Зона «[lightgray]{0}» теперь разблокирована. zone.requirement.complete = Вы достигли {0}-ой волны,\nУсловия для зоны «{1}» выполнены. -zone.config.complete = Вы достигли {0}-ой волны,Возможность выгрузки ресурсов теперь разблокирована. +zone.config.unlocked = Loadout unlocked:[lightgray]\n{0} zone.resources = [lightgray]Обнаруженные ресурсы: zone.objective = [lightgray]Цель: [accent]{0} zone.objective.survival = Выжить @@ -405,11 +463,11 @@ zone.crags.name = Скалы zone.fungalPass.name = Грибной перевал zone.groundZero.description = Оптимальная локация для повторных игр. Низкая вражеская угроза. Немного ресурсов.\nСоберите как можно больше свинца и меди.\nДвигайтесь дальше. zone.frozenForest.description = Даже здесь, ближе к горам, споры распространились. Холодные температуры не могут сдерживать их вечно.\n\nНачните вкладываться в энергию. Постройте генераторы внутреннего сгорания. Научитесь пользоваться регенератором. -zone.desertWastes.description = Эти пустоши огромны, непредсказуемы и пронизаны заброшенными секторальными структурами.\nВ регионе представлен уголь. Сожгите его для энергии, или синтезируйте в графит.\n\n[lightgray]Место посадки здесь может не быть гарантировано. +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.craters.description = Вода скопилась в этом кратере, реликвии времён старых войн. Восстановите область. Соберите песок. Выплавите метастекло. Качайте воду для охлаждения турелей и буров. +zone.ruinousShores.description = Мимо пустошей проходит береговая линия. Когда-то здесь располагался массив береговой обороны. Не так много от него осталось. Только самые базовые оборонительные сооружения остались невредимыми, всё остальное превратилось в металлолом.\nПродолжайте экспансию вовне. Переоткройте для себя технологии. +zone.stainedMountains.description = Дальше, вглубь местности, лежат горы, еще не запятнанные спорами.\nИзвлеките изобилие титана в этой области. Узнайте, как его использовать.\n\nВражеское присутствие здесь сильнее. Не дайте им времени для отправки своих сильнейших боевых единиц. zone.overgrowth.description = Эта заросшая область находится ближе к источнику спор.\nВраг организовал здесь форпост. Постройте боевые единицы «Титан». Уничтожьте его. Верните то, что было потеряно. zone.tarFields.description = Окраина зоны нефтедобычи, между горами и пустыней. Один из немногих районов с полезными запасами дёгтя.\nХотя область заброшенна, в этой области присутствуют поблизости некоторые опасные вражеские силы. Не стоит их недооценивать.\n\n[lightgray]Исследуйте технологию переработки нефти, если возможно. zone.desolateRift.description = Чрезвычайно опасная зона. Обилие ресурсов, но мало места. Высокий риск разрушения. Эвакуироваться нужно как можно скорее. Не расслабляйтесь во время больших перерывов между вражескими атаками. @@ -428,15 +486,14 @@ settings.graphics = Графика settings.cleardata = Очистить игровые данные… settings.clear.confirm = Вы действительно хотите очистить свои данные?\nЭто нельзя отменить! settings.clearall.confirm = [scarlet]ОСТОРОЖНО![]\nЭто сотрёт все данные, включая сохранения, карты, прогресс кампании и настройки управления.\nПосле того как Вы нажмете [accent][ОК][], игра уничтожит все данные и автоматически закроется. -settings.clearunlocks = Очистить прогресс кампании -settings.clearall = Очистить всё paused = [accent]< Пауза > +clear = Очистить +banned = [scarlet]Запрещено yes = Да no = Нет info.title = Информация error.title = [crimson]Произошла ошибка error.crashtitle = Произошла ошибка -attackpvponly = [scarlet]Доступно только в Атаке/PvP режимах blocks.input = Вход blocks.output = Выход blocks.booster = Ускоритель @@ -452,6 +509,7 @@ blocks.shootrange = Радиус действия blocks.size = Размер blocks.liquidcapacity = Вместимость жидкости blocks.powerrange = Диапазон передачи энергии +blocks.powerconnections = Max Connections blocks.poweruse = Потребляет энергии blocks.powerdamage = Энергия/урон blocks.itemcapacity = Вместимость предметов @@ -473,6 +531,7 @@ blocks.reload = Выстрелы/секунду blocks.ammo = Боеприпасы bar.drilltierreq = Требуется лучший бур bar.drillspeed = Скорость бурения: {0}/s +bar.pumpspeed = Pump Speed: {0}/s bar.efficiency = Эффективность: {0}% bar.powerbalance = Энергия: {0}/с bar.powerstored = Накоплено: {0}/{1} @@ -484,17 +543,17 @@ bar.liquid = Жидкости bar.heat = Нагрев bar.power = Энергия bar.progress = Прогресс строительства -bar.spawned = Боев. ед.: {0}/{1} +bar.spawned = Единицы: {0}/{1} bullet.damage = [stat]{0}[lightgray] урона bullet.splashdamage = [stat]{0}[lightgray] урона в радиусе ~[stat] {1}[lightgray] блоков bullet.incendiary = [stat]зажигательный bullet.homing = [stat]самонаводящийся -bullet.shock = [stat]ЭМИ -bullet.frag = [stat]разрывной +bullet.shock = [stat]шоковый +bullet.frag = [stat]осколочный bullet.knockback = [stat]{0}[lightgray] отдачи bullet.freezing = [stat]замораживающий -bullet.tarred = [stat]горючий -bullet.multiplier = [stat]{0}[lightgray]x количество боеприпасов +bullet.tarred = [stat]замедляющий, горючий +bullet.multiplier = [stat]{0}[lightgray]x множитель боеприпасов bullet.reload = [stat]{0}[lightgray]x скорость стрельбы unit.blocks = блоки unit.powersecond = единиц энергии/секунду @@ -517,11 +576,13 @@ category.shooting = Стрельба category.optional = Дополнительные улучшения setting.landscape.name = Только альбомный (горизонтальный) режим setting.shadows.name = Тени +setting.blockreplace.name = Automatic Block Suggestions setting.linear.name = Линейная фильтрация +setting.hints.name = Подсказки setting.animatedwater.name = Анимированная вода setting.animatedshields.name = Анимированные щиты setting.antialias.name = Сглаживание[lightgray] (требует перезапуска)[] -setting.indicators.name = Отображать индикаторы расположения союзников и врагов +setting.indicators.name = Индикаторы расположения союзников и врагов setting.autotarget.name = Автозахват цели setting.keyboard.name = Мышь+Управление с клавиатуры setting.touchscreen.name = Сенсорное управление @@ -538,7 +599,9 @@ setting.difficulty.insane = Безумная setting.difficulty.name = Сложность: setting.screenshake.name = Тряска экрана setting.effects.name = Эффекты -setting.sensitivity.name = Чувствительность контроллёра +setting.destroyedblocks.name = Display Destroyed Blocks +setting.conveyorpathfinding.name = Conveyor Placement Pathfinding +setting.sensitivity.name = Чувствительность контроллера setting.saveinterval.name = Интервал сохранения setting.seconds = {0} секунд setting.fullscreen.name = Полноэкранный режим @@ -546,7 +609,8 @@ setting.borderlesswindow.name = Безрамочное окно[lightgray] (мо setting.fps.name = Показывать FPS setting.vsync.name = Вертикальная синхронизация setting.pixelate.name = Пикселизация[lightgray] (отключает анимации) -setting.minimap.name = Показать миникарту +setting.minimap.name = Отображать мини-карту +setting.position.name = Отображать координаты игрока setting.musicvol.name = Громкость музыки setting.ambientvol.name = Громкость окружения setting.mutemusic.name = Заглушить музыку @@ -556,8 +620,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[accent] Любой игрок сможет присоединиться к Вашем играм.\n[lightgray]Позже, это можно будет изменить в Настройки→Игра→Общедоступность игры. +public.beta = Имейте в виду, что бета-версия игры не может делать игры публичными. uiscale.reset = Масштаб пользовательского интерфейса был изменён.\nНажмите «ОК» для подтверждения этого масштаба.\n[scarlet]Возврат настроек и выход через[accent] {0}[] секунд… uiscale.cancel = Отменить & Выйти setting.bloom.name = Свечение @@ -569,13 +635,16 @@ category.multiplayer.name = Сетевая игра command.attack = Атаковать command.rally = Точка сбора command.retreat = Отступить -keybind.gridMode.name = Выбрать блок -keybind.gridModeShift.name = Выбрать категорию +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 = Выбрать область +keybind.schematic_menu.name = Меню схем +keybind.schematic_flip_x.name = Отразить схему по оси X +keybind.schematic_flip_y.name = Отразить схему по оси Y keybind.fullscreen.name = Полноэкранный режим keybind.select.name = Выбор/Выстрел keybind.diagonal_placement.name = Диагональное размещение @@ -587,23 +656,26 @@ keybind.zoom_hold.name = Управление масштабом keybind.zoom.name = Приблизить/Отдалить keybind.menu.name = Меню keybind.pause.name = Пауза +keybind.pause_building.name = Приостановить/возобновить строительство keybind.minimap.name = Мини-карта keybind.dash.name = Полёт/Ускорение keybind.chat.name = Чат keybind.player_list.name = Список игроков keybind.console.name = Консоль -keybind.rotate.name = Вращение +keybind.rotate.name = Вращать +keybind.rotateplaced.name = Повернуть существующее (зажать) keybind.toggle_menus.name = Переключение меню keybind.chat_history_prev.name = Пред. история чата keybind.chat_history_next.name = След. история чата keybind.chat_scroll.name = Прокрутка чата keybind.drop_unit.name = Сбросить боев. ед. -keybind.zoom_minimap.name = Масштабировать миникарту +keybind.zoom_minimap.name = Масштабировать мини-карту mode.help.title = Описание режимов mode.survival.name = Выживание mode.survival.description = Обычный режим. Необходимо добывать ресурсы, а волны наступают автоматически.\n[gray]Требуются точки появления врагов на карте для игры. mode.sandbox.name = Песочница mode.sandbox.description = Бесконечные ресурсы и нет таймера волн. [gray]Можно самим вызвать волну. +mode.editor.name = Редактор mode.pvp.name = PvP mode.pvp.description = Боритесь против других игроков.\n[gray]Для игры требуется как минимум 2 ядра разного цвета на карте. mode.attack.name = Атака @@ -650,7 +722,7 @@ item.silicon.name = Кремний item.plastanium.name = Пластаний item.phase-fabric.name = Фазовая ткань item.surge-alloy.name = Кинетический сплав -item.spore-pod.name = Споровой стручок +item.spore-pod.name = Споровый стручок item.sand.name = Песок item.blast-compound.name = Взрывчатая смесь item.pyratite.name = Пиротит @@ -675,7 +747,7 @@ mech.omega-mech.ability = Укреплённое бронирование mech.dart-ship.name = Дротик mech.dart-ship.weapon = Бластер mech.javelin-ship.name = Джавелин -mech.javelin-ship.weapon = Разрывные ракеты +mech.javelin-ship.weapon = Ракетный залп mech.javelin-ship.ability = Разрядный ускоритель mech.trident-ship.name = Трезубец mech.trident-ship.weapon = Бомбовый отсек @@ -771,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 = Ториевая стена @@ -790,6 +864,7 @@ block.junction.name = Перекрёсток block.router.name = Маршрутизатор block.distributor.name = Распределитель block.sorter.name = Сортировщик +block.inverted-sorter.name = Инвертированный сортировщик block.message.name = Сообщение block.overflow-gate.name = Избыточный затвор block.silicon-smelter.name = Кремниевый плавильный завод @@ -798,7 +873,7 @@ block.pulverizer.name = Измельчитель block.cryofluidmixer.name = Мешалка криогенной жидкости block.melter.name = Плавильня block.incinerator.name = Мусоросжигатель -block.spore-press.name = Споровой пресс +block.spore-press.name = Споровый пресс block.separator.name = Отделитель block.coal-centrifuge.name = Угольная центрифуга block.power-node.name = Силовой узел @@ -813,7 +888,7 @@ block.impact-reactor.name = Импульсный реактор block.mechanical-drill.name = Механический бур block.pneumatic-drill.name = Пневматический бур block.laser-drill.name = Лазерный бур -block.water-extractor.name = Гидроконденсатор +block.water-extractor.name = Гидронасос block.cultivator.name = Культиватор block.dart-mech-pad.name = Реконструктор меха «Альфа» block.delta-mech-pad.name = Реконструктор меха «Дельта» @@ -881,7 +956,7 @@ block.arc.name = Дуга block.rtg-generator.name = Радиоизотопный термоэлектрический генератор block.spectre.name = Спектр block.meltdown.name = Испепелитель -block.container.name = Склад +block.container.name = Контейнер block.launch-pad.name = Стартовая площадка block.launch-pad-large.name = Большая стартовая площадка team.blue.name = Синяя @@ -907,25 +982,26 @@ unit.eradicator.name = Искоренитель 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Выберите[accent] механический бур[]. Разместите его на медной жиле нажатием.\n[accent]Нажатие по правой кнопке[] прервёт строительство. +tutorial.intro = Вы начали[scarlet] обучение по Mindustry.[]\nНачните с [accent]добычи меди[]. Нажмите на медную жилу возле Вашего ядра, чтобы сделать это.\n\n[accent]{0}/{1} меди +tutorial.intro.mobile = Вы начали[scarlet] обучение по Mindustry.[]\nПроведите по экрану, чтобы двигаться.\n[accent] Сведите или разведите 2 пальца для []изменения масштаба.\nНачните с [accent]добычи меди[]. Приблизьтесь к ней, затем нажмите на медную жилу возле Вашего ядра, чтобы сделать это.\n\n[accent]{0}/{1} меди +tutorial.drill = Ручная добыча не является эффективной.\n[accent]Буры []могут добывать автоматически.\nНажмите на вкладку с изображением сверла снизу справа.\nВыберите[accent] механический бур[]. Разместите его на медной жиле нажатием.\n[accent]Нажатие по правой кнопке[] прервёт строительство. [accent]Зажмите Ctrl и покрутите колесо мыши[]для приближения или отдаления камеры. tutorial.drill.mobile = Ручная добыча не является эффективной.\n[accent]Буры []могут добывать автоматически.\nНажмите на вкладку с изображением сверла снизу справа.\nВыберите[accent] механический бур[]. \nРазместите его на медной жиле нажатием, затемм нажмите [accent] белую галку[] ниже, чтобы подтвердить построение выделенного.\nНажмите [accent] кнопку X[], чтобы отменить размещение. -tutorial.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.blockinfo = Каждый блок имеет разные характеристики. Каждая дрель может добывать определенные руды.\nЧтобы узнать информацию о блоке и о его характеристиках,[accent] нажмите на «?», когда он выбран в меню строительства.[]\n\n[accent]Сейчас, узнайте характеристики механического бура.[] +tutorial.conveyor = [accent]Конвейеры[] используются для транспортировки ресуров в ядро.\nСделайте линию конвейеров от бура к ядру\n[accent]Удерживайте левую кнопку мыши, чтобы разместить в линию.[]\nУдерживайте[accent] CTRL[] при постройке линии блоков, чтобы сделать её диагональной\n\n[accent]Разместите 2 конвейера в линию и доставьте предметы в ядро. +tutorial.conveyor.mobile = [accent]Конвейеры[] используются для транспортировки ресурсов в ядро\nСделайте линию конвейеров от бура к ядру\n[accent]Сделайте линию, удерживая палец несколько секунд в том месте, в котором Вы хотите начать линию,[] и перетяните его в нужном направлении.[accent]Разместите 2 конвейера в линию и доставьте предметы в ядро. +tutorial.turret = Как только предмет попадает в ядро, его можно использовать в строительстве.\nИмейте в виду, что не все предметы могут быть использованы в строительстве.\nПредметы, которые нелья использовать для стоительства, такие как[accent] уголь[] или[accent] металлолом[], не могут быть транспортированы в ядро.\nЗащитные структуры нужно строить для отражения[lightgray] противников[].\nПостройте[accent] двойную турель[] возле Вашей базы. +tutorial.drillturret = Двойным турелям нужна [accent]медь []в качестве боеприпасов.\nРазместите бур рядом с турелью.\nПроведите конвейеры к турели, чтобы снабдить её медью.\n\n[accent]Боеприпасов доставлено: 0/1 tutorial.pause = Во время битвы Вы можете[accent] приостановить игру.[]\nВы можете планировать строительство, когда игра стоит на паузе.\n\n[accent]Нажмите ПРОБЕЛ для приостановки игры. -tutorial.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.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 = [lightgray]Противники[] приближаются.\n\nЗащитите ядро от двух волн.[accent] Нажмите левую кнопку мыши[], чтобы выстрелить.\nПостройте больше турелей и буров. Добудьте больше меди. -tutorial.waves.mobile = [lightgray]Противники[] приближаются.\n\nЗащитите ядро от двух волн. Ваш мех будет автоматически атаковать противника.\nПостройте больше турелей и буров. Добудьте больше меди. -tutorial.launch = Когда Вы достигаете некоторых волн, Вы можете осуществить[accent] запуск ядра[], оставив базу и[accent] перенести ресурсы из ядра.[]\nЭти ресурсы могут быть использованы для изучения новых технологий.\n\n[accent]Нажмите кнопку запуска. +tutorial.waves = [lightgray]Противники[] приближаются.\n\nЗащитите ядро от двух волн. Используйте[accent] левую кнопку мыши[] для стрельбы.\nПостройте больше турелей и буров. Добудьте больше меди. +tutorial.waves.mobile = [lightgray]Противники[] приближаются.\n\nЗащитите ядро от двух волн. Ваш корабль будет автоматически атаковать противника.\nПостройте больше турелей и буров. Добудьте больше меди. +tutorial.launch = Когда Вы достигаете определенной волны, Вы можете осуществить[accent] запуск ядра[], оставив базу и[accent] перенести ресурсы из ядра.[]\nЭти ресурсы могут быть использованы для изучения новых технологий.\n\n[accent]Нажмите кнопку запуска. item.copper.description = Самый основной строительный материал. Широко используется во всех типах блоков. item.lead.description = Основной стартовый материал. Широко используется в электронике и блоках для транспортировки жидкостей. item.metaglass.description = Сверхпрочный сплав стекла. Широко используется для распределения и хранения жидкости. @@ -944,8 +1020,8 @@ item.blast-compound.description = Нестабильный соединение, item.pyratite.description = Чрезвычайно огнеопасное вещество, используемое в зажигательном оружии. liquid.water.description = Самая полезная жидкость. Обычно используется для охлаждения машин и переработки отходов. liquid.slag.description = Всевозможно различные типы расплавленного металла, смешанные вместе. Может быть разделен на составляющие его минералы или распылён на вражеских боевые единицы в качестве оружия. -liquid.oil.description = Жидкость, используемая в производстве современных материалов. Может быть превращена в уголь в качестве топлива или распылён и подожжён как оружие. -liquid.cryofluid.description = Инертная, неедкая жидкость, созданная из воды и титана. Обладает чрезвычайно высокой пропускной способностью. Широко используется в качестве охлаждающей жидкости. +liquid.oil.description = Жидкость, используемая в производстве современных материалов. Может быть превращена в уголь в качестве топлива или распылена и подожжена как оружие. +liquid.cryofluid.description = Инертная, неедкая жидкость, созданная из воды и титана. Обладает чрезвычайно высокой теплоёмкостью. Широко используется в качестве охлаждающей жидкости. mech.alpha-mech.description = Стандартный управляемый мех. Основан на «Кинжале», с улучшенной броней и строительными возможностями. Имеет больший урон, чем «Дротик». mech.delta-mech.description = Быстрый, легко бронированный мех, созданный для ударов «атакуй и беги». Наносит мало урона по строениям, но может очень быстро убить большие группы вражеских орудий с помощью дуговых молний. mech.tau-mech.description = Мех поддержки. Ремонтирует союзные блоки просто стреляя в них. Может лечить союзников в радиусе его ремонтирующей способности. @@ -954,34 +1030,34 @@ mech.dart-ship.description = Стандартный управляемый ко mech.javelin-ship.description = Корабль для тактики «атакуй и беги». Сначала он медленный, но позже может разгоняться до огромных скоростей и летать над аванпостами противника, нанося большой урон молниями и ракетами. mech.trident-ship.description = Тяжёлый бомбардировщик, построенный для строительства и уничтожения вражеских укреплений. Достаточно хорошо бронированный. mech.glaive-ship.description = Большой хорошо бронированный боевой корабль. Оборудован зажигательным повторителем. Очень манёвренный. -unit.draug.description = Примитивный добывающий дрон. Дёшево производить. Расходуемый. Автоматически добывает медь и свинец в непосредственной близости. Поставляет добытые ресурсы в ближайшее ядро. +unit.draug.description = Примитивный добывающий дрон. Дешёвый в производстве. Расходуемый. Автоматически добывает медь и свинец в непосредственной близости. Поставляет добытые ресурсы в ближайшее ядро. unit.spirit.description = Модифицированный «Драугр», предназначенный для ремонта вместо добычи ресурсов. Автоматически ремонтирует любые поврежденные блоки в области. unit.phantom.description = Продвинутый дрон. Следует за пользователями. Помогает в строительстве блоков. unit.dagger.description = Самый основной наземный мех. Дешёвый в производстве. Очень сильный при использовании толпами. -unit.crawler.description = Наземный блок, состоящий из урезанной рамы с высоким взрывчатым веществом, прикрепленным сверху. Не особо прочный. Взрывается при контакте с врагами. +unit.crawler.description = Наземная единица, состоящая из урезанной рамы с прикреплённой сверху мощной взрывчаткой. Не особо прочная. Взрывается при контакте с врагами. unit.titan.description = Продвинутый, бронированный наземный юнит. Атакует как наземные, так и воздушные цели. Оборудован двумя миниатюрными огнеметами класса «Обжигатель». unit.fortress.description = Тяжёлый артиллерийский мех. Оснащен двумя модифицированными пушками типа «Град» для штурма дальних объектов и подразделений противника. unit.eruptor.description = Тяжёлый мех, предназначенный для разрушения строений. Выстреливает поток шлака по вражеским укреплениям, плавит их и поджигает летучие вещества. -unit.wraith.description = Быстрый перехватчик. Целевые генераторы энергии. -unit.ghoul.description = Тяжёлый ковровой бомбардировщик. Проникает через вражеские структуры, нацеливаясь на критическую инфраструктуру. +unit.wraith.description = Быстрый перехватчик. Нацелен на генераторы энергии. +unit.ghoul.description = Тяжёлый ковровый бомбардировщик. Проникает через вражеские структуры, нацеливаясь на критическую инфраструктуру. unit.revenant.description = Тяжёлый, парящий массив, который вооружён ракетами. block.message.description = Сохраняет сообщение. Используется для связи между союзниками. block.graphite-press.description = Сжимает куски угля в чистые листы графита. block.multi-press.description = Обновлённая версия графитовой печати. Использует воду и энергию для быстрой и эффективной переработки угля. block.silicon-smelter.description = Соединяет песок с чистым углем. Производит кремний. block.kiln.description = Выплавляет песок и свинец в соединение, известному как метастекло. Требуется небольшое количество энергии для запуска. -block.plastanium-compressor.description = Производит пластиний из нефти и титана. +block.plastanium-compressor.description = Производит пластаний из нефти и титана. block.phase-weaver.description = Синтезирует фазовую ткань из радиоактивного тория и песка. Требуется огромное количество энергии. block.alloy-smelter.description = Объединяет титан, свинец, кремний и медь для производства кинетического сплава. -block.cryofluidmixer.description = Смешивает воду и мелкий титановый порошок титана в криогеннную жидкость. Необходим для использования в ториевом реакторе. +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.coal-centrifuge.description = Отвердевает нефть в куски угля. +block.incinerator.description = Испаряет любой лишний предмет или жидкость, которую он получает. block.power-void.description = Аннулирует всю энергию, введенную в него. Только песочница. block.power-source.description = Бесконечно вводит энергию. Только песочница. block.item-source.description = Бесконечно выводит элементы. Только песочница. @@ -991,92 +1067,95 @@ block.copper-wall.description = Дешёвый защитный блок.\nПо block.copper-wall-large.description = Дешёвый защитный блок.\nПолезно для защиты ядра и турелей в первые несколько волн.\nРазмещается на нескольких плитках. block.titanium-wall.description = Умеренно сильный защитный блок.\nОбеспечивает умеренную защиту от врагов. block.titanium-wall-large.description = Умеренно сильный защитный блок.\nОбеспечивает умеренную защиту от врагов.\nРазмещается на нескольких плитках. +block.plastanium-wall.description = Специальный тип стены, который поглощает электрические разряды и блокирует автоматическое соединение между силовыми узлами.\nРазмещается на нескольких плитках. +block.plastanium-wall-large.description = A special type of wall that absorbs electric arcs and blocks automatic power node connections.\nSpans multiple tiles. block.thorium-wall.description = Сильный защитный блок.\nХорошая защита от врагов. block.thorium-wall-large.description = Сильный защитный блок.\nХорошая защита от врагов.\nРазмещается на нескольких плитках. block.phase-wall.description = Стена, покрытая специальным фазовым отражающим составом. Отражает большинство пуль при ударе. block.phase-wall-large.description = Стена, покрытая специальным фазовым отражающим составом. Отражает большинство пуль при ударе.\nРазмещается на нескольких плитках. block.surge-wall.description = Очень прочный защитный блок.\nНакапливает заряд при контакте с пулей, выпуская его случайным образом. block.surge-wall-large.description = Очень прочный защитный блок.\nНакапливает заряд при контакте с пулей, выпуская его случайным образом.\nРазмещается на нескольких плитках. -block.door.description = Маленькая дверь. Можно открыть или закрыть, нажав. -block.door-large.description = Большая дверь. Можно открыть и закрыть, коснувшись.\nОткрывает несколько плитках. +block.door.description = Маленькая дверь. Можно открыть или закрыть нажатием. +block.door-large.description = Большая дверь. Можно открыть и закрыть нажатием.\nРазмещается на нескольких плитках. block.mender.description = Периодически ремонтирует блоки в непосредственной близости. Сохраняет средства защиты, восстановленные между волнами.\nОпционально использует кремний для увеличения дальности и эффективности. block.mend-projector.description = Обновлённая версия Регенератора. Ремонт блоков в непосредственной близости.\nОпционально использует фазовую ткань для увеличения дальности и эффективности. block.overdrive-projector.description = Увеличивает скорость близлежащих зданий.\nОпционально использует фазовую ткань для увеличения дальности и эффективности. -block.force-projector.description = Создает вокруг себя шестиугольное силовое поле, защищая здания и подразделения внутри от повреждений.\nПерегревается, если слишком много повреждений нанесено. Опционально требуется охлаждающая жидкость для предотвращения перегрева. Фазовая ткань может быть использована для увеличения размера щита. -block.shock-mine.description = Наносит урон врагам, наступающим на мину. Почти невидим для врага. -block.conveyor.description = Базовый элемент транспортного блока. Перемещает предметы вперед и автоматически складывает их в блоки. Вращающийся. -block.titanium-conveyor.description = Расширенный транспортный блок элемента. Перемещает предметы быстрее, чем стандартные конвейеры. +block.force-projector.description = Создает вокруг себя шестиугольное силовое поле, защищая здания и подразделения внутри от повреждений.\nПерегревается, если нанесено слишком большое количество повреждений. Опционально требуется охлаждающая жидкость для предотвращения перегрева. Фазовая ткань может быть использована для увеличения размера щита. +block.shock-mine.description = Наносит урон врагам, наступающим на мину. Почти невидима для врага. +block.conveyor.description = Базовый элемент транспортного блока. Перемещает предметы вперед и автоматически складывает их в блоки. Можно повернуть. +block.titanium-conveyor.description = Расширенный транспортный блок. Перемещает предметы быстрее, чем стандартные конвейеры. block.junction.description = Действует как мост для двух пересекающихся конвейерных лент. Полезно в ситуациях, когда два разных конвейера перевозят разные материалы в разные места. -block.bridge-conveyor.description = Улучшенный транспортный блок элемента. Позволяет транспортировать предметы по 3 плиткам любой местности или здания. -block.phase-conveyor.description = Улучшенный транспортный блок элемента. Использует энергию для телепортации предметов на подключенный фазовый конвейер по нескольким плиткам. -block.sorter.description = Сортировка элементов. Если элемент соответствует выбору, он может пройти. В противном случае элемент выводится слева и справа. -block.router.description = Принимает элементы в одном направлении и выводит их до 3 других направлений в равной степени. Полезно для разделения материалов из одного источника на несколько целей.\n\n[scarlet]Никогда не используйте рядом с заводами и т.п., так как маршрутизатор будет забит выходными предметами.[] +block.bridge-conveyor.description = Улучшенный транспортный блок. Позволяет транспортировать предметы по 3 плиткам любой местности или здания. +block.phase-conveyor.description = Улучшенный транспортный блок. Использует энергию для телепортации предметов на подключенный фазовый конвейер по нескольким плиткам. +block.sorter.description = Сортирует предметы. Если предмет соответствует выбору, он может пройти. В противном случае предмет выводится слева и справа. +block.inverted-sorter.description = Работает с предметами так же, как и стандартный сортировщик, но выводит выбранный предмет по бокам, а не прямо. +block.router.description = Принимает предмет в одном направлении и выводит их до 3 других направлений в равной степени. Полезно для разделения материалов из одного источника на несколько целей.\n\n[scarlet]Никогда не используйте рядом с заводами и т.п., так как маршрутизатор будет забит выходными предметами.[] block.distributor.description = Расширенный маршрутизатор. Разделение элементов до 7 других направлений в равной степени. -block.overflow-gate.description = Комбинированный разделитель и маршрутизатор. выводится только влево и вправо, если передний путь заблокирован. -block.mass-driver.description = Конечный транспортный блок элемента. Собирает несколько предметов и затем стреляет в них другому массовому водителю на большом расстоянии. Требуется сила для работы. +block.overflow-gate.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.bridge-conduit.description = Расширенный блок транспортировки жидкости. Позволяет транспортировать жидкости над 3 плитками любой местности или здания. +block.phase-conduit.description = Расширенный блок транспортировки жидкости. Использует энергию для телепортации жидкостей в подключенный фазовый канал над несколькими плиткам. block.power-node.description = Передает питание на подключенные узлы. Узел будет получать питание или поставлять питание на любые соседние блоки. block.power-node-large.description = Усовершенствованный силовой узел с большей дальностью и большим количеством соединений. -block.surge-tower.description = Очень дальний узел питания с меньшим количеством доступных соединений. +block.surge-tower.description = Силовой узел с очень большим радиусом действия, но меньшим количеством доступных соединений. block.battery.description = Накапливает энергию как буфер во времена избытка энергии. Выводит энергию во времена дефицита. block.battery-large.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.thorium-reactor.description = Генерирует значительное количество энергии из тория. Требует постоянного охлаждения. Взорвётся с большой силой при недостаточном количестве охлаждающей жидкости. Выходная энергия зависит от наполненности, при этом базовая энергия генерируется на полную мощность. block.impact-reactor.description = Усовершенствованный генератор, способный создавать огромное количество энергии с максимальной эффективностью. Требуется значительное количество энергии для запуска процесса. -block.mechanical-drill.description = ДешёВый бур. При размещении на соответствующих плитках медленные предметы выводятся бесконечно. Способен добывать только медь, свинец и уголь. -block.pneumatic-drill.description = Улучшенный бур, способная добывать титан. Добывает в более быстром темпе, чем механический бур. +block.mechanical-drill.description = Дешёвый бур. При размещении на соответствующих плитках, предметы бесконечно выводятся в медленном темпе. Способен добывать только медь, свинец и уголь. +block.pneumatic-drill.description = Улучшенный бур, способный добывать титан. Добывает быстрее, чем механический бур. block.laser-drill.description = Позволяет сверлить еще быстрее с помощью лазерной технологии, но требует энергии. Способен добывать торий. -block.blast-drill.description = Конечный бур. Требует большого количества энергии. +block.blast-drill.description = Конечный бур. Требует большое количества энергии. block.water-extractor.description = Выкачивает подземные воды. Используется в местах, где нет поверхностных вод. -block.cultivator.description = Выращивает крошечные концентрации спор в атмосфере в готовые к употреблению споры. -block.oil-extractor.description = Использует большое количество энергии, песка и воды для бурения на нефть. +block.cultivator.description = Выращивает крошечные концентрации спор в атмосфере в готовые к использованию споры. +block.oil-extractor.description = Использует большое количество энергии, песка и воды для бурения, добывая нефть. block.core-shard.description = Первая итерация капсулы ядра. После уничтожения весь контакт с регионом теряется. Не позволяйте этому случиться. -block.core-foundation.description = Вторая версия ядра. Лучше бронированное. Хранит больше ресурсов. -block.core-nucleus.description = Третья и последняя итерация капсулы ядра. Очень хорошо бронированный. Хранит огромное количество ресурсов. +block.core-foundation.description = Вторая версия ядра. Лучше бронировано. Хранит больше ресурсов. +block.core-nucleus.description = Третья и последняя итерация капсулы ядра. Очень хорошо бронировано. Хранит огромное количество ресурсов. block.vault.description = Хранит большое количество предметов каждого типа. Блок разгрузчика может быть использован для извлечения предметов из хранилища. block.container.description = Хранит небольшое количество предметов каждого типа. Блок разгрузчика может быть использован для извлечения элементов из контейнера. block.unloader.description = Выгружает предметы из контейнера, хранилища или ядра на конвейер или непосредственно в соседний блок. Тип элемента, который необходимо Выгрузить, можно изменить, коснувшись. block.launch-pad.description = Запускает партии предметов без необходимости запуска ядра. block.launch-pad-large.description = Улучшенная версия стартовой площадки. Хранит больше предметов. Запускается чаще. -block.duo.description = Маленькая, дешёвая башня. Полезна против наземных юнитов. -block.scatter.description = Важная противовоздушная башня. Распыляет комки свинца или металлолома на вражеские подразделения. -block.scorch.description = Сжигает любых наземных врагов рядом с ним. Высокоэффективен на близком расстоянии. -block.hail.description = Маленькая дальнобойная артиллерийская башня. -block.wave.description = Башня среднего размера. Стреляет потоками жидкости по врагам. Автоматически тушит пожары при подаче воды. -block.lancer.description = Лазерная турель среднего размера. Заряжает и зажигает мощные лучи энергии. -block.arc.description = Небольшая электрическая башня ближнего радиуса действия. Выстреливает дуги электричества по врагам. -block.swarmer.description = Ракетная башня среднего размера. Атакует как воздушных, так и наземных врагов. Запускает самонаводящиеся ракеты. -block.salvo.description = Большая, более продвинутая версия башни «Двойная». Выпускает быстрые залпы из пуль по врагу. -block.fuse.description = Большая энергетическая башня ближнего радиуса действия. Выпускает три пронизывающих луча по ближайшим врагам. -block.ripple.description = Очень мощная артиллерийская башня. Стреляет скопления снарядов по врагам на большие расстояния. -block.cyclone.description = Большая противовоздушная и наземная башня. Выстреливает взрывными глыбами зенитных орудий в ближайшие подразделения. +block.duo.description = Маленькая, дешёвая турель. Полезна против наземных юнитов. +block.scatter.description = Основная противовоздушная турель. Распыляет куски свинца или металлолома на вражеские подразделения. +block.scorch.description = Сжигает любых наземных врагов рядом с ним. Высокоэффективна на близком расстоянии. +block.hail.description = Маленькая дальнобойная артиллерийская турель. +block.wave.description = Турель среднего размера. Стреляет потоками жидкости по врагам. Автоматически тушит пожары при подаче воды. +block.lancer.description = Лазерная турель среднего размера. Заряжает и стреляет мощными лучами энергии. +block.arc.description = Небольшая электрическая турель ближнего радиуса действия. Выстреливает дуги электричества по врагам. +block.swarmer.description = Ракетная турель среднего размера. Атакует как воздушных, так и наземных врагов. Запускает самонаводящиеся ракеты. +block.salvo.description = Большая, более продвинутая версия двойной турели. Выпускает быстрые залпы из пуль по врагу. +block.fuse.description = Большая энергетическая турель ближнего радиуса действия. Выпускает три пронизывающих луча по ближайшим врагам. +block.ripple.description = Очень мощная артиллерийская турель. Стреляет скоплениями снарядов по врагам на большие расстояния. +block.cyclone.description = Большая противовоздушная и наземная турель. Стреляет разрывными снарядами по ближайшим врагам. block.spectre.description = Массивная двуствольная пушка. Стреляет крупными бронебойными пулями по воздушным и наземным целям. block.meltdown.description = Массивная лазерная пушка. Заряжает и стреляет постоянным лазерным лучом в ближайших врагов. Требуется охлаждающая жидкость для работы. -block.command-center.description = Командует перемещениями боевых единиц по всей карте.\nУказывает подразделениям [accent]собираться[] вокруг командного центра, [accent]атаковать[] вражеское ядро или [accent]отступать[] к ядру/фабрике. Когда вражеское ядро не представлено, единицы будут патрулировать при команде [accent]атаки[]. -block.draug-factory.description = Производит добывающих дронов -block.spirit-factory.description = Производит дронов, которые помогают в строительстве. +block.command-center.description = Командует перемещениями боевых единиц по всей карте.\nУказывает подразделениям [accent]собираться[] вокруг командного центра, [accent]атаковать[] вражеское ядро или [accent]отступать[] к ядру/фабрике. Если вражеское ядро отсутствует, единицы будут патрулировать при команде [accent]атаки[]. +block.draug-factory.description = Производит добывающих дронов. +block.spirit-factory.description = Производит дронов, которые ремонтируют постройки. block.phantom-factory.description = Производит улучшенных дронов, которые помогают в строительстве. block.wraith-factory.description = Производит быстрые и летающие боевые единицы. block.ghoul-factory.description = Производит тяжёлых ковровых бомбардировщиков. block.revenant-factory.description = Производит тяжёлые летающие боевые единицы. block.dagger-factory.description = Производит основных наземных боевые единиц. block.crawler-factory.description = Производит быстрых саморозрушающихся боевые единиц. -block.titan-factory.description = Производит продвинутые бронированне боевые единицы. +block.titan-factory.description = Производит продвинутые бронированные боевые единицы. block.fortress-factory.description = Производит тяжёлые артиллерийские боевые единицы. block.repair-point.description = Непрерывно лечит ближайший поврежденную боевую единицу или мех, находящийся рядом. block.dart-mech-pad.description = Обеспечивает превращение в базовый атакующий мех. \nИспользуйте, нажав, стоя на нём. diff --git a/core/assets/bundles/bundle_se.properties b/core/assets/bundles/bundle_sv.properties similarity index 86% rename from core/assets/bundles/bundle_se.properties rename to core/assets/bundles/bundle_sv.properties index 90329f5052..1f67cabd56 100644 --- a/core/assets/bundles/bundle_se.properties +++ b/core/assets/bundles/bundle_sv.properties @@ -1,91 +1,135 @@ credits.text = Skapad av [ROYAL]Anuken[] - [SKY]anukendev@gmail.com[] credits = Credits -contributors = Translators and Contributors -discord = Join the Mindustry Discord! -link.discord.description = The official Mindustry Discord chatroom -link.github.description = Game source code -link.changelog.description = List of update changes +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 -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.wiki.description = Official Mindustry wiki -linkfail = Failed to open link!\nThe URL has been copied to your clipboard. -screenshot = Screenshot saved to {0} -screenshot.invalid = Map too large, potentially not enough memory for screenshot. +link.trello.description = Officiell Trello tavla för plannerade funktioner +link.itch.io.description = itch.io sida med nedladdningar +link.google-play.description = Mindustry på Google Play +link.wiki.description = Officiell wiki-sida för Mindustry +linkfail = Kunde inte öppna länken!\nURL:en har kopierats till ditt urklipp. +screenshot = Skärmdump har sparats till {0} +screenshot.invalid = Karta för stor, potentiellt inte tillräckligt minne för . gameover = Game Over gameover.pvp = The[accent] {0}[] team is victorious! highscore = [accent]Nytt rekord! -load.sound = Sounds -load.map = Maps -load.image = Images -load.content = Content +copied = Kopierad. +load.sound = Ljud +load.map = Kartor +load.image = Bilder +load.content = Innehåll load.system = System -stat.wave = Waves Defeated:[accent] {0} -stat.enemiesDestroyed = Enemies Destroyed:[accent] {0} +load.mod = Mods +schematic = Schematic +schematic.add = Save Schematic... +schematics = Schematics +schematic.replace = A schematic by that name already exists. Replace it? +schematic.import = Import Schematic... +schematic.exportfile = Export File +schematic.importfile = Import File +schematic.browseworkshop = Browse Workshop +schematic.copy = Copy to Clipboard +schematic.copy.import = Import from Clipboard +schematic.shareworkshop = Share on Workshop +schematic.flip = [accent][[{0}][]/[accent][[{1}][]: Flip Schematic +schematic.saved = Schematic saved. +schematic.delete.confirm = This schematic will be utterly eradicated. +schematic.rename = Rename Schematic +schematic.info = {0}x{1}, {2} blocks +stat.wave = Besegrade vågor:[accent] {0} +stat.enemiesDestroyed = Besegrade fiender:[accent] {0} stat.built = Buildings Built:[accent] {0} stat.destroyed = Buildings Destroyed:[accent] {0} stat.deconstructed = Buildings Deconstructed:[accent] {0} stat.delivered = Resources Launched: stat.rank = Final Rank: [accent]{0} launcheditems = [accent]Launched Items +launchinfo = [unlaunched][[LAUNCH] your core to obtain the items indicated in blue. map.delete = Are you sure you want to delete the map "[accent]{0}[]"? level.highscore = High Score: [accent]{0} -level.select = Level Select +level.select = Nivåval level.mode = Spelläge: showagain = Visa inte igen nästa session coreattack = < Kärnan är under attack! > -nearpoint = [[ [scarlet]LÄMNA SLÄPPZONEN OMEDELBART[] ]\ndu dör snart -database = Core Database +nearpoint = [[ [scarlet]LÄMNA DROPPZONEN OMEDELBART[] ]\ndu dör snart +database = Kärndatabas savegame = Spara Spel loadgame = Importera Spel -joingame = Join Game -addplayers = Add/Remove Players +joingame = Gå med spel customgame = Anpassat Spel newgame = Nytt Spel none = minimap = Minikarta +position = Position close = Stäng -website = Website -quit = Avsulta -save.quit = Save & Quit +website = Webbsida +quit = Avsluta +save.quit = Spara & lämna maps = Kartor -maps.browse = Browse Maps +maps.browse = Bläddra bland kartor continue = Fortsätt -maps.none = [lightgray]No maps found! -invalid = Invalid -preparingconfig = Preparing Config -preparingcontent = Preparing Content -uploadingcontent = Uploading Content -uploadingpreviewfile = Uploading Preview File +maps.none = [lightgray]Inga kartor hittade! +invalid = Ogiltig +preparingconfig = Förbereder konfiguration +preparingcontent = Förbereder innehåll +uploadingcontent = Laddar upp innehåll +uploadingpreviewfile = Laddar upp förhandsgranskningsfil committingchanges = Comitting Changes -done = Done +done = Klar +feature.unsupported = Your device does not support this feature. +mods.alphainfo = Keep in mind that mods are in alpha, and[scarlet] may be very buggy[].\nReport any issues you find to the Mindustry Github or Discord. +mods.alpha = [accent](Alpha) +mods = Mods +mods.none = [LIGHT_GRAY]No mods found! +mods.guide = Modding Guide +mods.report = Report Bug +mods.openfolder = Open Mod Folder +mod.enabled = [lightgray]Enabled +mod.disabled = [scarlet]Disabled +mod.disable = Disable +mod.delete.error = Unable to delete mod. File may be in use. +mod.missingdependencies = [scarlet]Missing dependencies: {0} +mod.nowdisabled = [scarlet]Mod '{0}' is missing dependencies:[accent] {1}\n[lightgray]These mods need to be downloaded first.\nThis mod will be automatically disabled. +mod.enable = Enable +mod.requiresrestart = The game will now close to apply the mod changes. +mod.reloadrequired = [scarlet]Reload Required +mod.import = Import Mod +mod.import.github = Import Github Mod +mod.remove.confirm = This mod will be deleted. +mod.author = [LIGHT_GRAY]Author:[] {0} +mod.missing = This save contains mods that you have recently updated or no longer have installed. Save corruption may occur. Are you sure you want to load it?\n[lightgray]Mods:\n{0} +mod.preview.missing = Before publishing this mod in the workshop, you must add an image preview.\nPlace an image named[accent] preview.png[] into the mod's folder and try again. +mod.folder.missing = Only mods in folder form can be published on the workshop.\nTo convert any mod into a folder, simply unzip its file into a folder and delete the old zip, then restart your game or reload your mods. about.button = Om name = Namn: noname = Välj ett[accent] namn[] först. filename = Filnamn: -unlocked = New content unlocked! +unlocked = Nytt innehåll upplåst! completed = [accent]Avklarad -techtree = Tech Tree -research.list = [lightgray]Research: -research = Research -researched = [lightgray]{0} researched. +techtree = Teknologiträd +research.list = [lightgray]Forskning: +research = Forskning +researched = [lightgray]{0} framforskat. players = {0} spelare online players.single = {0} spelare online server.closing = [accent]Stänger server... -server.kicked.kick = You have been kicked from the server! -server.kicked.whitelist = You are not whitelisted here. +server.kicked.kick = Du har blivit kickad från servern! +server.kicked.whitelist = Du är inte vitlistad här. server.kicked.serverClose = Server stängd. -server.kicked.vote = You have been vote-kicked. Goodbye. -server.kicked.clientOutdated = Outdated client! Uppdatera ditt spel! -server.kicked.serverOutdated = Outdated server! Ask the host to update! +server.kicked.vote = Du har blivit utröstad. Hejdå. +server.kicked.clientOutdated = Utdaterad klient! Uppdatera ditt spel! +server.kicked.serverOutdated = Utdaterad server! Be värden att uppdatera! server.kicked.banned = Du är bannad från servern. server.kicked.typeMismatch = This server is not compatible with your build type. -server.kicked.playerLimit = This server is full. Wait for an empty slot. -server.kicked.recentKick = You have been kicked recently.\nWait before connecting again. +server.kicked.playerLimit = Den här servern är full. Var god vänta på en öppning. +server.kicked.recentKick = Du har blivit kickad nyligen.\nVänta innan du kopplar igen. server.kicked.nameInUse = Någon med det namnet finns redan\npå servern. server.kicked.nameEmpty = Ditt namn är ogiltigt. -server.kicked.idInUse = You are already on this server! Connecting with two accounts is not permitted. +server.kicked.idInUse = Du är redan på den här servern! Det är inte tillåtet att koppla med två konton. server.kicked.customClient = This server does not support custom builds. Ladda ned en officiell verision. server.kicked.gameover = Game over! server.versions = Your version:[accent] {0}[]\nServer version:[accent] {1}[] @@ -103,7 +147,7 @@ server.refreshing = Refreshing server hosts.none = [lightgray]No local games found! host.invalid = [scarlet]Can't connect to host. trace = Trace Player -trace.playername = Player name: [accent]{0} +trace.playername = Spelarnamn: [accent]{0} trace.ip = IP: [accent]{0} trace.id = Unique ID: [accent]{0} trace.mobile = Mobile Client: [accent]{0} @@ -128,9 +172,9 @@ confirmadmin = Are you sure you want to make this player an admin? confirmunadmin = Are you sure you want to remove admin status from this player? joingame.title = Join Game joingame.ip = Adress: -disconnect = Disconnected. -disconnect.error = Connection error. -disconnect.closed = Connection closed. +disconnect = Frånkopplad. +disconnect.error = Kopplingsfel. +disconnect.closed = Koppling stängd. disconnect.timeout = Timed out. disconnect.data = Failed to load world data! cantconnect = Unable to join game ([accent]{0}[]). @@ -140,14 +184,13 @@ server.port = Port: server.addressinuse = Address already in use! server.invalidport = Ogiltigt portnummer! server.error = [crimson]Error hosting server: [accent]{0} -save.old = This save is for an older version of the game, and can no longer be used.\n\n[lightgray]Save backwards compatibility will be implemented in the full 4.0 release. -save.new = New Save +save.new = Ny sparfil save.overwrite = Are you sure you want to overwrite\nthis save slot? overwrite = Skriv över -save.none = No saves found! +save.none = Inga sparfiler hittade! saveload = [accent]Sparar... -savefail = Failed to save game! -save.delete.confirm = Are you sure you want to delete this save? +savefail = Kunde inte spara spelet! +save.delete.confirm = Är du säker att du vill radera den här sparfilen? save.delete = Radera save.export = Exportera save.import.invalid = [accent]This save is invalid! @@ -157,9 +200,9 @@ save.import = Importera save.newslot = Namn: save.rename = Byt namn save.rename.text = Nytt namn: -selectslot = Select a save. +selectslot = Välj sparfil. slot = [accent]Slot {0} -editmessage = Edit Message +editmessage = Redigera meddelande save.corrupted = [accent]Save file corrupted or invalid!\nIf you have just updated your game, this is probably a change in the save format and [scarlet]not[] a bug. empty = on = På @@ -174,6 +217,7 @@ warning = Varning. confirm = Confirm delete = Radera view.workshop = View In Workshop +workshop.listing = Edit Workshop Listing ok = OK open = Öppna customize = Customize Rules @@ -181,9 +225,9 @@ cancel = Avbryt openlink = Öppna Länk copylink = Kopiera Länk back = Tillbaka -data.export = Export Data -data.import = Import Data -data.exported = Data exported. +data.export = Exportera data +data.import = Importera data +data.exported = Data exporterad. data.invalid = This isn't valid game data. data.import.confirm = Importing external data will erase[scarlet] all[] your current game data.\n[accent]This cannot be undone![]\n\nOnce the data is imported, your game will exit immediately. classic.export = Exportera Classic-Data @@ -191,16 +235,21 @@ classic.export.text = Sparad data från Classic (v3.5 build 40) har hittats. Vil quit.confirm = Är du säker på att du vill avsluta? quit.confirm.tutorial = Are you sure you know what you're doing?\nThe tutorial can be re-taken in[accent] Settings->Game->Re-Take Tutorial.[] loading = [accent]Läser in... +reloading = [accent]Reloading Mods... saving = [accent]Sparar... +cancelbuilding = [accent][[{0}][] to clear plan +selectschematic = [accent][[{0}][] to select+copy +pausebuilding = [accent][[{0}][] to pause building +resumebuilding = [scarlet][[{0}][] to resume building wave = [accent]Våg {0} wave.waiting = [lightgray]Våg om {0} -wave.waveInProgress = [lightgray]Våg pågår +wave.waveInProgress = [lightgray]Wave in progress waiting = [lightgray]Väntar... waiting.players = Väntar på spelare... -wave.enemies = [lightgray]{0} Fiender Återstår -wave.enemy = [lightgray]{0} Fiende Återstår -loadimage = Load Image -saveimage = Save Image +wave.enemies = [lightgray]{0} Fiender kvarvarande +wave.enemy = [lightgray]{0} Fiende kvar +loadimage = Ladda bild +saveimage = Spara bild unknown = Okänd custom = Anpassad builtin = Inbyggd @@ -210,15 +259,22 @@ map.nospawn = This map does not have any cores for the player to spawn in! Add a map.nospawn.pvp = This map does not have any enemy cores for player to spawn into! Add[SCARLET] non-orange[] cores to this map in the editor. map.nospawn.attack = This map does not have any enemy cores for player to attack! Add[SCARLET] red[] cores to this map in the editor. map.invalid = Error loading map: corrupted or invalid map file. -map.publish.error = Error publishing map: {0} +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 -map.publish = Map published. -map.publishing = [accent]Publishing map... +missing = This item has been deleted or moved.\n[lightgray]The workshop listing has now been automatically un-linked. +publishing = [accent]Publishing... +publish.confirm = Are you sure you want to publish this?\n\n[lightgray]Make sure you agree to the Workshop EULA first, or your items will not show up! +publish.error = Error publishing item: {0} +steam.error = Failed to initialize Steam services.\nError: {0} editor.brush = Pensel -editor.openin = Öppna I Redigeraren -editor.oregen = Malmgenerering -editor.oregen.info = Malmgenerering: +editor.openin = Open In Editor +editor.oregen = Ore Generation +editor.oregen.info = Ore Generation: editor.mapinfo = Map Info editor.author = Skapare: editor.description = Beskrivning: @@ -344,7 +400,6 @@ campaign = Campaign load = Load save = Spara fps = FPS: {0} -tps = TPS: {0} ping = Ping: {0}ms language.restart = Starta om spelet för att språkinställningarna ska ta effekt. settings = Inställningar @@ -352,14 +407,15 @@ tutorial = Tutorial tutorial.retake = Ta Om Tutorial editor = Editor mapeditor = Map Editor -donate = Donera abandon = Ge upp abandon.text = Zonen och alla dess resurser förloras till fienden. locked = Låst complete = [lightgray]Nå: -zone.requirement = Våg {0} i zon {1} -resume = Fortsätt Zon:\n[lightgray]{0} -bestwave = [lightgray]Bästa Våg: {0} +requirement.wave = Reach Wave {0} in {1} +requirement.core = Destroy Enemy Core in {0} +requirement.unlock = Unlock {0} +resume = Resume Zone:\n[lightgray]{0} +bestwave = [lightgray]Best Wave: {0} launch = < LAUNCH > launch.title = Launch Successful launch.next = [lightgray]next opportunity at wave {0} @@ -368,11 +424,13 @@ launch.confirm = This will launch all resources in your core.\nYou will not be a launch.skip.confirm = If you skip now, you will not be able to launch until later waves. uncover = Uncover configure = Configure Loadout -configure.locked = [lightgray]Unlock configuring loadout: Wave {0}. +bannedblocks = Banned Blocks +addall = Add All +configure.locked = [lightgray]Unlock configuring loadout: {0}. configure.invalid = Amount must be a number between 0 and {0}. zone.unlocked = [lightgray]{0} unlocked. zone.requirement.complete = Wave {0} reached:\n{1} zone requirements met. -zone.config.complete = Wave {0} reached:\nLoadout config unlocked. +zone.config.unlocked = Loadout unlocked:[lightgray]\n{0} zone.resources = [lightgray]Resources Detected: zone.objective = [lightgray]Objective: [accent]{0} zone.objective.survival = Survive @@ -428,15 +486,14 @@ settings.graphics = Grafik settings.cleardata = Rensa Data... settings.clear.confirm = Are you sure you want to clear this data?\nWhat is done cannot be undone! settings.clearall.confirm = [scarlet]WARNING![]\nThis will clear all data, including saves, maps, unlocks and keybinds.\nOnce you press 'ok' the game will wipe all data and automatically exit. -settings.clearunlocks = Clear Unlocks -settings.clearall = Rensa Allt paused = [accent]< Pausat > +clear = Clear +banned = [scarlet]Banned yes = Ja no = Nej info.title = Info error.title = [crimson]An error has occured error.crashtitle = An error has occured -attackpvponly = [scarlet]Only available in Attack/PvP modes blocks.input = Inmatning blocks.output = Utmatning blocks.booster = Booster @@ -452,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 @@ -473,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} @@ -517,7 +576,9 @@ 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 setting.animatedshields.name = Animerade Sköldar setting.antialias.name = Antialias[lightgray] (requires restart)[] @@ -538,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 @@ -547,6 +610,7 @@ setting.fps.name = Show FPS setting.vsync.name = VSync setting.pixelate.name = Pixellera[lightgray] (disables animations) setting.minimap.name = Visa Minikarta +setting.position.name = Show Player Position setting.musicvol.name = Musikvolym setting.ambientvol.name = Ambient Volume setting.mutemusic.name = Stäng Av Musik @@ -557,7 +621,9 @@ setting.savecreate.name = Auto-Create Saves setting.publichost.name = Public Game Visibility setting.chatopacity.name = Chattgenomskinlighet setting.lasersopacity.name = Power Laser Opacity -setting.playerchat.name = Visa Chatt +setting.playerchat.name = Visa +public.confirm = Do you want to make your game public?\n[accent]Anyone will be able to join your games.\n[lightgray]This can be changed later in Settings->Game->Public Game Visibility. +public.beta = Note that beta versions of the game cannot make public lobbies. uiscale.reset = UI-skalan har ändrats.\nTryck "OK" för att använda den här skalan.\n[scarlet]Avslutar och återställer om[accent] {0}[] sekunder... uiscale.cancel = Avbryt och Avsluta setting.bloom.name = Bloom @@ -569,13 +635,16 @@ category.multiplayer.name = Multiplayer command.attack = Attack command.rally = Rally command.retreat = Retreat -keybind.gridMode.name = Block Select -keybind.gridModeShift.name = Category Select +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.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 = Toggle Fullscreen keybind.select.name = Select/Shoot keybind.diagonal_placement.name = Diagonal Placement @@ -587,12 +656,14 @@ keybind.zoom_hold.name = Zoom Hold keybind.zoom.name = Zoom 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.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 @@ -602,9 +673,10 @@ keybind.zoom_minimap.name = Zoom minimap mode.help.title = Description of modes mode.survival.name = Överlevnad mode.survival.description = The normal mode. Limited resources and automatic incoming waves.\n[gray]Requires enemy spawns in the map to play. -mode.sandbox.name = Sandbox +mode.sandbox.name = Sandlåda mode.sandbox.description = Infinite resources and no timer for waves. -mode.pvp.name = PvP +mode.editor.name = Redigerare +mode.pvp.name = Spelare mot spelare mode.pvp.description = Fight against other players locally.\n[gray]Requires at least 2 differently-colored cores in the map to play. mode.attack.name = Attack mode.attack.description = Destroy the enemy's base. No waves.\n[gray]Requires a red core in the map to play. @@ -771,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 @@ -780,7 +854,7 @@ block.door-large.name = Stor Dörr block.duo.name = Duo block.scorch.name = Scorch block.scatter.name = Scatter -block.hail.name = Hail +block.hail.name = Hagel block.lancer.name = Lancer block.conveyor.name = Conveyor block.titanium-conveyor.name = Titanium Conveyor @@ -790,14 +864,15 @@ block.junction.name = Korsning block.router.name = Router block.distributor.name = Distributor block.sorter.name = Sorterare -block.message.name = Message -block.overflow-gate.name = Overflow Gate -block.silicon-smelter.name = Silicon Smelter +block.inverted-sorter.name = Inverted Sorter +block.message.name = Meddelande +block.overflow-gate.name = Överflödesgrind +block.silicon-smelter.name = Kiselsmältare block.phase-weaver.name = Phase Weaver -block.pulverizer.name = Pulverizer +block.pulverizer.name = Pulveriserare block.cryofluidmixer.name = Cryofluid Mixer block.melter.name = Smältare -block.incinerator.name = Incinerator +block.incinerator.name = Förbrännare block.spore-press.name = Spore Press block.separator.name = Separerare block.coal-centrifuge.name = Kolcentrifug @@ -822,7 +897,7 @@ block.trident-ship-pad.name = Trident Ship Pad block.glaive-ship-pad.name = Glaive Ship Pad block.omega-mech-pad.name = Omega Mech Pad block.tau-mech-pad.name = Tau Mech Pad -block.conduit.name = Conduit +block.conduit.name = Ledare block.mechanical-pump.name = Mechanical Pump block.item-source.name = Föremålskälla block.item-void.name = Föremålsförstörare @@ -830,8 +905,8 @@ block.liquid-source.name = Vätskekälla block.power-void.name = Energiätare block.power-source.name = Energikälla block.unloader.name = Urladdare -block.vault.name = Vault -block.wave.name = Wave +block.vault.name = Valv +block.wave.name = Våg block.swarmer.name = Svärmare block.salvo.name = Salvo block.ripple.name = Ripple @@ -843,7 +918,7 @@ block.blast-mixer.name = Blast Mixer block.solar-panel.name = Solpanel block.solar-panel-large.name = Stor Solpanel block.oil-extractor.name = Oljeextraktor -block.command-center.name = Command Center +block.command-center.name = Kommandocenter block.draug-factory.name = Draug Miner Drone Factory block.spirit-factory.name = Spirit Repair Drone Factory block.phantom-factory.name = Phantom Builder Drone Factory @@ -908,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.[] @@ -963,7 +1039,7 @@ unit.titan.description = An advanced, armored ground unit. Attacks both ground a unit.fortress.description = A heavy artillery mech. Equipped with two modified Hail-type cannons for long-range assault on enemy structures and units. unit.eruptor.description = A heavy mech designed to take down structures. Fires a stream of slag at enemy fortifications, melting them and setting volatiles on fire. unit.wraith.description = A fast, hit-and-run interceptor unit. Targets power generators. -unit.ghoul.description = A heavy carpet bomber. Rips through enemy structures, targeting critital infrastructure. +unit.ghoul.description = A heavy carpet bomber. Rips through enemy structures, targeting critical infrastructure. unit.revenant.description = A heavy, hovering missile array. block.message.description = Stores a message. Used for communication between allies. block.graphite-press.description = Compresses chunks of coal into pure sheets of graphite. @@ -991,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. @@ -1010,6 +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.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 ad48272f7d..a5585669ad 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 @@ -16,11 +17,29 @@ screenshot.invalid = Map too large, potentially not enough memory for screenshot gameover = Cekirdegin yok edildi. gameover.pvp = The[accent] {0}[] team is victorious! highscore = [accent]Yeni Yuksek skor! +copied = Copied. load.sound = Sounds load.map = Maps load.image = Images load.content = Content load.system = System +load.mod = Mods +schematic = Schematic +schematic.add = Save Schematic... +schematics = Schematics +schematic.replace = A schematic by that name already exists. Replace it? +schematic.import = Import Schematic... +schematic.exportfile = Export File +schematic.importfile = Import File +schematic.browseworkshop = Browse Workshop +schematic.copy = Copy to Clipboard +schematic.copy.import = Import from Clipboard +schematic.shareworkshop = Share on Workshop +schematic.flip = [accent][[{0}][]/[accent][[{1}][]: Flip Schematic +schematic.saved = Schematic saved. +schematic.delete.confirm = This schematic will be utterly eradicated. +schematic.rename = Rename Schematic +schematic.info = {0}x{1}, {2} blocks stat.wave = Waves Defeated:[accent] {0} stat.enemiesDestroyed = Enemies Destroyed:[accent] {0} stat.built = Buildings Built:[accent] {0} @@ -29,6 +48,7 @@ stat.deconstructed = Buildings Deconstructed:[accent] {0} stat.delivered = Resources Launched: stat.rank = Final Rank: [accent]{0} launcheditems = [accent]Launched Items +launchinfo = [unlaunched][[LAUNCH] your core to obtain the items indicated in blue. map.delete = Su haritayi silmek istediginden emin misin? "[accent]{0}[]"? level.highscore = Yuksek Skor: [accent]{0} level.select = Seviye secimi @@ -40,11 +60,11 @@ database = Core Database savegame = Oyunu kaydet loadgame = Devam et joingame = Oyuna katil -addplayers = Oyuncu ekle/cikar customgame = Ozel oyun newgame = New Game none = minimap = Minimap +position = Position close = Kapat website = Website quit = Cik @@ -60,6 +80,30 @@ 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.alpha = [accent](Alpha) +mods = Mods +mods.none = [LIGHT_GRAY]No mods found! +mods.guide = Modding Guide +mods.report = Report Bug +mods.openfolder = Open Mod Folder +mod.enabled = [lightgray]Enabled +mod.disabled = [scarlet]Disabled +mod.disable = Disable +mod.delete.error = Unable to delete mod. File may be in use. +mod.missingdependencies = [scarlet]Missing dependencies: {0} +mod.nowdisabled = [scarlet]Mod '{0}' is missing dependencies:[accent] {1}\n[lightgray]These mods need to be downloaded first.\nThis mod will be automatically disabled. +mod.enable = Enable +mod.requiresrestart = The game will now close to apply the mod changes. +mod.reloadrequired = [scarlet]Reload Required +mod.import = Import Mod +mod.import.github = Import Github Mod +mod.remove.confirm = This mod will be deleted. +mod.author = [LIGHT_GRAY]Author:[] {0} +mod.missing = This save contains mods that you have recently updated or no longer have installed. Save corruption may occur. Are you sure you want to load it?\n[lightgray]Mods:\n{0} +mod.preview.missing = Before publishing this mod in the workshop, you must add an image preview.\nPlace an image named[accent] preview.png[] into the mod's folder and try again. +mod.folder.missing = Only mods in folder form can be published on the workshop.\nTo convert any mod into a folder, simply unzip its file into a folder and delete the old zip, then restart your game or reload your mods. about.button = Hakkinda name = isim: noname = Pick a[accent] player name[] first. @@ -140,7 +184,6 @@ server.port = Link: server.addressinuse = Addres zaten kullaniliyor! server.invalidport = Geçersiz Oyun numarasi! server.error = [crimson]Oyun acarkes sorun olustu: [accent]{0} -save.old = Bu oyun su anda kullanilamaz.\n\n[LIGHT_GRAY]geri alma oyunun 4.0 surumunde eklenecektir. save.new = Yeni Kayit Dosyasi save.overwrite = Bu oyunun uzerinden\ngecmek istedigine emin\nmisin? overwrite = uzerinden gec @@ -174,6 +217,7 @@ warning = Warning. confirm = Onayla delete = Sil view.workshop = View In Workshop +workshop.listing = Edit Workshop Listing ok = Tamam open = Ac customize = Customize @@ -191,7 +235,12 @@ classic.export.text = [accent]Mindustry[] has just had a major update.\nClassic quit.confirm = Cikmak istedigine emin misin? quit.confirm.tutorial = Are you sure you know what you're doing?\nThe tutorial can be re-taken in[accent] Settings->Game->Re-Take Tutorial.[] loading = [accent]Yukleniyor... +reloading = [accent]Reloading Mods... saving = [accent]Kaydediliyor... +cancelbuilding = [accent][[{0}][] to clear plan +selectschematic = [accent][[{0}][] to select+copy +pausebuilding = [accent][[{0}][] to pause building +resumebuilding = [scarlet][[{0}][] to resume building wave = [accent]Dalga {0} wave.waiting = Dalganin baslamasina: {0} wave.waveInProgress = [LIGHT_GRAY]Wave in progress @@ -210,11 +259,18 @@ map.nospawn = Haritada Oyncularin cikmasi icin cekirdek yok! Haritaya[ROYAL]Mavi map.nospawn.pvp = This map does not have any enemy cores for player to spawn into! Add[SCARLET] red[] cores to this map in the editor. map.nospawn.attack = This map does not have any enemy cores for player to attack! Add[SCARLET] red[] cores to this map in the editor. map.invalid = Harita yuklenemedi. Gecersiz yada bozuk dosya. -map.publish.error = Error publishing map: {0} +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 -map.publish = Map published. -map.publishing = [accent]Publishing map... +missing = This item has been deleted or moved.\n[lightgray]The workshop listing has now been automatically un-linked. +publishing = [accent]Publishing... +publish.confirm = Are you sure you want to publish this?\n\n[lightgray]Make sure you agree to the Workshop EULA first, or your items will not show up! +publish.error = Error publishing item: {0} +steam.error = Failed to initialize Steam services.\nError: {0} editor.brush = Firca editor.openin = Editorde ac editor.oregen = Maden Yaratilma hizi @@ -344,7 +400,6 @@ campaign = Campaign load = Yukle save = Kaydet fps = FPS: {0} -tps = TPS: {0} ping = Ping: {0}ms language.restart = Lutfen dil degisiminin etkin olmasi icin oyunu yeniden baslatin settings = ayarlar @@ -352,12 +407,13 @@ tutorial = Tutorial tutorial.retake = Re-Take Tutorial editor = Editor mapeditor = Harita yaraticisi -donate = Bagis yap abandon = Abandon abandon.text = This zone and all its resources will be lost to the enemy. locked = Locked complete = [LIGHT_GRAY]Complete: -zone.requirement = Wave {0} in zone {1} +requirement.wave = Reach Wave {0} in {1} +requirement.core = Destroy Enemy Core in {0} +requirement.unlock = Unlock {0} resume = Resume Zone:\n[LIGHT_GRAY]{0} bestwave = [LIGHT_GRAY]Best: {0} launch = Launch @@ -368,11 +424,13 @@ launch.confirm = This will launch all resources in your core.\nYou will not be a launch.skip.confirm = If you skip now, you will not be able to launch until later waves. uncover = Uncover configure = Configure Loadout +bannedblocks = Banned Blocks +addall = Add All configure.locked = [LIGHT_GRAY]Reach wave {0}\nto configure loadout. configure.invalid = Amount must be a number between 0 and {0}. zone.unlocked = [LIGHT_GRAY]{0} unlocked. zone.requirement.complete = Wave {0} reached:\n{1} zone requirements met. -zone.config.complete = Wave {0} reached:\nLoadout config unlocked. +zone.config.unlocked = Loadout unlocked:[lightgray]\n{0} zone.resources = Resources Detected: zone.objective = [lightgray]Objective: [accent]{0} zone.objective.survival = Survive @@ -428,15 +486,14 @@ settings.graphics = Grafikler settings.cleardata = Clear Game Data... settings.clear.confirm = Are you sure you want to clear this data?\nWhat is done cannot be undone! settings.clearall.confirm = [scarlet]WARNING![]\nThis will clear all data, including saves, maps, unlocks and keybinds.\nOnce you press 'ok' the game will wipe all data and automatically exit. -settings.clearunlocks = Clear Unlocks -settings.clearall = Clear All paused = Duraklatildi +clear = Clear +banned = [scarlet]Banned yes = Evet no = Hayir info.title = [accent]Bilgi error.title = [crimson]Bir hata olustu error.crashtitle = Bir hata olustu -attackpvponly = [scarlet]Only available in Attack/PvP modes blocks.input = Input blocks.output = Output blocks.booster = Booster @@ -452,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 @@ -473,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} @@ -517,7 +576,9 @@ 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 setting.animatedshields.name = Animated Shields setting.antialias.name = Antialias[LIGHT_GRAY] (requires restart)[] @@ -538,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 @@ -547,6 +610,7 @@ setting.fps.name = FPS'i goster setting.vsync.name = VSync setting.pixelate.name = Pixelate [LIGHT_GRAY](may decrease performance) setting.minimap.name = Haritayi goster +setting.position.name = Show Player Position setting.musicvol.name = Ses yuksekligi setting.ambientvol.name = Ambient Volume setting.mutemusic.name = Sesi kapat @@ -558,6 +622,8 @@ setting.publichost.name = Public Game Visibility setting.chatopacity.name = Chat Opacity setting.lasersopacity.name = Power Laser Opacity setting.playerchat.name = Display In-Game Chat +public.confirm = Do you want to make your game public?\n[accent]Anyone will be able to join your games.\n[lightgray]This can be changed later in Settings->Game->Public Game Visibility. +public.beta = Note that beta versions of the game cannot make public lobbies. uiscale.reset = UI scale has been changed.\nPress "OK" to confirm this scale.\n[scarlet]Reverting and exiting in[accent] {0}[] settings... uiscale.cancel = Cancel & Exit setting.bloom.name = Bloom @@ -569,13 +635,16 @@ category.multiplayer.name = Cok oyunculu command.attack = Attack command.rally = Rally command.retreat = Retreat -keybind.gridMode.name = Block Select -keybind.gridModeShift.name = Category Select +keybind.clear_building.name = Clear Building keybind.press = Bir tusa bas... keybind.press.axis = Bir yone cevir yada tusa bas... keybind.screenshot.name = Map Screenshot keybind.move_x.name = Sol/Sag hareket keybind.move_y.name = Yukari/asagi hareket +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 = Toggle Fullscreen keybind.select.name = Sec/silahi sik keybind.diagonal_placement.name = Diagonal Placement @@ -587,12 +656,14 @@ keybind.zoom_hold.name = Yaklasma basili tutmasi keybind.zoom.name = Yaklas keybind.menu.name = Menu keybind.pause.name = Durdur +keybind.pause_building.name = Pause/Resume Building keybind.minimap.name = Minimap keybind.dash.name = Kos keybind.chat.name = konus keybind.player_list.name = Oyuncu listesi keybind.console.name = Konsol keybind.rotate.name = cevir +keybind.rotateplaced.name = Rotate Existing (Hold) keybind.toggle_menus.name = Menuleri ac'kapat keybind.chat_history_prev.name = Konusma gecmisi geri keybind.chat_history_next.name = Konusma gecmisi ileri @@ -604,6 +675,7 @@ mode.survival.name = Survival mode.survival.description = The normal mode. Limited resources and automatic incoming waves. mode.sandbox.name = Serbest mode.sandbox.description = Sonsuz esyalar ve Dalga suresi yok +mode.editor.name = Editor mode.pvp.name = PvP mode.pvp.description = fight against other players locally. mode.attack.name = Attack @@ -771,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 @@ -790,6 +864,7 @@ block.junction.name = ayirici block.router.name = dagitici block.distributor.name = yayici block.sorter.name = secici +block.inverted-sorter.name = Inverted Sorter block.message.name = Message block.overflow-gate.name = Kapali dagatici block.silicon-smelter.name = Silikon eritici @@ -908,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.[] @@ -991,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. @@ -1010,6 +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.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 f8b6e902b7..d7535c8a5a 100644 --- a/core/assets/bundles/bundle_tr.properties +++ b/core/assets/bundles/bundle_tr.properties @@ -3,8 +3,9 @@ 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şikliklerini +link.changelog.description = Güncelleme değişikliklerinin listesi link.dev-builds.description = Dengesiz oyun sürümleri link.trello.description = Planlanan özellikler için resmi Trello Sayfası link.itch.io.description = Bilgisayar sürümleri için itch.io sayfası @@ -12,17 +13,33 @@ link.google-play.description = Google Play mağaza sayfası link.wiki.description = Resmi Mindustry wikisi linkfail = Link açılamadı!\nURL kopyalandı. screenshot = Ekran görüntüsü {0} 'na kaydedildi -screenshot.invalid = Harita çok büyük, ekran görüntüsü için potansiyel olarak yeterli bellek yok. +screenshot.invalid = Harita çok büyük, muhtemelen ekran görüntüsü için yeterli bellek yok. 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 +schematic.browseworkshop = Workshop'u incele +schematic.copy = Panoya Kopyala +schematic.copy.import = Panodan İçeri Aktar +schematic.shareworkshop = Workshop'ta Kaydet +schematic.flip = [accent][[{0}][]/[accent][[{1}][]: Şemayı döndür +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} @@ -30,8 +47,8 @@ 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? level.highscore = Rekor: [accent]{0} level.select = Seviye Seçimi @@ -43,11 +60,11 @@ database = Ana Veritabanı savegame = Oyunu Kaydet loadgame = Oyunu Yükle joingame = Oyuna Katıl -addplayers = Oyuncu Ekle/Kaldır customgame = Özel Oyun newgame = Yeni Oyun none = minimap = Harita +position = Pozisyon close = Kapat website = Website quit = Çık @@ -63,7 +80,30 @@ uploadingcontent = İçerik Yükleniyor uploadingpreviewfile = Önizleme Dosyası Yükleniyor committingchanges = Değişiklikler Uygulanıyor done = Bitti - +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.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. about.button = Hakkında name = İsim: noname = Bir[accent] kullanıcı adı[] seçmelisin. @@ -144,9 +184,8 @@ server.port = Port: server.addressinuse = Adres zaten kullanılıyor! server.invalidport = Geçersiz port sayısı! server.error = [crimson]Sunucu kurulamadı: [accent]{0} -save.old = Bu kayıt oyunun eski bir sürümü için ve artık kullanılamaz.\n\n[lightgray]Tam 4.0 sürümü yayınlandığında geri kayıt özelliği eklenecek. save.new = Yeni kayıt -save.overwrite = Bu kayıdın üstüne yazmak istediğine\nemin misin? +save.overwrite = Bu kaydın üstüne yazmak istediğine\nemin misin? overwrite = Üstüne yaz save.none = Kayıt bulunamadı! saveload = Kaydediliyor... @@ -164,7 +203,7 @@ save.rename.text = Yeni isim: selectslot = Bir kayıt seçin. slot = [accent]Slot {0} editmessage = Mesajı Düzenle -save.corrupted = [accent]Kayıt dosyası bozuk veya geçersiz!\nEğer oyununuzu kısa süre öce güncellediyseniz bu, kayıt formatındaki bir değişiklik. Bir hata [scarlet]değil[]. +save.corrupted = [accent]Kayıt dosyası bozuk veya geçersiz! empty = on = Aç off = Kapa @@ -177,7 +216,8 @@ save.playtime = Oynama süresi: {0} warning = Uyarı. confirm = Doğrula delete = Sil -view.workshop = Workshop'da görüntüle +view.workshop = Atölyede görüntüle +workshop.listing = Atölye Listelemesini Aç ok = Tamam open = Aç customize = Kuralları Özelleştir @@ -189,18 +229,23 @@ 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 = Importing external data will erase[scarlet] all[] your current game data.\n[accent]This cannot be undone![]\n\nOnce the data is imported, your game will exit immediately. +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 update olmuştur.\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? +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? quit.confirm.tutorial = Ne yaptığınıza emin misiniz?\nÖğreticiyi [accent] Ayarlar->Oyun->Öğreticiyi Yeniden Al'dan[] tekrar yapabilirsiniz. loading = [accent]Yükleniyor... +reloading = [accent]Modlar Yeniden Yükleniyor... saving = [accent]Kayıt ediliyor... +cancelbuilding = Planı temizlemek için [accent][[{0}][] +selectschematic = Seçmek ve kopyalamak için [accent][[{0}][] +pausebuilding = İnşaatı durdurmak için [accent][[{0}][] +resumebuilding = İnşaata devam etmek için [scarlet][[{0}][] wave = [accent]Dalga {0} -wave.waiting = [lightgray]{0} saniye içinde dalga +wave.waiting = [lightgray]{0} saniye içinde dalga başlayacak wave.waveInProgress = [lightgray]Dalga gerçekleşiyor waiting = [lightgray]Bekleniliyor... -waiting.players = Oyuncular için bekleniliyor... +waiting.players = Oyuncular bekleniliyor... wave.enemies = [lightgray]{0} Tane Düşman Kaldı wave.enemy = [lightgray]{0} Tane Düşman Kaldı loadimage = Resim Aç @@ -210,45 +255,52 @@ custom = Özel builtin = Yerleşik map.delete.confirm = Bu haritayı silmek istediğinizden emin misiniz? Bunu geri alamazsınız! map.random = [accent]Rastgele Harita -map.nospawn = This map does not have any cores for the player to spawn in! Add a[accent] orange[] core to this map in the editor. -map.nospawn.pvp = This map does not have any enemy cores for player to spawn into! Add[SCARLET] non-orange[] cores to this map in the editor. -map.nospawn.attack = This map does not have any enemy cores for player to attack! Add[SCARLET] red[] cores to this map in the editor. +map.nospawn = Bu haritada oyuncunun doğacağı hiç çekirdek yok! Editörden bu haritaya[accent] turuncu[] bir çekirdek ekleyin. +map.nospawn.pvp = Bu Haritada düşmanın doğacağı hiç çekirdek yok! Editörden bu haritaya [SCARLET]turuncu olmayan[] çekirdekler ekleyin. +map.nospawn.attack = Bu haritada oyuncunun saldıracağı hiç düşman çekirdeği yok! Editörden haritaya[SCARLET] kırmızı[] çekirdekler ekleyin. map.invalid = Haritayı açarken hata oldu: bozulmuş ya da geçersiz harita dosyası.- -map.publish.error = Error publishing map: {0} -map.publish.confirm = Are you sure you want to publish this map?\n\n[lightgray]Make sure you agree to the Workshop EULA first, or your maps will not show up! +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! +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 -map.publish = Harita yayınlandı. -map.publishing = [accent]Harita yayınlanıyor... +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.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 -editor.oregen.info = Maden Oluşumu: +editor.oregen.info = Maden Oluşumu: editor.mapinfo = Harita Bilgileri editor.author = Yapımcı: editor.description = Açıklama: editor.nodescription = Haritanın en az 4 harflik bir açıklaması olması gerekiyor. editor.waves = Dalgalar: -editor.rules = Kularlar: +editor.rules = Kurallar: editor.generation = Oluşum: editor.ingame = Oyun içinde düzenle -editor.publish.workshop = Workshop'da Yayınla +editor.publish.workshop = Atölyede Yayınla editor.newmap = Yeni Harita -workshop = Workshop- +workshop = Atölye waves.title = Dalgalar waves.remove = Kaldır waves.never = waves.every = her waves.waves = dalga(lar) -waves.perspawn = per spawn +waves.perspawn = doğma noktası başına waves.to = doğru waves.boss = Boss -waves.preview = Öngörünüm +waves.preview = Önizleme waves.edit = Düzenle... -waves.copy = Clipboard'dan kopyala -waves.load = Clipboard'dan yükle -waves.invalid = Clipboard'da geçersiz dalga sayısı var. +waves.copy = Panodan kopyala +waves.load = Panodan yükle +waves.invalid = Panoda geçersiz dalga sayısı var. waves.copied = Dalgalar kopyalandı. -waves.none = Düşman bulunamadı.\nNote that empty wave layouts will automatically be replaced with the default layout. +waves.none = Düşman bulunamadı.\nBoş dalga düzenlerin otomatik olarak varsayılan düzenle değiştirileceğini unutmayın editor.default = [lightgray] details = Detaylar... edit = Düzenle... @@ -258,11 +310,11 @@ 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 = That's an image, not a map.\n\nIf you want to import a 3.5/build 40 map, use the 'Import Legacy Map' button in the editor. -editor.errorlegacy = This map is too old, and uses a legacy map format that is no longer supported. +editor.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. -editor.errorname = Haritanın ismi yok. Bir kayıt dosyası mı yüklemeye çalışıyorsun? +editor.errorname = Haritanın ismi yok. Bir kayıt dosyası mı yüklemeye çalışıyorsunuz? editor.update = Güncelle editor.randomize = Rastgele Yap editor.apply = Uygula @@ -284,65 +336,62 @@ editor.importimage.description = Dışarıdaki bir resim-harita dosyasını içe editor.export = Dışarı Aktar... editor.exportfile = Dosyayı Dışarı Aktar editor.exportfile.description = Harita dosyasını dışarıya aktar -editor.exportimage = Export Terrain Image -editor.exportimage.description = Export a map image file -editor.loadimage = Import Terrain -editor.saveimage = Export Terrain -editor.unsaved = [scarlet]You have unsaved changes![]\nAre you sure you want to exit? -editor.resizemap = Resize Map -editor.mapname = Map Name: -editor.overwrite = [accent]Warning!\nThis overwrites an existing map. -editor.overwrite.confirm = [scarlet]Warning![] A map with this name already exists. Are you sure you want to overwrite it? -editor.exists = A map with this name already exists. -editor.selectmap = Select a map to load: - +editor.exportimage = Arazi Görüntüsü Dışa Aktar +editor.exportimage.description = Bir harita resim dosyasını dışa aktar +editor.loadimage = Arazi İçeri Aktar +editor.saveimage = Arazi Dışa Aktar +editor.unsaved = [scarlet]Kaydedilmemiş değişiklikleriniz var![]\nÇıkmak istediğinize emin misiniz? +editor.resizemap = Haritayı Yeniden Boyutlandır +editor.mapname = Harita İsmi: +editor.overwrite = [accent]Uyarı!\nBu işlem var olan bir haritanın üstüne yazar. +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 = Draws only on solid blocks. +toolmode.replace.description = Sadece katı blokların üzerinde çizer. toolmode.replaceall = Hepsini Değiştir -toolmode.replaceall.description = Replace all blocks in map. -toolmode.orthogonal = Dikey -toolmode.orthogonal.description = Draws only orthogonal lines. +toolmode.replaceall.description = Haritadaki bütün blokları değiştirir. +toolmode.orthogonal = Dik +toolmode.orthogonal.description = Sadece dik çizgiler çizer. toolmode.square = Kare -toolmode.square.description = Square brush. -toolmode.eraseores = Erase Ores -toolmode.eraseores.description = Erase only ores. -toolmode.fillteams = Fill Teams -toolmode.fillteams.description = Fill teams instead of blocks. -toolmode.drawteams = Draw Teams -toolmode.drawteams.description = Draw teams instead of blocks. - -filters.empty = [lightgray]No filters! Add one with the button below. -filter.distort = Distort -filter.noise = Noise -filter.median = Median -filter.oremedian = Ore Median -filter.blend = Blend +toolmode.square.description = Kare fırça. +toolmode.eraseores = Maden Sil +toolmode.eraseores.description = Sadece madenleri siler.. +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.blend = Geçiş filter.defaultores = Varsayılan Madenler filter.ore = Maden -filter.rivernoise = River Noise -filter.mirror = Mirror -filter.clear = Clear -filter.option.ignore = Ignore -filter.scatter = Scatter -filter.terrain = Terrain -filter.option.scale = Scale -filter.option.chance = Chance -filter.option.mag = Magnitude -filter.option.threshold = Threshold -filter.option.circle-scale = Circle Scale -filter.option.octaves = Octaves -filter.option.falloff = Falloff -filter.option.angle = Angle +filter.rivernoise = Nehir Gürültüsü +filter.mirror = Ayna +filter.clear = Temizle +filter.option.ignore = Yoksay +filter.scatter = Saç +filter.terrain = Arazi +filter.option.scale = Ölçek +filter.option.chance = Şans +filter.option.mag = Genlik +filter.option.threshold = Eşik +filter.option.circle-scale = Daire Ölçek +filter.option.octaves = Oktavlar +filter.option.falloff = Düşüş +filter.option.angle = Açı filter.option.block = Blok filter.option.floor = Zemin -filter.option.flooronto = Target Floor +filter.option.flooronto = Hedef Zemin filter.option.wall = Duvar filter.option.ore = Maden -filter.option.floor2 = Secondary Floor -filter.option.threshold2 = Secondary Threshold -filter.option.radius = Radius -filter.option.percentile = Percentile - +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ü @@ -351,7 +400,6 @@ campaign = Başla load = Yükle save = Kaydet fps = FPS: {0} -tps = TPS: {0} ping = Ping: {0}ms language.restart = Dil ayarlarının çalışması için lütfen oyunu yeniden başlatın. settings = Ayarlar @@ -359,136 +407,134 @@ tutorial = Öğretici tutorial.retake = Öğreticiyi Yeniden Al editor = Düzenleyici mapeditor = Harita Düzenleyicisi -donate = Bağış Yap - abandon = Terk Et -abandon.text = Burası ve bütün kaynakları düşmana kaybedilecek. +abandon.text = Burası ve bütün kaynaklar düşmana kaybedilecek. locked = Kilitli -complete = [lightgray]Reach: -zone.requirement = Wave {0} in zone {1} -resume = Resume Zone:\n[lightgray]{0} -bestwave = [lightgray]Best Wave: {0} -launch = < LAUNCH > -launch.title = Launch Successful -launch.next = [lightgray]next opportunity at wave {0} -launch.unable2 = [scarlet]Unable to LAUNCH.[] -launch.confirm = This will launch all resources in your core.\nYou will not be able to return to this base. +complete = [lightgray]Ulaş: +requirement.wave = Bölge {1}'de Dalga {0} +requirement.core = {0}`da Düşman Çekirdeği Yok Et +requirement.unlock = {0}'I Aç +resume = Bölgeye Devam Et:\n[lightgray]{0} +bestwave = [lightgrayEn İyi Dalga: {0} +launch = < KALKIŞ > +launch.title = Kalkış Başarılı +launch.next = [lightgray]Bir sonraki imkan {0}. dalgada olacak. +launch.unable2 = [scarlet]KALKIŞ mümkün değil.[] +launch.confirm = Bu işlem çekirdeğinizdeki bütün kaynakları yollayacak.\nBu üsse geri dönemeyeceksiniz. launch.skip.confirm = Eğer şimdi geçerseniz, uncover = Aç -configure = Configure Loadout -configure.locked = [lightgray]Unlock configuring loadout: Wave {0}. -configure.invalid = Amount must be a number between 0 and {0}. -zone.unlocked = [lightgray]{0} unlocked. -zone.requirement.complete = Wave {0} reached:\n{1} zone requirements met. -zone.config.complete = Wave {0} reached:\nLoadout config unlocked. -zone.resources = [lightgray]Resources Detected: -zone.objective = [lightgray]Objective: [accent]{0} +configure = Ekipmanı Yapılandır +bannedblocks = Yasaklı Bloklar +addall = Hepsini Ekle +configure.locked = [lightgray]Ekipman Yapılandırmayı Aç: Dalga {0}. +configure.invalid = Miktar 0 ve {0} arasında bir sayı olmalı. +zone.unlocked = [lightgray]{0} kilidi açıldı. +zone.requirement.complete = {0}. dalgaya ulaşıldı:\n{1} bölge şartları karşılandı. +zone.config.unlocked = [lightgray]{0}:\nEkipman yapılandırma açıldı. +zone.resources = [lightgray]Tespit Edilen Kaynaklar: +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]Connection error:\n\n[accent]{0} -error.unreachable = Server unreachable.\nIs the address spelled correctly? +connectfail = [crimson]Bağlantı hatası:\n\n[accent]{0} +error.unreachable = Sunucuya ulaşılamıyor.\nAdrwsin doğru yazıldığına emin misiniz? error.invalidaddress = Geçersiz adres. -error.timedout = Timed out!\nMake sure the host has port forwarding set up, and that the address is correct! -error.mismatch = Packet error:\npossible client/server version mismatch.\nMake sure you and the host have the latest version of Mindustry! -error.alreadyconnected = Already connected. -error.mapnotfound = Map file not found! -error.io = Network I/O error. -error.any = Unknown network error. -error.bloom = Failed to initialize bloom.\nYour device may not support it. - -zone.groundZero.name = Ground Zero -zone.desertWastes.name = Desert Wastes -zone.craters.name = The Craters -zone.frozenForest.name = Frozen Forest -zone.ruinousShores.name = Ruinous Shores -zone.stainedMountains.name = Stained Mountains -zone.desolateRift.name = Desolate Rift -zone.nuclearComplex.name = Nuclear Production Complex -zone.overgrowth.name = Overgrowth -zone.tarFields.name = Tar Fields -zone.saltFlats.name = Salt Flats -zone.impact0078.name = Impact 0078 -zone.crags.name = Crags -zone.fungalPass.name = Fungal Pass - -zone.groundZero.description = The optimal location to begin once more. Low enemy threat. Few resources.\nGather as much lead and copper as possible.\nMove on. -zone.frozenForest.description = Even here, closer to mountains, the spores have spread. The frigid temperatures cannot contain them forever.\n\nBegin the venture into power. Build combustion generators. Learn to use menders. -zone.desertWastes.description = These wastes are vast, unpredictable, and criss-crossed with derelict sector structures.\nCoal is present in the region. Burn it for power, or synthesize graphite.\n\n[lightgray]This landing location cannot be guaranteed. -zone.saltFlats.description = On the outskirts of the desert lie the Salt Flats. Few resources can be found in this location.\n\nThe enemy has erected a resource storage complex here. Eradicate their core. Leave nothing standing. -zone.craters.description = Water has accumulated in this crater, relic of the old wars. Reclaim the area. Collect sand. Smelt metaglass. Pump water to cool turrets and drills. -zone.ruinousShores.description = Past the wastes, is the shoreline. Once, this location housed a coastal defense array. Not much of it remains. Only the most basic defense structures have remained unscathed, everything else reduced to scrap.\nContinue the expansion outwards. Rediscover the technology. -zone.stainedMountains.description = Further inland lie the mountains, yet untainted by spores.\nExtract the abundant titanium in this area. Learn how to use it.\n\nThe enemy presence is greater here. Do not give them time to send their strongest units. -zone.overgrowth.description = This area is overgrown, closer to the source of the spores.\nThe enemy has established an outpost here. Build Titan units. Destroy it. Reclaim that which was lost. -zone.tarFields.description = The outskirts of an oil production zone, between the mountains and desert. One of the few areas with usable tar reserves.\nAlthough abandoned, this area has some dangerous enemy forces nearby. Do not underestimate them.\n\n[lightgray]Research oil processing technology if possible. -zone.desolateRift.description = An extremely dangerous zone. Plentiful resources, but little space. High risk of destruction. Leave as soon as possible. Do not be fooled by the long spacing between enemy attacks. -zone.nuclearComplex.description = A former facility for the production and processing of thorium, reduced to ruins.\n[lightgray]Research the thorium and its many uses.\n\nThe enemy is present here in great numbers, constantly scouting for attackers. -zone.fungalPass.description = A transition area between high mountains and lower, spore-ridden lands. A small enemy reconnaissance base is located here.\nDestroy it.\nUse Dagger and Crawler units. Take out the two cores. +error.timedout = Zaman aşımı!\nSunucunun port yönlendirmeyi ayarladığına ve adresin doğru olduğuna emin olun! +error.mismatch = Paket hatası:\nSunucu ve alıcı arasında versiyon uyuşmazlığı ihtimali var.\nHem sizde hem de sunucuda Mindustry'nin en son sürümü yüklü olduğuna emin olun! +error.alreadyconnected = Zaten bağlanıldı. +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.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.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.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. +zone.nuclearComplex.description = Önceleri toryum üretme ve işleme ile görevli bir tesis. Şu anda yıkılmış durumda.\n[lightgray]Toryumu ve toryumun birçok işlevini araştır.\n\nBu bölgede çok sayıda düşman mevzilenmiş durumda ve saldırıları durmaksızın gözlemekteler. +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 = Reset to Defaults -settings.rebind = Rebind +settings.reset = Varsayılana Sıfırla +settings.rebind = Tuşları Yeniden Ata settings.controls = Kontroller settings.game = Oyun settings.sound = Ses settings.graphics = Grafikler settings.cleardata = Oyun Verisini Sil... -settings.clear.confirm = Verileri silmek istediğinizden emin misiniz?\nBunu geri alamazsınız! -settings.clearall.confirm = [scarlet]WARNING![]\nThis will clear all data, including saves, maps, unlocks and keybinds.\nOnce you press 'ok' the game will wipe all data and automatically exit. -settings.clearunlocks = Clear Unlocks -settings.clearall = Hepsini Sil +settings.clear.confirm = Verileri silmek istediğinizden emin misiniz?\nBu işlemi geri alamazsınız! +settings.clearall.confirm = [scarlet]Uyarı![]\nBu işlem kayıtlar, haritalar açılan bloklar ve tuş atamaları dahil bütün verileri silecektir.\n"ok" tuşuna bastığınızda bütün verileriniz silinecek ve oyun kapanacaktır. paused = [accent]< Durduruldu > +clear = Temizle +banned = [scarlet]Yasaklı yes = Evet no = Hayır info.title = Bilgi error.title = [crimson]Bir hata oldu error.crashtitle = Bir hata oldu -attackpvponly = [scarlet]Only available in Attack/PvP modes blocks.input = Giriş blocks.output = Çıkış blocks.booster = Booster block.unknown = [lightgray]??? -blocks.powercapacity = Power Capacity -blocks.powershot = Power/Shot +blocks.powercapacity = Enerji Kapasitesi +blocks.powershot = Enerji/Atış blocks.damage = Hasar -blocks.targetsair = Havayı Hedefler -blocks.targetsground = Yeri Hedefler +blocks.targetsair = Havayı Hedefler Mi +blocks.targetsground = Yeri Hedefler Mi blocks.itemsmoved = Hareket Hızı blocks.launchtime = Fırlatmalar Arasındaki Süre 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 -blocks.basepowergeneration = Zemin Enerji Üretimi +blocks.basepowergeneration = Temel Enerji Üretimi blocks.productiontime = Üretim Süresi -blocks.repairtime = Full Tamir Süresi +blocks.repairtime = Tamir Tamir Edilme Süresi blocks.speedincrease = Hız Artışı blocks.range = Menzil -blocks.drilltier = Matkaplanabilenler -blocks.drillspeed = Zemin Matkap Hızı +blocks.drilltier = Kazılabilenler +blocks.drillspeed = Temel Matkap Hızı blocks.boosteffect = Hızlandırma Efekti -blocks.maxunits = Maksimum Aktif Unitler +blocks.maxunits = Maksimum Aktif Birim blocks.health = Can blocks.buildtime = İnşaat Süresi blocks.buildcost = İnşaat Fiyatı -blocks.inaccuracy = Yanlış Atış İhtimali +blocks.inaccuracy = İskalama Oranı blocks.shots = Atışlar blocks.reload = Atışlar/Sn blocks.ammo = Mermi - bar.drilltierreq = Daha İyi Matkap Gerekli -bar.drillspeed = Drill Speed: {0}/s -bar.efficiency = Efficiency: {0}% +bar.drillspeed = Matkap Hızı: {0}/s +bar.pumpspeed = Pump Speed: {0}/s +bar.efficiency = Verim: {0}% bar.powerbalance = Enerji: {0}/sn -bar.powerstored = Enerji Deposu: {0}/{1} +bar.powerstored = Depolanan: {0}/{1} bar.poweramount = Enerji: {0} bar.poweroutput = Enerji Üretimi: {0} bar.items = Eşyalar: {0} @@ -497,20 +543,18 @@ bar.liquid = Sıvı bar.heat = Isı bar.power = Enerji bar.progress = Build Progress -bar.spawned = Unitler: {0}/{1} - -bullet.damage = [stat]{0}[lightgray] damage -bullet.splashdamage = [stat]{0}[lightgray] area dmg ~[stat] {1}[lightgray] tiles -bullet.incendiary = [stat]incendiary -bullet.homing = [stat]homing -bullet.shock = [stat]shock -bullet.frag = [stat]frag -bullet.knockback = [stat]{0}[lightgray] knockback -bullet.freezing = [stat]freezing -bullet.tarred = [stat]tarred -bullet.multiplier = [stat]{0}[lightgray]x ammo multiplier -bullet.reload = [stat]{0}[lightgray]x fire rate - +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ı +bullet.homing = [stat]güdümlü +bullet.shock = [stat]şoklayıcı +bullet.frag = [stat]parça tesirli +bullet.knockback = [stat]{0}[lightgray] geri itki +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 @@ -528,123 +572,133 @@ category.power = Enerji category.liquids = Sıvılar category.items = Eşyalar category.crafting = Giriş/Çıkış -category.shooting = Shooting -category.optional = Optional Enhancements -setting.landscape.name = Lock Landscape +category.shooting = Silahlar +category.optional = İsteğe Bağlı Geliştirmeler +setting.landscape.name = Yatayda sabitle setting.shadows.name = Gölgeler -setting.linear.name = Linear Filtering +setting.blockreplace.name = Automatic Block Suggestions +setting.linear.name = Lineer Filtreleme +setting.hints.name = İpuçları setting.animatedwater.name = Animasyonlu Su setting.animatedshields.name = Animasyonlu Kalkanlar setting.antialias.name = Antialias[lightgray] (requires restart)[] -setting.indicators.name = Enemy/Ally Indicators -setting.autotarget.name = Auto-Target +setting.indicators.name = Düşman/Müttefik Belirteçleri +setting.autotarget.name = Otomatik Hedef Alma setting.keyboard.name = Fare+Klavye Kontrolleri -setting.touchscreen.name = Touchscreen Controls +setting.touchscreen.name = Dokunmatik Ekran Kontrolleri setting.fpscap.name = Maksimum FPS setting.fpscap.none = Limitsiz setting.fpscap.text = {0} FPS -setting.uiscale.name = UI Scaling[lightgray] (require restart)[] -setting.swapdiagonal.name = Always Diagonal Placement +setting.uiscale.name = UI Ölçeği[lightgray] (require restart)[] +setting.swapdiagonal.name = Her Zaman Çapraz Yerleştirme setting.difficulty.training = Eğitim setting.difficulty.easy = Kolay setting.difficulty.normal = Normal setting.difficulty.hard = Zor setting.difficulty.insane = Çılgın setting.difficulty.name = Zorluk: -setting.screenshake.name = Screen Shake -setting.effects.name = Display Effects -setting.sensitivity.name = Controller Sensitivity -setting.saveinterval.name = Save Interval +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 setting.fullscreen.name = Tam Ekran setting.borderlesswindow.name = Kenarsız Pencere[lightgray] (yeniden açmak gerekebilir) setting.fps.name = FPS Göster setting.vsync.name = VSync -setting.lasers.name = Enerji Işınlarını Göster -setting.pixelate.name = Pixelle[lightgray] (animasyonları kapatır) -setting.minimap.name = Harita Göster +setting.pixelate.name = Pixelleştir[lightgray] (animasyonları kapatır) +setting.minimap.name = Haritayı Göster +setting.position.name = Oyuncu Noktasını Göster setting.musicvol.name = Müzik -setting.ambientvol.name = Etraf Sesi +setting.ambientvol.name = Çevresel Ses setting.mutemusic.name = Müziği Kapat setting.sfxvol.name = Oyun Sesi setting.mutesound.name = Sesi Kapat -setting.crashreport.name = Send Anonymous Crash Reports -setting.savecreate.name = Auto-Create Saves -setting.publichost.name = Public Game Visibility -setting.chatopacity.name = Chat Opacity +setting.crashreport.name = Anonim Çökme Raporları Gönder +setting.savecreate.name = Otomatik Kayıt Oluştur +setting.publichost.name = Halka Açık Oyunlar +setting.chatopacity.name = Mesajlaşma Opaklığı setting.lasersopacity.name = Enerji Lazeri Opaklığı setting.playerchat.name = Oyun-içi Konuşmayı Göster -uiscale.reset = UI scale has been changed.\nPress "OK" to confirm this scale.\n[scarlet]Reverting and exiting in[accent] {0}[] seconds... +public.confirm = Oyununuzu halka açık yapmak ister misiniz?\n[accent]Oyunlarınıza herkes katılabilecektir.\n[lightgray]Bu seçenek daha sonra Ayarlar->Oyun->Halka Açık Oyunlar'dan değiştirilebilir. +public.beta = Oyunun beta sürümlerinin halka açık lobiler yapamayacağını unutmayın. +uiscale.reset = UI ölçeği değiştirildi.\nBu ölçeği onaylamak için "OK" butonuna basın.\n[accent] {0}[] [scarlet]saniye içinde eski ayarlara geri dönülüp oyundan çıkılıyor…[] uiscale.cancel = İptal Et ve Çık -setting.bloom.name = Bloom -keybind.title = Rebind Keys -keybinds.mobile = [scarlet]Most keybinds here are not functional on mobile. Only basic movement is supported. +setting.bloom.name = Kamaşma +keybind.title = Tuşları Yeniden Ata +keybinds.mobile = [scarlet]Buradaki çoğu tuş ataması mobilde geçerli değildir. Sadece temel hareket desteklenmektedir. category.general.name = Genel -category.view.name = View +category.view.name = Görünüm category.multiplayer.name = Çok Oyunculu command.attack = Saldır command.rally = Toplan command.retreat = Geri Çekil -keybind.gridMode.name = Block Select -keybind.gridModeShift.name = Category Select +keybind.clear_building.name = Binayı Temizle keybind.press = Bir tuşa basın... -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.fullscreen.name = Toggle Fullscreen -keybind.select.name = Select/Shoot -keybind.diagonal_placement.name = Diagonal Placement +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_flip_x.name = Şemayı X 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 keybind.pick.name = Blok Seç keybind.break_block.name = Blok Kır keybind.deselect.name = Seçimleri Kaldır keybind.shoot.name = Ateş Et -keybind.zoom_hold.name = Zoom Hold -keybind.zoom.name = Zoom +keybind.zoom_hold.name = Zumu Sabit Tutma +keybind.zoom.name = Zum keybind.menu.name = Menü keybind.pause.name = Durdur -keybind.minimap.name = Minimap -keybind.dash.name = Dash +keybind.pause_building.name = İnşaatı Duraklat/İnşaata Devam Et +keybind.minimap.name = Mini Harita +keybind.dash.name = Sıçrama keybind.chat.name = Konuş keybind.player_list.name = Oyuncu Listesi keybind.console.name = Konsol keybind.rotate.name = Döndür -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.rotateplaced.name = Var Olanı Çevir (Basılı Tutun) +keybind.toggle_menus.name = Menüleri Aç/Kapa +keybind.chat_history_prev.name = Sohbet geçmişi önceki +keybind.chat_history_next.name = Sohbet geçmişi sonraki +keybind.chat_scroll.name = Sohbet Kaydırma keybind.drop_unit.name = Drop Unit -keybind.zoom_minimap.name = Zoom minimap -mode.help.title = Description of modes +keybind.zoom_minimap.name = Mini Haritada Zum +mode.help.title = Modların açıklamaları mode.survival.name = Hayatta Kalma -mode.survival.description = The normal mode. Limited resources and automatic incoming waves.\n[gray]Requires enemy spawns in the map to play. +mode.survival.description = Normal oyun oyun modu. Kaynak sınırlı ve dalgalar otomatik olarak gönderilir.\n[gray]Oynamak için haritada düşman doğma noktaları olması gerekir. mode.sandbox.name = Yaratıcı mode.sandbox.description = Sonsuz kaynaklar ve dalgalar için zamanlayıcı yok. mode.editor.name = Düzenleyici mode.pvp.name = PvP -mode.pvp.description = Fight against other players locally.\n[gray]Requires at least 2 differently-colored cores in the map to play. +mode.pvp.description = Yerel olarak başkaları ile savaş.\n[gray]Oynamak için haritada en az iki farklı renkli çekirdek olması gerekir. mode.attack.name = Saldırı -mode.attack.description = Destroy the enemy's base. No waves.\n[gray]Requires a red core in the map to play. +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 rules.attack = Saldırı Modu -rules.enemyCheat = Infinite AI (Red Team) Resources +rules.enemyCheat = Sonsuz AI (Kırmızı Takım) Kaynakları rules.unitdrops = Unit Drops -rules.unitbuildspeedmultiplier = Unit Production Speed Multiplier -rules.unithealthmultiplier = Unit Health Multiplier -rules.playerhealthmultiplier = Player Health Multiplier -rules.playerdamagemultiplier = Player Damage Multiplier -rules.unitdamagemultiplier = Unit Damage Multiplier -rules.enemycorebuildradius = Enemy Core No-Build Radius:[lightgray] (tiles) -rules.respawntime = Respawn Time:[lightgray] (sec) -rules.wavespacing = Wave Spacing:[lightgray] (sec) -rules.buildcostmultiplier = Build Cost Multiplier -rules.buildspeedmultiplier = Build Speed Multiplier -rules.waitForWaveToEnd = Waves wait for enemies -rules.dropzoneradius = Drop Zone Radius:[lightgray] (tiles) +rules.unitbuildspeedmultiplier = Birim Üretim Hızı Çarpanı +rules.unithealthmultiplier = Birim Canı Çarpanı +rules.playerhealthmultiplier = Oyuncu Canı Çarpanı +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.buildcostmultiplier = İnşa ücreti Çarpanı +rules.buildspeedmultiplier = İnşa Hızı Çarpanı +rules.waitForWaveToEnd = Dalgalar Düşmanı Bekler +rules.dropzoneradius = İniş Noktası Yarıçapı:[lightgray] (tiles) rules.respawns = Dalga Başına Maksimum Tekrar Canlanmalar rules.limitedRespawns = Tekrar Canlanma Limiti rules.title.waves = Dalgalar @@ -653,12 +707,11 @@ 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 = Unitler +content.unit.name = Birimler content.block.name = Bloklar -content.mech.name = Mekanikler +content.mech.name = Robotlar item.copper.name = Bakır item.lead.name = Kurşun item.coal.name = Kömür @@ -667,9 +720,9 @@ item.titanium.name = Titanyum item.thorium.name = Toryum item.silicon.name = Silikon item.plastanium.name = Plastanyum -item.phase-fabric.name = Faz Kumaş -item.surge-alloy.name = Dalgalanma Alaşımı -item.spore-pod.name = Spor Tübü +item.phase-fabric.name = Faz Örgüsü +item.surge-alloy.name = Akı Alaşımı +item.spore-pod.name = Spor Kapsülü item.sand.name = Kum item.blast-compound.name = Patlayıcı Bileşik item.pyratite.name = Pirratit @@ -678,28 +731,28 @@ item.scrap.name = Hurda liquid.water.name = Su liquid.slag.name = Cüruf liquid.oil.name = Petrol -liquid.cryofluid.name = Cryofluid +liquid.cryofluid.name = Kriyosıvı mech.alpha-mech.name = Alpha -mech.alpha-mech.weapon = Heavy Repeater -mech.alpha-mech.ability = Regeneration +mech.alpha-mech.weapon = Ağır Makineli Tüfek +mech.alpha-mech.ability = Rejenerasyon mech.delta-mech.name = Delta -mech.delta-mech.weapon = Arc Generator -mech.delta-mech.ability = Discharge +mech.delta-mech.weapon = Ark Jeneratörü +mech.delta-mech.ability = Deşarj mech.tau-mech.name = Tau -mech.tau-mech.weapon = Restruct Laser -mech.tau-mech.ability = Repair Burst +mech.tau-mech.weapon = Yenileme Işını +mech.tau-mech.ability = Çoklu Tamir mech.omega-mech.name = Omega -mech.omega-mech.weapon = Swarm Missiles -mech.omega-mech.ability = Armored Configuration +mech.omega-mech.weapon = Sürü Füzeleri +mech.omega-mech.ability = Zırhlı Konfigürasyon mech.dart-ship.name = Dart -mech.dart-ship.weapon = Repeater +mech.dart-ship.weapon = Makineli Tüfek mech.javelin-ship.name = Javelin -mech.javelin-ship.weapon = Burst Missiles -mech.javelin-ship.ability = Discharge Booster +mech.javelin-ship.weapon = Çoklu Füzeler +mech.javelin-ship.ability = Deşarj Güçlendirici mech.trident-ship.name = Trident -mech.trident-ship.weapon = Bomb Bay +mech.trident-ship.weapon = Bomba Bölmesi mech.glaive-ship.name = Glaive -mech.glaive-ship.weapon = Flame Repeater +mech.glaive-ship.weapon = Alevli Makineli Tüfek item.explosiveness = [lightgray]Patlama: {0}% item.flammability = [lightgray]Yanıcılık: {0}% item.radioactivity = [lightgray]Radyoaktivite: {0}% @@ -710,65 +763,64 @@ mech.health = [lightgray]Can: {0} mech.itemcapacity = [lightgray]Eşya Kapasitesi: {0} mech.minespeed = [lightgray]Kazma Hızı: {0}% mech.minepower = [lightgray]Kazma Gücü: {0} -mech.ability = [lightgray]Kabiliyet: {0} -mech.buildspeed = [lightgray]Building Speed: {0}% -liquid.heatcapacity = [lightgray]Heat Capacity: {0} -liquid.viscosity = [lightgray]Viscosity: {0} -liquid.temperature = [lightgray]Temperature: {0} - +mech.ability = [lightgray]Yetenek: {0} +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 block.saltrocks.name = Tuz Taşları block.pebbles.name = Çakıl Taşları -block.tendrils.name = Tendrils +block.tendrils.name = Tendriller block.sandrocks.name = Kum Kayaları block.spore-pine.name = Spor Çamı block.sporerocks.name = Spor Kayaları block.rock.name = Kaya block.snowrock.name = Karlı Kaya block.snow-pine.name = Karlı Çam -block.shale.name = Shale -block.shale-boulder.name = Shale Boulder +block.shale.name = Şist +block.shale-boulder.name = Şist Kayası block.moss.name = Yosun -block.shrubs.name = Shrubs -block.spore-moss.name = Spor Yos -block.shalerocks.name = Shale Rocks +block.shrubs.name = Çalılık +block.spore-moss.name = Liken +block.shalerocks.name = Şist Kayaları block.scrap-wall.name = Hurda Duvar block.scrap-wall-large.name = Büyük Hurda Duvar block.scrap-wall-huge.name = Dev Hurda Duvar block.scrap-wall-gigantic.name = Devasa Hurda Duvar -block.thruster.name = İticiler -block.kiln.name = Tuğla Ocağı -block.graphite-press.name = Grafit Basıcısı -block.multi-press.name = Çoklu-Basıcı -block.constructing = {0} [lightgray](İnşaat Ediliyor) -block.spawn.name = Enemy Spawn -block.core-shard.name = Merkez: Shard -block.core-foundation.name = Merkez: Foundation -block.core-nucleus.name = Merkez: Nucleus +block.thruster.name = İtici +block.kiln.name = Fırın +block.graphite-press.name = Grafit Presi +block.multi-press.name = Çoklu-Pres +block.constructing = {0} [lightgray](İnşa Ediliyor) +block.spawn.name = Düşman Doğma Noktası +block.core-shard.name = Merkez: Parçacık +block.core-foundation.name = Merkez: Temel +block.core-nucleus.name = Merkez: Çekirdek block.deepwater.name = Derin Su block.water.name = Su -block.tainted-water.name = Lekeli Su -block.darksand-tainted-water.name = Kara Kum Lekeli Su +block.tainted-water.name = Kirli Su +block.darksand-tainted-water.name = Kara Kumlu Kirli Su block.tar.name = Katran block.stone.name = Taş block.sand.name = Kum block.darksand.name = Kara Kum block.ice.name = Buz block.snow.name = Kar -block.craters.name = Kraterler +block.craters.name = Krater block.sand-water.name = Kumlu Su -block.darksand-water.name = Siyah Kumlu Su +block.darksand-water.name = Kara Kumlu Su block.char.name = Kömür -block.holostone.name = Holo stone -block.ice-snow.name = Ice Snow -block.rocks.name = Kayalar -block.icerocks.name = Ice rocks -block.snowrocks.name = Snow Rocks -block.dunerocks.name = Dune Rocks -block.pine.name = Pine -block.white-tree-dead.name = Ölmüş Beyaz Ağaç +block.holostone.name = Holotaş +block.ice-snow.name = Buzlu Kar +block.rocks.name = Duvar +block.icerocks.name = Buz Duvarı +block.snowrocks.name = Kar Duvarı +block.dunerocks.name = Çöl Duvarı +block.pine.name = Çam +block.white-tree-dead.name = Ölü Beyaz Ağaç block.white-tree.name = Beyaz Ağaç block.spore-cluster.name = Spor Kümesi block.metal-floor.name = Metal Zemin 1 @@ -783,18 +835,20 @@ block.dark-panel-4.name = Kara Panel 4 block.dark-panel-5.name = Kara Panel 5 block.dark-panel-6.name = Kara Panel 6 block.dark-metal.name = Kara Metal -block.ignarock.name = Igna Rock +block.ignarock.name = Eriyik Kaya block.hotrock.name = Sıcak Kaya block.magmarock.name = Magma Kayası -block.cliffs.name = Cliffs +block.cliffs.name = Uçurumlar block.copper-wall.name = Bakır Duvar block.copper-wall-large.name = Büyük Bakır Duvar block.titanium-wall.name = Titanyum Duvar 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 = Thoryum Duvar -block.thorium-wall-large.name = Büyük Thoryum Duvar +block.thorium-wall.name = Toryum Duvar +block.thorium-wall-large.name = Büyük Toryum Duvar block.door.name = Kapı block.door-large.name = Büyük Kapı block.duo.name = Duo @@ -805,30 +859,31 @@ block.lancer.name = Lancer block.conveyor.name = Konveyör block.titanium-conveyor.name = Titanyum Konveyör block.armored-conveyor.name = Zırhlı Konveyör -block.armored-conveyor.description = Moves items at the same speed as titanium conveyors, but possesses more armor. Does not accept inputs from the sides from anything but other conveyors. +block.armored-conveyor.description = Materyalleri titanyum konveyörlerle aynı hızda taşır ama daha fazla zırha sahiptir. Diğer konveyörler dışında yan taraflardan materyal kabul etmez. block.junction.name = Kavşak block.router.name = Yönlendirici block.distributor.name = Dağıtıcı block.sorter.name = Ayıklayıcı +block.inverted-sorter.name = Ters Ayıklayıcı block.message.name = Mesaj block.overflow-gate.name = Taşma Geçiti -block.silicon-smelter.name = Silikon Isıtıcısı -block.phase-weaver.name = Faz Dokumacı -block.pulverizer.name = Pulvarizör -block.cryofluidmixer.name = Cryofluid Mikseri +block.silicon-smelter.name = Silikon Fırını +block.phase-weaver.name = Faz Örücü +block.pulverizer.name = Pulverizatör +block.cryofluidmixer.name = Kriyosıvı Mikseri block.melter.name = Eritici block.incinerator.name = Yakıcı -block.spore-press.name = Spor Basıcısı +block.spore-press.name = Spor Presi block.separator.name = Ayırıcı block.coal-centrifuge.name = Kömür Santrifüjü block.power-node.name = Enerji Noktası block.power-node-large.name = Büyük Enerji Noktası -block.surge-tower.name = Dalgalanma Kulesi +block.surge-tower.name = Akı Kulesi block.battery.name = Batarya block.battery-large.name = Büyük Batarya -block.combustion-generator.name = Yanma Jeneratörü +block.combustion-generator.name = Termik Jeneratör block.turbine-generator.name = Buhar Jeneratörü -block.differential-generator.name = Diferansiyel Jeneratör +block.differential-generator.name = Diferansiyel Jeneratörü block.impact-reactor.name = Patlama Reaktörü block.mechanical-drill.name = Mekanik Matkap block.pneumatic-drill.name = Hava Basınçlı Matkap @@ -836,12 +891,12 @@ block.laser-drill.name = Lazer Matkap block.water-extractor.name = Su Çıkarıcı block.cultivator.name = Ekici block.dart-mech-pad.name = Alpha -block.delta-mech-pad.name = Delta Mech Pad -block.javelin-ship-pad.name = Javelin Ship Pad -block.trident-ship-pad.name = Trident Ship Pad -block.glaive-ship-pad.name = Glaive Ship Pad -block.omega-mech-pad.name = Omega Mech Pad -block.tau-mech-pad.name = Tau Mech Pad +block.delta-mech-pad.name = Delta Robot Rampası +block.javelin-ship-pad.name = Javelin Gemi Rampası +block.trident-ship-pad.name = Trident Gemi Rampası +block.glaive-ship-pad.name = Glaive Gemi Rampası +block.omega-mech-pad.name = Omega Robot Rampası +block.tau-mech-pad.name = Tau Robot Rampası block.conduit.name = Boru block.mechanical-pump.name = Mekanik Pompa block.item-source.name = Sonsuz Eşya Kaynağı @@ -855,55 +910,55 @@ block.wave.name = Wave block.swarmer.name = Swarmer block.salvo.name = Salvo block.ripple.name = Ripple -block.phase-conveyor.name = Phase Conveyor -block.bridge-conveyor.name = Bridge Conveyor -block.plastanium-compressor.name = Plastanium Compressor -block.pyratite-mixer.name = Pyratite Mixer -block.blast-mixer.name = Blast Mixer +block.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 +block.blast-mixer.name = Patlayıcı Bileşik Mikseri block.solar-panel.name = Güneş Paneli block.solar-panel-large.name = Büyük Güneş Paneli block.oil-extractor.name = Petrol Çıkarıcı -block.command-center.name = Komut Merkezi -block.draug-factory.name = Draug Miner Drone Factory -block.spirit-factory.name = Spirit Repair Drone Factory -block.phantom-factory.name = Phantom Builder Drone Factory -block.wraith-factory.name = Wraith Fighter Factory -block.ghoul-factory.name = Ghoul Bomber Factory -block.dagger-factory.name = Dagger Mech Factory -block.crawler-factory.name = Crawler Mech Factory -block.titan-factory.name = Titan Mech Factory -block.fortress-factory.name = Fortress Mech Factory -block.revenant-factory.name = Revenant Fighter Factory -block.repair-point.name = Repair Point -block.pulse-conduit.name = Pulse Conduit -block.phase-conduit.name = Phase Conduit +block.command-center.name = Komuta Merkezi +block.draug-factory.name = Draug Maden Dronu Fabrikası +block.spirit-factory.name = Spirit Tamir Dronu Fabrikası +block.phantom-factory.name = Phantom İnşaat Dronu Fabrikası +block.wraith-factory.name = Wraith Avcı Uçağı Fabrikası +block.ghoul-factory.name = Ghoul Bombardıman Uçağı Fabrikası +block.dagger-factory.name = Dagger Robot Fabrikası +block.crawler-factory.name = Crawler Robot Fabrikası +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.phase-conduit.name = Faz Borusu block.liquid-router.name = Sıvı Yönlendiricisi block.liquid-tank.name = Sıvı Tankı block.liquid-junction.name = Sıvı Kavşağı block.bridge-conduit.name = Köprülü Boru block.rotary-pump.name = Rotary Pompa block.thorium-reactor.name = Toryum Reaktörü -block.mass-driver.name = Mass Driver -block.blast-drill.name = Airblast Drill +block.mass-driver.name = Kütle Sürücüsü +block.blast-drill.name = Hava Patlamalı Matkap block.thermal-pump.name = Termal Pompa block.thermal-generator.name = Termal Jeneratör -block.alloy-smelter.name = Alaşım Karıştırıcısı +block.alloy-smelter.name = Alaşım Fırını block.mender.name = Tamirci block.mend-projector.name = Büyük Tamirci -block.surge-wall.name = Surge Wall -block.surge-wall-large.name = Large Surge Wall +block.surge-wall.name = Akı Duvarı +block.surge-wall-large.name = Büyük Akı Duvarı block.cyclone.name = Cyclone block.fuse.name = Fuse -block.shock-mine.name = Shock Mine -block.overdrive-projector.name = Overdrive Projector -block.force-projector.name = Force Projector +block.shock-mine.name = Şok Mayını +block.overdrive-projector.name = Aşırı Yükleme Projektörü +block.force-projector.name = Kalkan Projektörü block.arc.name = Arc -block.rtg-generator.name = RTG Jeneratör +block.rtg-generator.name = RTG Jeneratörü block.spectre.name = Spectre block.meltdown.name = Meltdown -block.container.name = Container -block.launch-pad.name = Launch Pad -block.launch-pad-large.name = Large Launch Pad +block.container.name = Konteyner +block.launch-pad.name = Kalkış Pisti +block.launch-pad-large.name = Büyük Kalkış Pisti team.blue.name = mavi team.crux.name = kırmızı team.sharded.name = turuncu @@ -911,14 +966,14 @@ team.orange.name = turuncu team.derelict.name = derelict team.green.name = yeşil team.purple.name = mor -unit.spirit.name = Spirit Repair Drone -unit.draug.name = Draug Miner Drone -unit.phantom.name = Phantom Builder Drone +unit.spirit.name = Spirit Tamir Dronu +unit.draug.name = Draug Maden Dronu +unit.phantom.name = Phantom İnşaat Dronu unit.dagger.name = Dagger unit.crawler.name = Crawler unit.titan.name = Titan -unit.ghoul.name = Ghoul Bomber -unit.wraith.name = Wraith Fighter +unit.ghoul.name = Ghoul Bombardıman Uçağı +unit.wraith.name = Wraith Avcı Uçağı unit.fortress.name = Fortress unit.revenant.name = Revenant unit.eruptor.name = Eruptor @@ -927,81 +982,81 @@ unit.eradicator.name = Eradicator 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ız. Bunu yapmak için merkezinize yakın bir bakır madenine dokunun.\n\n[accent]{0}/{1} bakır -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ştiriniz.\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 []otomatikman kazabilir.\nSağ alttaki matkap sekmesine dokununuz.\n[accent]Mekanik matkabı[] seçiniz. \nDokunarak bir bakır madenine yerleştiriniz, sonra seçiminizi onaylamak için alttaki [accent] tik düğmesine[] basınız.\nYerleştirmenizi iptal etmek için [accent] X butonuna[] basınız. -tutorial.blockinfo = Her bloğun farklı istatistikleri vardır. Her matkap sadece belirli madenleri kazabilir.\nBir bloğun bilgi ve istastiklerine bakmak için,[accent] yapım menüsünde seçerken "?" tuşuna dokununuz.[]\n\n[accent]Şimdi Mekanik Matkap'ın istatistiklerine erişiniz.[] -tutorial.conveyor = [accent]Konveyörler[] merkeze eşyaları ulaştırmak için kullanılır.\nMatkaptan merkeze konveyörlerden oluşan bir sıra yapınız.\n[accent]Bir sıra halinde yerleştirmek için farenizi basılı tutunuz.[]\nÇaprazlama bir yol konveyör yerleştirmek için [accent]CTRL[] tuşunu basılı tutunuz.\n\n[accent]Sıra aracı ile 2 konveyör yerleştirin, sonra bir eşyayı merkeze götürün. -tutorial.conveyor.mobile = [accent]Konveyörler[] merkeze eşyaları ulaştırmak için kullanılır.\nMatkaptan merkeze konveyörlerden oluşan bir sıra yapınız.\n[accent] Bir sıra halinde yerleştirmek için parmağınızı birkaç saniye basılı tutup[] bir yöne çekin.\n\n[accent]Sıra aracı ile 2 konveyör yerleştirin, sonra bir eşyayı merkeze götürün. -tutorial.turret = Bir eşya merkezinize girdiğinde, inşa için kullanılabilir.\nHer eşyaların sadece inşa için kullanılmadığını aklınızda tutunuz.\nİnşa için kullanılmayan eşyalar,[accent] kömür[] ya da[accent] hurda[] gibileri merkeze konulamaz.\n[lightgray]Düşmanı[] püskürtmek için savunma yapıları inşa edilmelidir.\nÜssünüze yakın bir yerde [accent] duo kulesi[] inşa ediniz. -tutorial.drillturret = Duo turrets require[accent] copper ammo []to shoot.\nPlace a drill near the turret.\nLead conveyors into the turret to supply it with copper.\n\n[accent]Ammo delivered: 0/1 -tutorial.pause = During battle, you are able to[accent] pause the game.[]\nYou may queue buildings while paused.\n\n[accent]Press space to pause. -tutorial.pause.mobile = During battle, you are able to[accent] pause the game.[]\nYou may queue buildings while paused.\n\n[accent]Press this button in the top left to pause. -tutorial.unpause = Now press space again to unpause. -tutorial.unpause.mobile = Now press it again to unpause. -tutorial.breaking = Blocks frequently need to be destroyed.\n[accent]Hold down right-click[] to destroy all blocks in a selection.[]\n\n[accent]Destroy all the scrap blocks to the left of your core using area selection. -tutorial.breaking.mobile = Blocks frequently need to be destroyed.\n[accent]Select deconstruction mode[], then tap a block to begin breaking it.\nDestroy an area by holding down your finger for a few seconds[] and dragging in a direction.\nPress the checkmark button to confirm breaking.\n\n[accent]Destroy all the scrap blocks to the left of your core using area selection. -tutorial.withdraw = In some situations, taking items directly from blocks is necessary.\nTo do this, [accent]tap a block[] with items in it, then [accent]tap the item[] in the inventory.\nMultiple items can be withdrawn by [accent]tapping and holding[].\n\n[accent]Withdraw some copper from the core.[] -tutorial.deposit = Deposit items into blocks by dragging from your ship to the destination block.\n\n[accent]Deposit your copper back into the core.[] -tutorial.waves = The[lightgray] enemy[] approaches.\n\nDefend the core for 2 waves.[accent] Click[] to shoot.\nBuild more turrets and drills. Mine more copper. -tutorial.waves.mobile = The[lightgray] enemy[] approaches.\n\nDefend the core for 2 waves. Your ship will automatically fire at enemies.\nBuild more turrets and drills. Mine more copper. -tutorial.launch = Once you reach a specific wave, you are able to[accent] launch the core[], leaving your defenses behind and[accent] obtaining all the resources in your core.[]\nThese resources can then be used to research new technology.\n\n[accent]Press the launch button. - +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.[] +tutorial.conveyor = [accent]Konveyörler[] merkeze eşyaları ulaştırmak için kullanılır.\nMatkaptan merkeze konveyörlerden oluşan bir sıra yapın.\n[accent]Bir sıra halinde yerleştirmek için farenizi basılı tutun.[]\nÇaprazlama bir yol konveyör yerleştirmek için [accent]CTRL[] tuşunu basılı tutun.\n\n[accent]Sıra aracı ile 2 konveyör yerleştirin, sonra bir eşyayı merkeze götürün. +tutorial.conveyor.mobile = [accent]Konveyörler[] merkeze eşyaları ulaştırmak için kullanılır.\nMatkaptan merkeze konveyörlerden oluşan bir sıra yapın.\n[accent] Bir sıra halinde yerleştirmek için parmağınızı birkaç saniye basılı tutup[] bir yöne çekin.\n\n[accent]Sıra aracı ile 2 konveyör yerleştirin, sonra bir eşyayı merkeze götürün. +tutorial.turret = Bir eşya merkezinize girdiğinde, inşa için kullanılabilir.\nHer eşyaların sadece inşa için kullanılmadığını aklınızda tutun.\nİnşa için kullanılmayan eşyalar,[accent] kömür[] ya da[accent] hurda[] gibi materyaller merkeze konulamaz.\n[lightgray]Düşmanı[] püskürtmek için savunma yapıları inşa edilmelidir.\nÜssünüze yakın bir yerde [accent] duo tareti[] inşa edin. +tutorial.drillturret = Duo taretleri ateş etmek için [accent]bakır mühimmata[] ihtiyaç duyar.\nTaretin yakınına bir matkap yerleştirin.\nKonveyörleri tarete yönelterek tarete bakır ikmal edin.\n\n[accent]İkmal edilen mühimmat: 0/1 +tutorial.pause = Mücadele sırasında [accent]oyunu durdurabilirsiniz.[]\nOyun durmaktayken inşaat emirlerini kuyruğa alabilirsiniz.\n\n[accent]Oyunu durdurmak için boşluk tuşuna basın. +tutorial.pause.mobile = Mücadele sırasında [accent]oyunu durdurabilirsiniz.[]\nOyun durmaktayken inşaat emirlerini kuyruğa alabilirsiniz.\n\n[accent]Oyunu durdurmak için sol üstteki bu butona basın. +tutorial.unpause = Şimdi devam etmek için boşluk tuşuna tekrar basın. +tutorial.unpause.mobile = Şimdi devam etmek için butona tekrar basın. +tutorial.breaking = Blokların sık sık yok edilmesi gerekir.\n[accent]Sağ fare butonuna basılı tutarak[] bir alan içindeki blokları seçip yok edebilirsiniz.[]\n\n[accent]Çekirdeğinizin solundaki bütün hurda bloklarını bu şekilde yok edin. +tutorial.breaking.mobile = Blokların sık sık yok edilmesi gerekir.\n[accent]Yıkım modunu seçin[], sonra bir bloğa dokunarak onu yok edin. Ekrana birkaç saniye basılı tutarak bir alan içindeki blokları seçip yok edebilirsiniz.\nTik butonuna basarak yıkım işlemini onaylayın.\n\n[accent]Çekirdeğinizin solundaki bütün hurda bloklarını bu şekilde yok edin. +tutorial.withdraw = Bazı durumlarda bloklardan materyalleri direkt olarak almak gerekir.\nBunun için önce içinde materyaller olan [accent]bir bloğa dokunun[], sonra envanterdeki [accent]malzemeye dokunun[].\n[accent]dokunup basılı tutarak[] birden fazla materyali alabilirsiniz.\n\nÇekirdekten biraz bakır alın. +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. 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 depolama için yaygın olarak 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. item.graphite.description = Mineralize karbon. Mermi ve elektrik yalıtımında kullanılır. -item.sand.description = Hem alaşımda hem de akı halinde eritme işlemlerinde kullanılan bir malzeme. -item.coal.description = Fosilleşmiş bitki maddesi, tohumlama olayından çok önce oluşmuş. Yaygın olarak yakıt ve kaynak üretimi için kullanılır. -item.titanium.description = Yaygın olarak sıvı taşımacılığında, matkaplarda ve uçaklarda kullanılan nadir bir süper-hafif metal. +item.sand.description = Hem alaşım yapmada hem de arıtkan olarak metalurji işlemlerinde kullanılan bir malzeme. +item.coal.description = Tohumlama olayından çok önce oluşmuş, fosilleşmiş bitki maddesi. Yaygın olarak yakıt ve kaynak üretimi için kullanılır. +item.titanium.description = Yaygın olarak sıvı taşımada, matkaplarda ve uçaklarda kullanılan nadir bir süper-hafif metal. item.thorium.description = Yapısal destek ve nükleer yakıt olarak kullanılan yoğun, radyoaktif bir metal. item.scrap.description = Eski yapılar ve birimlerin kalıntıları. Birçok farklı metalden eser miktarları içerir. -item.silicon.description = Kullanışlı bir yarı iletken. Güneş panellerinde, elektronikler ve hedef taret cephanesi için kullanılır. +item.silicon.description = Kullanışlı bir yarı iletken. Güneş panellerinde, elektronikler ve güdümlü cephanesi için kullanılır. item.plastanium.description = Gelişmiş uçak ve parçalama için kullanılan hafif, sünek bir malzeme. -item.phase-fabric.description = Gelişmiş elektronik ve kendi kendini tamir eden teknolojide kullanılan ağırlıksız bir madde. -item.surge-alloy.description = Elektriksel özelliklere sahip gelişmiş bir alaşım. -item.spore-pod.description = Endüstriyel amaçlar için atmosferik konsantrasyonlardan sentezlenen sentetik sporların bir kapsülü. Yağ, patlayıcı ve yakıt haline dönüştürmek için kullanılır. +item.phase-fabric.description = Gelişmiş elektronik ve kendi kendini tamir etme teknolojisınde kullanılan neredeyse ağırlıksız bir madde. +item.surge-alloy.description = Kendine özgü elektriksel özelliklere sahip gelişmiş bir alaşım. +item.spore-pod.description = Endüstriyel kullanım için atmosferik partiküllerden üretilen sentetik sporlarla dolu bir kapsül. Yağ, patlayıcı ve yakıt yapımı için kullanılır. item.blast-compound.description = Bomba ve patlayıcılarda kullanılan dengesiz bir bileşim. Spor kapsülleri ve diğer uçucu maddelerden sentezlenir. Yakıt olarak tavsiye edilmez. item.pyratite.description = Yakıcı silahlarda kullanılan son derece yanıcı bir madde. liquid.water.description = En kullanışlı sıvı. Makineleri soğutmak ve atık işlenmesi için kullanılır. -liquid.slag.description = Çeşitli tipte erimiş metallerin birbirine karışımı. Kurucu minerallerine ayrılabilir veya düşmanlara silah olarak püskürtülebilir. -liquid.oil.description = İleri seviye malzeme üretiminde kullanılan bir sıvıdır. Yakıt olarak kömür haline getirilebilir veya bir silah olarak püskürtülerek ateşe verilebilir. -liquid.cryofluid.description = Su ve titanyumdan oluşturulan aşındırıcı olmayan bir sıvı. Son derece yüksek ısı kapasitesine sahiptir. Soğutucu olarak yaygın olarak kullanılır. -mech.alpha-mech.description = Standart kontrol mekaniği. Yükseltilmiş zırh ve inşaat kabiliyetine sahip bir Dagger ünitesine dayanır. Dart gemisinden daha fazla hasara sahiptir. -mech.delta-mech.description = A fast, lightly-armored mech made for hit-and-run attacks. Does little damage against structures, but can kill large groups of enemy units very quickly with its arc lightning weapons. -mech.tau-mech.description = The support mech. Heals allied blocks by shooting at them. Can heal allies in a radius with its repair ability. -mech.omega-mech.description = A bulky and well-armored mech, made for front-line assaults. Its armor can block up to 90% of incoming damage. -mech.dart-ship.description = The standard control ship. Reasonably fast and light, but has little offensive capability and low mining speed. -mech.javelin-ship.description = A hit-and-run strike ship. While initially slow, it can accelerate to great speeds and fly by enemy outposts, dealing large amounts of damage with its lightning and missiles. -mech.trident-ship.description = A heavy bomber, built for construction and destroying enemy fortifications. Reasonably well armored. -mech.glaive-ship.description = A large, well-armored gunship. Equipped with an incendiary repeater. Highly maneuverable. -unit.draug.description = A primitive mining drone. Cheap to produce. Expendable. Automatically mines copper and lead in the vicinity. Delivers mined resources to the closest core. -unit.spirit.description = A modified draug drone, designed for repair instead of mining. Automatically fixes any damaged blocks in the area. -unit.phantom.description = An advanced drone unit. Follows users. Assists in block construction. -unit.dagger.description = The most basic ground mech. Cheap to produce. Overwhelming when used in swarms. -unit.crawler.description = A ground unit consisting of a stripped-down frame with high explosives strapped on top. Not particular durable. Explodes on contact with enemies. -unit.titan.description = An advanced, armored ground unit. Attacks both ground and air targets. Equipped with two miniature Scorch-class flamethrowers. -unit.fortress.description = A heavy artillery mech. Equipped with two modified Hail-type cannons for long-range assault on enemy structures and units. -unit.eruptor.description = A heavy mech designed to take down structures. Fires a stream of slag at enemy fortifications, melting them and setting volatiles on fire. -unit.wraith.description = A fast, hit-and-run interceptor unit. Targets power generators. -unit.ghoul.description = A heavy carpet bomber. Rips through enemy structures, targeting critical infrastructure. -unit.revenant.description = A heavy, hovering missile array. +liquid.slag.description = Çeşitli tipte erimiş metallerin birbirine karışımı. Bileşenlerine ayrılabilir veya düşmanlara silah olarak püskürtülebilir. +liquid.oil.description = İleri seviye malzeme üretiminde kullanılan bir sıvıdır. Yakıt olarak kömür haline getirilebilir veya püskürtülüp ateşe verilerek bir silah olarak kullanılabilir. +liquid.cryofluid.description = Su ve titanyumdan oluşturulan inaktif bir sıvı. Son derece yüksek ısı kapasitesine sahiptir. Soğutucu olarak yaygın olarak kullanılır. +mech.alpha-mech.description = Standart kontrol robotu. Yükseltilmiş zırh ve inşaat kabiliyetine sahip bir Dagger birimine dayanır. Dart gemisinden daha fazla hasara sahiptir. +mech.delta-mech.description = Vur kaç saldırıları için yapılmış, hızlı ve hafif bir robot. Yapılara minimal hasar verir ancak yıldırım silahlarıyla büyük düşman gruplarını kısa zamanda yok edebilir. +mech.tau-mech.description = Destek Robotu. Müttefik blokları hedef alarak onları tamir eder. Belirli bir yarıçap içindeki müttefikleri tamir yeteneği ile onarabilir. +mech.omega-mech.description = Ön cephe saldırılarında kullanılmak için yapılmış iri ve zırhlı bir robot. Zırhı gelen hasarın yüzde 90'ına kadarını durdurabilir. +mech.dart-ship.description = Standart kontrol gemisi. Hızlı ve hafiftir, ancak sınırlı saldırı gücüne ve yavaş kazma hızına sahiptir +mech.javelin-ship.description = Bir vur kaç saldırı gemisi. Başlangıçta yavaştır ancak oldukça yüksek hızlara erişip düşman sınırlarının üzerinden geçebilir, yıldırım ve füzeleriyle yüksek hasar verebilir. +mech.trident-ship.description = Yapım ve düşman savunmalarını yok etmek için inşa edilmiş ağır bir bombardıman gemisi. Kabul edilebilir derecede zırhlıdır. +mech.glaive-ship.description = Büyük, zırhlı bir silah gemisi. Yakıcı bir makineli tüfek ile donatılmıştır. Oldukça çeviktir. +unit.draug.description = İlkel bir maden dronu. Üretmesi ucuzdur ve gözden çıkarılabilirler. Etrafındaki bakır ve kurşunu kazar ve en yakın çekirdeğe taşır. +unit.spirit.description = Madencilik yerine yapısal onarım için tasarlanmış, modifiye bir draug dronu. Belirli bir alan içindeki hasarlı blokları tamir eder. +unit.phantom.description = Gelişmiş bir dron. Kullanıcıyı/Kullanıcıları takip eder ve blok inşaatında yardım eder. +unit.dagger.description = En basit yer birimi. Üretimi ucuzdur, sürüler halinde kullanıldığında etkilidir. +unit.crawler.description = Dış kısmı soyulup üstüne yüksek güçlü patlayıcılar bağlanmış bir yer birimi. Sağlam değildir ve düşmanlara temas halinde patlar. +unit.titan.description = Gelişmiş, zırhlı bir yer birimi. Hem hava hem kara hedeflerine saldırır. İki adet minyatür Scorch tipi alev püskürtücü ile donatılmıştır. +unit.fortress.description = Ağır bir topçu robotu. Düşman binalarına ve birimlerine uzaktan saldırmak için iki modifiye edilmiş Hail tipi havan topu ile donatılmıştır. +unit.eruptor.description = Yapıları yıkmak için tasarlanmış ağır bir robot. Düşman tahkimatlarına cüruf püskürterek onları eritir ve hassas materyalleri ateşe verir. +unit.wraith.description = Hızlı bir vur kaç avcı uçağı. Jeneratörleri hedef alır. +unit.ghoul.description = Ağır bir halı bombardıman birimi. Diğer düşman yapılarından yardırıp ilerleyerek kritik altyapıyı hedef alır. +unit.revenant.description = Ağır bir uçan roket bataryası. block.message.description = Bir mesajı saklar. Müttefikler arasındaki haberleşmede kullanılır. -block.graphite-press.description = Kömür parçalarını saf grafit tabakalarına sıkıştırır. -block.multi-press.description = Grafit baskı makinesinin yükseltilmiş versiyonu. Kömürün hızlı ve verimli bir şekilde işlenmesi için su ve enerji kullanır. -block.silicon-smelter.description = Saf kömürle kumu azaltır. Silikon üretir. -block.kiln.description = Kum ve kurşunu eritir ve metaglass olarak bilinen bileşiği oluşturur. Çalıştırmak için az miktarda enerji gerektirir. +block.graphite-press.description = Kömür parçalarını sıkıştırıp saf grafit tabakaları üretir. +block.multi-press.description = Grafit presinin yükseltilmiş versiyonu. Kömürün hızlı ve verimli bir şekilde işlenmesi için su ve enerji kullanır. +block.silicon-smelter.description = Kumu saf kömürle eritip silikon üretir. +block.kiln.description = Kum ve kurşunu eritir ve metacam olarak bilinen malzemeyi oluşturur. Çalıştırması için az miktar enerji gerekir. block.plastanium-compressor.description = Petrol ve titanyumdan plastanyum üretir. -block.phase-weaver.description = Faz kumaşını radyoaktif toryum ve kumdan sentezler. İşlev için büyük miktarda güç gerektirir. -block.alloy-smelter.description = Dalgalanma alaşımı üretmek için titanyum, kurşun, silikon ve bakırı birleştirir. -block.cryofluidmixer.description = Su ve titanyum tozunu cryofluid'e karıştırır. Toryum reaktörü kullanımı için önemlidir. -block.blast-mixer.description = Patlayıcı bileşiği üretmek için spor kümelerini pirratit ile ezer ve karıştırır. -block.pyratite-mixer.description = Kömür, kurşun ve kumu ile çok yanıcı olan pirratite üretir. -block.melter.description = Silah olarak kullanım veya daha çok işleme için hurdayı cürufta eritir. -block.separator.description = Cürufu mineral bileşenlerine ayırır. Soğutulmuş sonucu çıkarır. -block.spore-press.description = Yağı çıkartmak için aşırı basınç altında spor tüplerini sıkıştırır. -block.pulverizer.description = Hurdaları ince kuma ezer. -block.coal-centrifuge.description = Yağı kömür parçalarına katılaştırır. +block.phase-weaver.description = Kum ve radyoaktif toryumdan faz örgüsü üretir. Çalışması için çok miktarda enerji gerekir. +block.alloy-smelter.description = Akı alaşımı üretmek için titanyum, kurşun, silikon ve bakırı birleştirir. +block.cryofluidmixer.description = Su ve titanyum tozunu karıştırıp kriyosıvı üretir. Toryum reaktörü kullanımı için gereklidir. +block.blast-mixer.description = Patlayıcı bileşen üretmek için spor kapsüllerini pirratit ile ezer ve karıştırır. +block.pyratite-mixer.description = Kömür, kurşun ve kumu karıştırıp oldukça yanıcı olan pirratit üretir. +block.melter.description = Wave taretlerinde kullanılması veya daha çok işlemesi için hurdayı eritip cürufa çevirir. +block.separator.description = Cürufu mineral bileşenlerine ayırır. Soğutulmuş bileşenleri çıkarır. +block.spore-press.description = Yağ çıkartmak için aşırı basınç altında spor kapsüllerini sıkıştırır. +block.pulverizer.description = Hurdaları ezip kuma çevirir. +block.coal-centrifuge.description = Petrolü katılaştırıp kömür parçaları üretir. block.incinerator.description = Alınan fazlalıkları veya sıvıları buharlaştırır (yok eder). block.power-void.description = İçine konan enerjiyi yok eder. Sadece Yaratıcı Modda. block.power-source.description = Sonsuz enerji verir. Sadece Yaratıcı Modda. @@ -1009,101 +1064,104 @@ block.item-source.description = Seçilen eşyadan sonsuz verir. Sadece Yaratıc block.item-void.description = Verilen eşyaları yok eder. Sadece Yaratıcı Modda. block.liquid-source.description = Seçilen sıvıyı sonsuz verir. Sadece Yaratıcı Modda. block.copper-wall.description = Ucuz bir savunma bloğu.\nİlk birkaç dalgada merkezi ve silahları korumak için kullanışlıdır. -block.copper-wall-large.description = Ucuz bir savunma bloğu.\nİlk birkaç dalgada merkezi ve silahları korumak için kullanışlıdır.\nBirçok blok alan kaplar. +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 bazlı yansıtıcı bileşik ile kaplanmış bir duvar. Çoğu mermi çarpma anında saptırır. +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. block.phase-wall-large.description = Özel faz bazlı yansıtıcı bileşik ile kaplanmış bir duvar. Çoğu mermi çarpma anında saptırır.\nBirçok blok alan kaplar. -block.surge-wall.description = Son derece dayanıklı bir savunma bloğu.\nMermi temasıyla yükü yükseltir ve rastgele serbest bırakır. -block.surge-wall-large.description = Son derece dayanıklı bir savunma bloğu.\nMermi temasıyla yükü yükseltir ve rastgele serbest bırakır.\nBirçok blok alan kaplar. +block.surge-wall.description = Son derece dayanıklı bir savunma bloğu.\nMermi temasıyla yükü toplar ve bu yükü rastgele serbest bırakır. +block.surge-wall-large.description = Son derece dayanıklı bir savunma bloğu.\nMermi temasıyla yükü toplar ve bu yükü rastgele serbest bırakır.\nBirçok blok alan kaplar. block.door.description = Küçük bir kapı. Dokunarak açılabilir veya kapatılabilir. block.door-large.description = Büyük bir kapı. Dokunarak açılabilir veya kapatılabilir.\nBirçok blok alan kaplar. -block.mender.description = Çevresindeki blokları periyodik olarak tamir eder. Savunmaları dalgalar arasında tamir eder.\nİsteğe bağlı olarak menzili ve verimi arttırmak için silikon kullanın. -block.mend-projector.description = Mender'ın yükseltilmiş bir versiyonu. Çevresindeki blokları onarır. İsteğe bağlı olarak menzili ve verimliliği artırmak için faz kumaşı kullanılır. -block.overdrive-projector.description = Yakındaki binaların hızını artırır.\nİsteğe bağlı olarak bir dizi ve verimliliğini artırmak için faz kumaş kullanır. -block.force-projector.description = Kendi etrafında altıgen güç alanı oluşturur. Çok fazla zarar gördüğünde aşırı ısınır ve kapanır. İsteğe bağlı olarak aşırı ısınmasını önlemek için soğutma sıvısı kullanılabilir. Faz kumaş koruyucu boyutunu artırmak için kullanılabilir. -block.shock-mine.description = Damages enemies stepping on the mine. Nearly invisible to the enemy. -block.conveyor.description = Basic item transport block. Moves items forward and automatically deposits them into blocks. Rotatable. -block.titanium-conveyor.description = Advanced item transport block. Moves items faster than standard conveyors. -block.junction.description = Acts as a bridge for two crossing conveyor belts. Useful in situations with two different conveyors carrying different materials to different locations. -block.bridge-conveyor.description = Advanced item transport block. Allows transporting items over up to 3 tiles of any terrain or building. -block.phase-conveyor.description = Advanced item transport block. Uses power to teleport items to a connected phase conveyor over several tiles. -block.sorter.description = Sorts items. If an item matches the selection, it is allowed to pass. Otherwise, the item is outputted to the left and right. -block.router.description = Accepts items, then outputs them to up to 3 other directions equally. Useful for splitting the materials from one source to multiple targets.\n\n[scarlet]Never use next to production inputs, as they will get clogged by output.[] -block.distributor.description = An advanced router. Splits items to up to 7 other directions equally. -block.overflow-gate.description = A combination splitter and router. Only outputs to the left and right if the front path is blocked. -block.mass-driver.description = The ultimate item transport block. Collects several items and then shoots them to another mass driver over a long range. Requires power to operate. -block.mechanical-pump.description = A cheap pump with slow output, but no power consumption. -block.rotary-pump.description = An advanced pump. Pumps more liquid, but requires power. -block.thermal-pump.description = The ultimate pump. -block.conduit.description = Basic liquid transport block. Moves liquids forward. Used in conjunction with pumps and other conduits. -block.pulse-conduit.description = An advanced liquid transport block. Transports liquids faster and stores more than standard conduits. -block.liquid-router.description = Accepts liquids from one direction and outputs them to up to 3 other directions equally. Can also store a certain amount of liquid. Useful for splitting the liquids from one source to multiple targets. -block.liquid-tank.description = Stores a large amount of liquids. Use for creating buffers in situations with non-constant demand of materials or as a safeguard for cooling vital blocks. -block.liquid-junction.description = Acts as a bridge for two crossing conduits. Useful in situations with two different conduits carrying different liquids to different locations. -block.bridge-conduit.description = Advanced liquid transport block. Allows transporting liquids over up to 3 tiles of any terrain or building. -block.phase-conduit.description = Advanced liquid transport block. Uses power to teleport liquids to a connected phase conduit over several tiles. -block.power-node.description = Transmits power to connected nodes. The node will receive power from or supply power to any adjacent blocks. -block.power-node-large.description = An advanced power node with greater range and more connections. -block.surge-tower.description = An extremely long-range power node with fewer available connections. -block.battery.description = Stores power as a buffer in times of surplus energy. Outputs power in times of deficit. -block.battery-large.description = Stores much more power than a regular battery. -block.combustion-generator.description = Generates power by burning flammable materials, such as coal. -block.thermal-generator.description = Generates power when placed in hot locations. -block.turbine-generator.description = An advanced combustion generator. More efficient, but requires additional water for generating steam. -block.differential-generator.description = Generates large amounts of energy. Utilizes the temperature difference between cryofluid and burning pyratite. -block.rtg-generator.description = A simple, reliable generator. Uses the heat of decaying radioactive compounds to produce energy at a slow rate. -block.solar-panel.description = Güneşten küçük bir enerji üretir. -block.solar-panel-large.description = A significantly more efficient version of the standard solar panel. -block.thorium-reactor.description = Generates significant amounts of power from thorium. Requires constant cooling. Will explode violently if insufficient amounts of coolant are supplied. Power output depends on fullness, with base power generated at full capacity. -block.impact-reactor.description = An advanced generator, capable of creating massive amounts of power at peak efficiency. Requires a significant power input to kickstart the process. -block.mechanical-drill.description = A cheap drill. When placed on appropriate tiles, outputs items at a slow pace indefinitely. Only capable of mining basic resources. -block.pneumatic-drill.description = An improved drill, capable of mining titanium. Mines at a faster pace than a mechanical drill. -block.laser-drill.description = Allows drilling even faster through laser technology, but requires power. Capable of mining thorium. -block.blast-drill.description = The ultimate drill. Requires large amounts of power. -block.water-extractor.description = Extracts groundwater. Used in locations with no surface water available. -block.cultivator.description = Cultivates tiny concentrations of spores in the atmosphere into industry-ready pods. -block.oil-extractor.description = Uses large amounts of power, sand and water to drill for oil. -block.core-shard.description = The first iteration of the core capsule. Once destroyed, all contact to the region is lost. Do not let this happen. -block.core-foundation.description = The second version of the core. Better armored. Stores more resources. -block.core-nucleus.description = The third and final iteration of the core capsule. Extremely well armored. Stores massive amounts of resources. -block.vault.description = Stores a large amount of items of each type. An unloader block can be used to retrieve items from the vault. -block.container.description = Stores a small amount of items of each type. An unloader block can be used to retrieve items from the container. -block.unloader.description = Unloads items from a container, vault or core onto a conveyor or directly into an adjacent block. The type of item to be unloaded can be changed by tapping. -block.launch-pad.description = Launches batches of items without any need for a core launch. -block.launch-pad-large.description = An improved version of the launch pad. Stores more items. Launches more frequently. -block.duo.description = A small, cheap turret. Useful against ground units. -block.scatter.description = An essential anti-air turret. Sprays clumps of lead or scrap flak at enemy units. -block.scorch.description = Burns any ground enemies close to it. Highly effective at close range. -block.hail.description = A small, long-range artillery turret. -block.wave.description = A medium-sized turret. Shoots streams of liquid at enemies. Automatically extinguishes fires when supplied with water. -block.lancer.description = A medium-sized anti-ground laser turret. Charges and fires powerful beams of energy. -block.arc.description = A small close-range electric turret. Fires arcs of electricity at enemies. -block.swarmer.description = A medium-sized missile turret. Attacks both air and ground enemies. Fires homing missiles. -block.salvo.description = A larger, more advanced version of the Duo turret. Fires quick salvos of bullets at the enemy. -block.fuse.description = A large, close-range energy turret. Fires three piercing beams at nearby enemies. -block.ripple.description = An extremely powerful artillery turret. Shoots clusters of shells at enemies over long distances. -block.cyclone.description = A large anti-air and anti-ground turret. Fires explosive clumps of flak at nearby units. -block.spectre.description = A massive dual-barreled cannon. Shoots large armor-piercing bullets at air and ground targets. -block.meltdown.description = A massive laser cannon. Charges and fires a persistent laser beam at nearby enemies. Requires coolant to operate. -block.command-center.description = Issues movement commands to allied units across the map.\nCauses units to patrol, attack an enemy core or retreat to the core/factory. When no enemy core is present, units will default to patrolling under the attack command. -block.draug-factory.description = Produces Draug mining drones. -block.spirit-factory.description = Produces Spirit structural repair drones. -block.phantom-factory.description = Produces advanced construction drones. -block.wraith-factory.description = Produces fast, hit-and-run interceptor units. -block.ghoul-factory.description = Produces heavy carpet bombers. -block.revenant-factory.description = Produces heavy missile-based units. -block.dagger-factory.description = Produces basic ground units. -block.crawler-factory.description = Produces fast self-destructing swarm units. -block.titan-factory.description = Produces advanced, armored ground units. -block.fortress-factory.description = Produces heavy artillery ground units. -block.repair-point.description = Continuously heals the closest damaged unit in its vicinity. -block.dart-mech-pad.description = Provides transformation into a basic attack mech.\nUse by tapping while standing on it. -block.delta-mech-pad.description = Provides transformation into a lightly armored hit-and-run attack mech.\nUse by tapping while standing on it. -block.tau-mech-pad.description = Provides transformation into an advanced support mech.\nUse by tapping while standing on it. -block.omega-mech-pad.description = Provides transformation into a heavily-armored missile mech.\nUse by tapping while standing on it. -block.javelin-ship-pad.description = Provides transformation into a quick, lightly-armored interceptor.\nUse by tapping while standing on it. -block.trident-ship-pad.description = Provides transformation into a heavy support bomber.\nUse by tapping while standing on it. -block.glaive-ship-pad.description = Provides transformation into a large, well-armored gunship.\nUse by tapping while standing on it. +block.mender.description = Çevresindeki blokları periyodik olarak tamir eder. Savunmaları dalgalar arasında tamir eder.\nİsteğe bağlı olarak menzili ve verimi arttırmak için silikon kullanılabilir. +block.mend-projector.description = Tamircinin yükseltilmiş bir versiyonu. Çevresindeki blokları onarır.\nİsteğe bağlı olarak menzili ve verimliliği artırmak için faz örgüsü kullanılabilir. +block.overdrive-projector.description = Yakınındaki binaların hızını artırır.\nİsteğe bağlı olarak menzili ve verimliliği artırmak için faz örgüsü kullanılabilir. +block.force-projector.description = Kendi etrafında altıgen güç alanı oluşturur. Çok fazla zarar gördüğünde aşırı ısınır ve kapanır.\nİsteğe bağlı olarak aşırı ısınmasını önlemek için soğutma sıvısı,koruyucu boyutunu artırmak için ise faz örgüsü kullanılabilir. +block.shock-mine.description = Mayına basan düşmanlara hasar verir. Düşmana neredeyse görünmezdir. +block.conveyor.description = Temel materyal taşıma bloğu. Materyalleri ileri taşır ve onları diğer bloklara otomatik olarak yerleştirir. Çevrilebilir. +block.titanium-conveyor.description = Gelişmiş materyal taşıma bloğu. Materyalleri standart konveyörlerden daha hızlı taşır. +block.junction.description = Çakışan iki konveyör hattı arasında bir köprü görevi görür. İki farklı konveyörğn farklı hedeflere farklı materyalleri taşıdığı durumlarda kullanışlıdır. +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.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. +block.mass-driver.description = En gelişmiş materyal taşıma bloğu. bir miktar materyalı alır ve onları uzak mesafedeki bir başka kütle sürücüsüne ateşler. Çalışması için enerji gerekir. +block.mechanical-pump.description = Hiç enerji harcamayan, düşük çıktılı, ucuz bir pompa. +block.rotary-pump.description = Daha gelişmiş bir pompa. Daha fazla sıvı depolar ama çalışması için enerji gerekir. +block.thermal-pump.description = En iyi pompa. +block.conduit.description = Temel sıvı taşıma bloğu. Sıvıları ileri taşır. Pompalar ve diğer borularla birlikte kullanılır. +block.pulse-conduit.description = Gelişmiş bir sıvı taşıma bloğu. Sıvıları normal borulardan daha hızlı taşır ve onlardan daha fazla sıvı alır. +block.liquid-router.description = Sıvıları bir yönden alıp diğer üç yöne eşit olarak dağıtır. Ayrıca kendisi de bir miktar sıvı depolayabilir. Sıvıları bir kaynaktan birden fazla hedefe iletmek için kullanılır. +block.liquid-tank.description = Çok miktarda sıvıyı depolar. İhtiyaçları devamlı olmayan sıvıları yedek olarak saklamakta ya da önemli blokların devamlı olarak soğutulmasında kullanılabilir. +block.liquid-junction.description = Çakışan iki boru hattı arasında bir köprü görevi görür. İki farklı borunun farklı hedeflere farklı sıvıları taşıdığı durumlarda kullanışlıdır. +block.bridge-conduit.description = Gelişmiş sıvı taşıma bloğu. Sıvıları her türlü arazi veya binanın üzerinden üç bloğa kadar uzağa taşıyabilir. +block.phase-conduit.description = Gelişmiş sıvı taşıma bloğu. Sıvıları kendisine bağlı başka bir faz borusuna ışınlamak için enerji kullanır. +block.power-node.description = Bağlı düğümlere enerji sağlar. Ayrıca dibindeki bloklardan da enerji alıp onlara enerji verebilir. +block.power-node-large.description = Daha fazla menzil ve bağlantıya sahip daha gelişmiş bir güç düğümü +block.surge-tower.description = Daha az bağlantı sayısına sahip oldukça uzun menzilli bir güç düğümü. +block.battery.description = Enerji fazlasını yedek olarak saklar. Enerji açığında sakladığı enerjiyi salar. +block.battery-large.description = Sıradan bataryadan çok daha fazla enerji depolar. +block.combustion-generator.description = Kömür gibi yanıcı materyalleri yakarak enerji üretir. +block.thermal-generator.description = Sıcak bölgelere konulduğunda enerji üretir. +block.turbine-generator.description = Daha gelişmiş bir termik jeneratör. Daha verimlidir, ama buhar üretebilmek için suya ihtiyaç duyar. +block.differential-generator.description = Çok miktarda enerji üretir. Kriyosıvı ve yanan pirratit arasındaki sıcaklık farkından yararlanır. +block.rtg-generator.description = Basit, güvenilir bir reaktör. Bozunan radyoaktif materyallerin ısısını kullanır. +block.solar-panel.description = Güneşten küçük miktarda enerji üretir. +block.solar-panel-large.description = Standart güneş panelinin daha verimli bir versiyonu. +block.thorium-reactor.description = Toryumdan, yüksek miktarda enerji üretir. Devamlı soğutulmaya ihtiyacı vardır. Yeterli soğutucu temin edilmezse şiddetle patlar. ürettiği enerji doluluk oranına bağlıdır, tam dolu iken temel düzeyde enerji üretir. +block.impact-reactor.description = Gelişmiş bir jeneratör, tam verimle dev miktarda enerji üretebilir. İşlemi başlatmak için dışarıdan bir miktar enerjiye ihtiyacı vardır. +block.mechanical-drill.description = Ucuz bir matkap. Doğru karelere konulduğunda, bir materyalden yavaş ama durmaksızın üretir. Sadece temel kaynaklardan kazabilir. +block.pneumatic-drill.description = Titanyumu kazabilen, daha gelişmiş bir matkap. Mekanik matkaptan daha hızlıdır. +block.laser-drill.description = Lazer teknolojisi sayesinde daha da hızlı kazmaya izin verir ancak çalışması için enerji gerekir. Toryumu kazabilir. +block.blast-drill.description = En iyi matkap. Çalışması için çok miktarda enerji gerekir. +block.water-extractor.description = Yeraltındaki suyu çıkarır. Hiç su bulunmayan yerlerde kullanılır. +block.cultivator.description = Atmosferdeki küçük spor partiküllerini büyütüp endüstriyel kullanıma hazır kapsüllere çevirir. +block.oil-extractor.description = Çokça enerji, su kullanarak yerden petrol çıkarır. +block.core-shard.description = Çekirdek kapsülünün ilk versiyonu. Yok edilirse, bölge ile bütün iletişim kesilir. Bunun olmasına izin verme. +block.core-foundation.description = Çekirdek kapsülünün ikinci versiyonu. Daha iyi zırhlı ve daha çok materyal depolayabilir. +block.core-nucleus.description = Çekirdek kapsülünün üçüncü ve son versiyonu. Aşırı derecede zırhlı ve dev miktarda materyal depolayabilir. +block.vault.description = Her materyalden az miktarda saklar. Materyalleri kasadan almak için bir boşaltıcı bloğu kullanılabilir. +block.container.description = Her materyalden az miktarda saklar. Materyalleri konteynerden almak için bir boşaltıcı bloğu kullanılabilir. +block.unloader.description = Materyalleri bir konteyner, kasa, veya çekirdekten çıkarıp; bir konveyöre veya dibindeki bir bloğa koyar. Çıkardığı materyal türü dokunularak değiştirilebilir. +block.launch-pad.description = Çekirdek kalkışına gerek duymadan materyalleri üsse gönderir. +block.launch-pad-large.description = Kalkış pistinin daha gelişmiş bir versiyonu. Daha fazla materyali daha sık gönderebilir. +block.duo.description = Küçük, ucuz bir taret. Yer birimlerine karşı etkilidir. +block.scatter.description = Önemli bir uçaksavar tareti. Düşman birimlerine hurda ya da kurşun uçaksavar mermileri atar. +block.scorch.description = Etrafındaki düşmanları ateşe verir. Yakın mesafede çok etkilidir. +block.hail.description = Küçük ve uzun menzilli bir havan tareti. +block.wave.description = Orta boyutta bir taret. Düşmanlara çeşitli sıvılar ateşler. Su temin edildiğinde yangınları otomatik olarak söndürür. +block.lancer.description = Orta boyutta karasavar bir lazer tareti. Yüklenip güçlü enerji ışınları yollar. +block.arc.description = Küçük ve kısa menzilli bir elektrik tareti. Düşmanlara yıldırım atar. +block.swarmer.description = Orta boyutta bir roketatar tareti. Hem hava hem de kara hedeflerine güdümlü füzeler gönderir. +block.salvo.description = Duo taretinin daha büyük ve daha gelişmiş bir versiyonu. Düşmana hızlı mermi salvoları atar. +block.fuse.description = Büyük, kısa menzilli bir enerji tareti. Yakınındaki düşmanlara üç delici ışın atar. +block.ripple.description = Çok güçlü bir havan tareti. Uzak mesafedeki düşmanlara gruplar halinde mermiler atar. +block.cyclone.description = Büyük bir anti hava ve anti kara tareti. Yakınındaki düşmanlara patlayıcı uçaksavar mermi kümeleri atar. +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 +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. +block.wraith-factory.description = Hızlı vur kaç birimleri üretir. +block.ghoul-factory.description = Ağır halı bombardıman birimleri üretir. +block.revenant-factory.description = Ağır roketatar birimleri üretir. +block.dagger-factory.description = Temel yer birimleri üretir. +block.crawler-factory.description = Kendini yok eden sürü birimleri üretir +block.titan-factory.description = Gelişmiş, zırhlı yer birimleri üretir. +block.fortress-factory.description = Ağır topçu birimleri üretir. +block.repair-point.description = Kendisine en yakın hasarlı birimi tamir eder. +block.dart-mech-pad.description = Temel saldırı gemisine dönüşmeyi sağlar.\nKullanmak için üzerindeyken rampaya basın. +block.delta-mech-pad.description = Hafif zırhlı bir vur kaç robotuna dönüşmeyi sağlar.\nKullanmak için üzerindeyken rampaya basın. +block.tau-mech-pad.description = Gelişmiş bir destek robotuna dönüşmeyi sağlar.\nKullanmak için üzerindeyken rampaya basın. +block.omega-mech-pad.description = Ağır zırhlı bir roketatar robotuna dönüşmeyi saplar.\nKullanmak için üzerindeyken rampaya basın. +block.javelin-ship-pad.description = Hızlı, hafif zırhlı bir saldırı gemisine dönüşmeyi sağlar.\nKullanmak için üzerindeyken rampaya basın. +block.trident-ship-pad.description = Ağır bir destek bombardıman gemisine dönüşmeyi sağlar.\nKullanmak için üzerindeyken rampaya basın. +block.glaive-ship-pad.description = Büyük, zırhlı bir silah gemisine dönüşmeyi sağlar.\nKullanmak için üzerindeyken rampaya basın. diff --git a/core/assets/bundles/bundle_uk_UA.properties b/core/assets/bundles/bundle_uk_UA.properties index aafae6c08f..c9b44e0183 100644 --- a/core/assets/bundles/bundle_uk_UA.properties +++ b/core/assets/bundles/bundle_uk_UA.properties @@ -2,7 +2,8 @@ credits.text = Створив [ROYAL]Anuken[] — [SKY]anukendev@gmail.com[]\n\n credits = Творці contributors = Перекладачі та помічники discord = Приєднуйтесь до Mindustry Discord! -link.discord.description = Офіційний Discord-сервер Mindustry +link.discord.description = Офіційний Discord сервер Mindustry +link.reddit.description = Гілка Mindustry на Reddit link.github.description = Вихідний код гри link.changelog.description = Список змін link.dev-builds.description = Нестабільні версії @@ -16,11 +17,29 @@ screenshot.invalid = Мапа занадто велика, тому, мабут gameover = Гра завершена gameover.pvp = [accent] {0}[] команда перемогла! highscore = [YELLOW]Новий рекорд! +copied = Скопійовано. load.sound = Звуки load.map = Мапи load.image = Зображення load.content = Зміст load.system = Система +load.mod = Модифікації +schematic = Схема +schematic.add = Зберегти схему... +schematics = Схеми +schematic.replace = Схема з такою ж назвою вже існує. Замінити її? +schematic.import = Імпортувати схему... +schematic.exportfile = Експортувати файл +schematic.importfile = Імпортувати файл +schematic.browseworkshop = Переглянути в Майстерні +schematic.copy = Копіювати в буфер обміну +schematic.copy.import = Імпортувати з клавіатури +schematic.shareworkshop = Поширити в Майстерні +schematic.flip = [accent][[{0}][]/[accent][[{1}][]: Flip Schematic +schematic.saved = Схема збережена. +schematic.delete.confirm = Ця схема буде повністю випалена. +schematic.rename = Перейменувати схему. +schematic.info = {0}x{1}, {2} блоків stat.wave = Хвиль відбито:[accent] {0} stat.enemiesDestroyed = Ворогів знищено:[accent] {0} stat.built = Будівель збудувано:[accent] {0} @@ -29,6 +48,7 @@ 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 = Вибір мапи @@ -40,11 +60,11 @@ database = База даних ядра savegame = Зберегти гру loadgame = Завантажити гру joingame = Мережева гра -addplayers = Додати/Видалити гравців customgame = Користувацька гра newgame = Нова гра none = <нічого> minimap = Мінімапа +position = Позиція close = Закрити website = Веб-сайт quit = Вихід @@ -60,6 +80,30 @@ uploadingcontent = Вивантаження вмісту uploadingpreviewfile = Вивантаження файлу передперегляду committingchanges = Здійснення змін done = Зроблено +feature.unsupported = Your device does not support this feature. +mods.alphainfo = Майте на увазі, що модифікації знаходяться в альфі, і [scarlet]можуть бути дуже глючними[].\nПовідомте про будь-які проблеми, які ви знайдете до Mindustry Github або Discord. +mods.alpha = [scarlet](Альфа) +mods = Модифікації +mods.none = [LIGHT_GRAY]Модифікацій не знайдено! +mods.guide = Посібник зі створення модифицій +mods.report = Повідомити про ваду +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.reloadrequired = [scarlet]Потрібно перезавантаження +mod.import = Імпортувати модифікацію +mod.import.github = Import Github Mod +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] собі ім’я[]. @@ -70,7 +114,7 @@ techtree = Дерево технологій research.list = [lightgray]Дослідження: research = Дослідження researched = [lightgray]{0} досліджено. -players = Гравців на сервері: {0} +players = Гравців: {0} players.single = {0} гравець на сервері server.closing = [accent]Закриття сервера… server.kicked.kick = Ви були вигнані з сервера! @@ -140,7 +184,6 @@ server.port = Порт: server.addressinuse = Ця адреса вже використовується! server.invalidport = Недійсний номер порту! server.error = [crimson]Помилка створення сервера: [accent]{0} -save.old = Це збереження для старої версії гри, і його більше не можна використовувати.\n\n [lightgray]Зворотна сумісність буде реалізована у фінальній версії 4.0. save.new = Нове збереження save.overwrite = Ви впевнені, що хочете перезаписати цей слот для збереження? overwrite = Перезаписати @@ -192,7 +235,12 @@ classic.export.text = Класичне (версія 3.5 збірка 40) збе quit.confirm = Ви впевнені, що хочете вийти? quit.confirm.tutorial = Ви впевнені, що хочете вийти з навчання? loading = [accent]Завантаження… +reloading = [accent]Reloading Mods... saving = [accent]Збереження… +cancelbuilding = [accent][[{0}][] to clear plan +selectschematic = [accent][[{0}][] to select+copy +pausebuilding = [accent][[{0}][] to pause building +resumebuilding = [scarlet][[{0}][] to resume building wave = [accent]Хвиля {0} wave.waiting = Хвиля через {0} wave.waveInProgress = [lightgray]Хвиля триває @@ -211,16 +259,18 @@ map.nospawn = Ця мапа не має жодного ядра для появ map.nospawn.pvp = У цієї мапи немає ворожих ядер, в яких гравець може з’явитися! Додайте [SCARLET]не помаранчеве[] ядро до цієї мапи в редакторі. map.nospawn.attack = У цієї мапи немає ворожих ядер, в яких гравець може з’явитися! Додайте [SCARLET]червоне[] ядро до цієї мапи в редакторі. map.invalid = Помилка завантаження мапи: пошкоджений або невірний файл мапи. -map.publish.error = Помилка при опублікуванні мапи: {0} -map.update = Оновити мапу -map.load.error = Помилка отримання даних з Майстерню: {0} -map.missing = Цю карту було видалено або переміщено.\n[lightgray]Перелік у Майстерні автоматично від’єднано від мапи. -map.menu = Виберіть, що ви хочете зробити з цією мапою. -map.changelog = Список змік (необов’язково): +workshop.update = Update Item +workshop.error = Error fetching workshop details: {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): eula = Ліцензійна угода -map.publish = Мапа опублікована. -map.publishing = [accent]Публікації мапи... +missing = This item has been deleted or moved.\n[lightgray]The workshop listing has now been automatically un-linked. +publishing = [accent]Publishing... +publish.confirm = Are you sure you want to publish this?\n\n[lightgray]Make sure you agree to the Workshop EULA first, or your items will not show up! +publish.error = Error publishing item: {0} +steam.error = Failed to initialize Steam services.\nError: {0} editor.brush = Пензлик editor.openin = Відкрити в редакторі editor.oregen = Генерація руд @@ -271,7 +321,7 @@ editor.apply = Застосувати editor.generate = Згенерувати editor.resize = Змінити\nрозмір editor.loadmap = Завантажити мапу -editor.savemap = Зберегти мапи +editor.savemap = Зберегти мапу editor.saved = Збережено! editor.save.noname = Ваша мапа не має імені! Встановіть його в «Інформація про мапу». editor.save.overwrite = Ваша мапа перезаписує вбудовану мапу! Виберіть інше ім’я в «Інформація про мапу». @@ -350,7 +400,6 @@ campaign = Кампанія load = Завантажити save = Зберегти fps = FPS: {0} -tps = TPS: {0} ping = Пінг: {0} мс language.restart = Будь ласка, перезапустіть свою гру, щоб налаштування мови набули чинності. settings = Налаштування @@ -358,12 +407,13 @@ tutorial = Навчання tutorial.retake = Відкрити навчання editor = Редактор mapeditor = Редактор мап -donate = Пожертву\nвання abandon = Покинути abandon.text = Ця зона і всі її ресурси будуть втрачені. locked = Заблоковано complete = [lightgray]Досягнута: -zone.requirement = Хвиля {0} у зоні {1} +requirement.wave = Reach Wave {0} in {1} +requirement.core = Destroy Enemy Core in {0} +requirement.unlock = Unlock {0} resume = Відновити зону:\n[lightgray]{0} bestwave = [lightgray]Найкраща хвиля: {0} launch = < ЗАПУСК > @@ -374,11 +424,13 @@ launch.confirm = Це видалить всі ресурси у Вашому я launch.skip.confirm = Якщо Ви пропустите зараз, Ви не зможете не запускати до більш пізніх хвиль. uncover = Розкрити configure = Вивантажити конфігурацію +bannedblocks = Banned Blocks +addall = Add All configure.locked = [lightgray]Можливість розблокувати вивантаження ресурсів буде доступна на {0}-тій хвилі. configure.invalid = Кількість повинна бути числом між 0 та {0}. zone.unlocked = Зона «[lightgray]{0}» тепер розблокована. zone.requirement.complete = Ви досягли {0}-тої хвилі,\nВимоги до зони «{1}» виконані. -zone.config.complete = Ви досягли {0}-тої хвилі.\nМожливість вивантаження ресурсів тепер розблокована. +zone.config.unlocked = Loadout unlocked:[lightgray]\n{0} zone.resources = Виявлені ресурси: zone.objective = [lightgray]Мета: [accent]{0} zone.objective.survival = Вижити @@ -434,15 +486,14 @@ settings.graphics = Графіка settings.cleardata = Очистити дані… settings.clear.confirm = Ви впевнені, що хочете очистити ці дані?\nЦя дія не може бути скасовано! settings.clearall.confirm = [scarlet]УВАГА![]\nЦе очистить всі дані, включаючи збереження, мапи, розблоковане та налаштування керування.\nПісля того, як ви натиснете ОК, гра видалить усі дані та автоматично закриється. -settings.clearunlocks = Очистити розблоковане -settings.clearall = Очистити все paused = Пауза +clear = Clear +banned = [scarlet]Banned yes = Так no = Ні info.title = Інформація error.title = [crimson]Виникла помилка error.crashtitle = Виникла помилка -attackpvponly = [scarlet]Наявне тільки у режимах атаки/PvP blocks.input = Вхід blocks.output = Вихід blocks.booster = Прискорювач @@ -458,6 +509,7 @@ blocks.shootrange = Діапазон дії blocks.size = Розмір blocks.liquidcapacity = Місткість рідини blocks.powerrange = Діапазон передачі енергії +blocks.powerconnections = Max Connections blocks.poweruse = Енергії використовує blocks.powerdamage = Енергія/урон blocks.itemcapacity = Місткість предметів @@ -479,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 = Зберігає: {0}/{1} @@ -523,7 +576,9 @@ 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 = Анімована вода setting.animatedshields.name = Анімовані щити setting.antialias.name = Згладжування[lightgray] (потребує перезапуску)[] @@ -544,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} сек. @@ -553,6 +610,7 @@ setting.fps.name = Показувати FPS setting.vsync.name = Вертикальна синхронізація setting.pixelate.name = Пікселізація[lightgray] (вимикає анімації) setting.minimap.name = Показувати міні-мапу +setting.position.name = Show Player Position setting.musicvol.name = Гучність музики setting.ambientvol.name = Звуки навколишнього середовища setting.mutemusic.name = Заглушити музику @@ -565,6 +623,7 @@ setting.chatopacity.name = Непрозорість чату setting.lasersopacity.name = Power Laser Opacity setting.playerchat.name = Відображати хмару чата над гравцями public.confirm = Ви хочете зробити цю гру загальнодоступною?\n[lightgray]Це можна змінити у Налаштування->Гра->Public Game Visibility. +public.beta = Note that beta versions of the game cannot make public lobbies. uiscale.reset = Масштаб користувальницького інтерфейсу було змінено.\nНатисніть «ОК» для підтверждення цього масшатабу.\n[scarlet]Повернення налаштувань і вихід через[accent] {0}[] … uiscale.cancel = Скасувати & Вийти setting.bloom.name = Світіння @@ -576,13 +635,16 @@ category.multiplayer.name = Мережева гра command.attack = Атакувати command.rally = Точка збору command.retreat = Відступити -keybind.gridMode.name = Вибрати блок -keybind.gridModeShift.name = Вибрати категорію +keybind.clear_building.name = Clear Building 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.select.name = Вибір/Постріл keybind.diagonal_placement.name = Діагональне розміщення @@ -594,12 +656,14 @@ keybind.zoom_hold.name = Керування масштабом keybind.zoom.name = Приблизити keybind.menu.name = Меню keybind.pause.name = Пауза +keybind.pause_building.name = Pause/Resume Building keybind.minimap.name = Мінімапа keybind.dash.name = Прискоритися/Літати keybind.chat.name = Чат 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 = Наступна історія чату @@ -779,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 = Торієва стіна @@ -793,11 +859,12 @@ block.lancer.name = Списоносець block.conveyor.name = Конвеєр block.titanium-conveyor.name = Титановий конвеєр block.armored-conveyor.name = Броньований конвеєр -block.armored-conveyor.description = Переміщує предмети з тією ж швидкістю, як і титанові конвеєри, але має більше міцності. Не приймає введення з боків ні з чого, крім інших конвеєрів. +block.armored-conveyor.description = Переміщує предмети з тією ж швидкістю, як і титанові конвеєри, але має більше міцності. Не приймає введення з боків ні з чого, крім інших конвеєрних стрічок. block.junction.name = Перехрестя block.router.name = Маршрутизатор block.distributor.name = Розподілювач block.sorter.name = Сортувальник +block.inverted-sorter.name = Inverted Sorter block.message.name = Повідомлення block.overflow-gate.name = Надмірний затвор block.silicon-smelter.name = Кремнієвий плавильний завод @@ -911,19 +978,20 @@ unit.fortress.name = Фортеця unit.revenant.name = Потойбічний вбивця unit.eruptor.name = Вивиргатель unit.chaos-array.name = Масив хаосу -unit.eradicator.name = Викорінювач +unit.eradicator.name = Випалювач unit.lich.name = Лич unit.reaper.name = Жнець tutorial.next = [lightgray]<Натисніть для продовження> -tutorial.intro = Ви розпочали[scarlet] навчання по Mindustry.[]\nРозпочність з[accent] видобування міді[]. Використовуйте [[WASD] для руху, а потім натисність на мідну жилу біля вашого ядра, щоб зробити це.\n\n[accent]{0}/{1} міді +tutorial.intro = Ви розпочали[scarlet] навчання по Mindustry.[]\nРозпочність з[accent] видобування міді[]. Використовуйте [[WASD] для руху.\n[accent] Утримуйте [[Ctrl] під час прокрутки миші[] для приближення і віддалення. Наблизьтесь, а потім натисність на мідну жилу біля вашого ядра, щоб зробити це.\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]Натисніть ПКМ[], щоб зупинити будування. 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.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.pause = Під час бою ви можете[accent] поставити на павзу гру.[]\nВи можете зробити чергу на будівництво під час паузи.\n\n[accent]Натисність пробіл для павзи.tutorial.launch tutorial.pause.mobile = Під час бою ви можете[accent] поставити на павзу гру.[]\nВи можете зробити чергу на будівництво під час паузи.\n\n[accent]атисніть кнопку зліва вгорі для павзи. tutorial.unpause = Тепер натисність пробіл, щоб зняти павзу. tutorial.unpause.mobile = Тепер натисність туди ще раз, щоб зняти павзу. @@ -933,7 +1001,7 @@ tutorial.withdraw = У деяких ситуаціях потрібно брат tutorial.deposit = Покладіть предмети в блоки, перетягнувши з вашого корабля в потрібний блок.\n\n[accent]Покладіть мідь назад у ядро.[] tutorial.waves = [lightgray] Ворог[] з’явився.\n\nЗахистіть ядро від двух хвиль.[accent] Натисніть[], щоб стріляти.\nСтворіть більше башточок і бурів. Добудьте більше міді. tutorial.waves.mobile = [lightgray] Ворог[] з’явився.\n\nЗахистіть ядро від двух хвиль. Ваш корабель буде автоматично атакувати ворогів.\nСтворіть більше башточок і бурів. Добудьте більше міді. -tutorial.launch = Як тільки ви досягнете певної хвилі, Ви зможете[accent] запустити ядро[], залишивши захисні сили позаду та [accent]отримати всі ресурси у вашому ядрі.[]\nЦі ресурси можуть бути використані для дослідження нових технологій.\n\n[accent]Натисніть кнопку запуску. +tutorial.launch = Як тільки ви досягнете певної хвилі, Ви зможете[accent] запустити ядро[], залишивши захисні сили позаду та [accent]отримати всі ресурси у вашому ядрі.[]\nЦі отримані ресурси можуть бути використані для дослідження нових технологій.\n\n[accent]Натисніть кнопку запуску. item.copper.description = Найбільш базовий будівельний матеріал. Широко використовується у всіх типах блоків. item.lead.description = Основний стартовий матеріал. Широко застосовується в електроніці та транспортуванні рідин. item.metaglass.description = Супер жорсткий склад скла. Широко застосовується для розподілу та зберігання рідини. @@ -999,6 +1067,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 = 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Гідний захист від ворогів.\nОхоплює кілька плиток. block.phase-wall.description = Стіна, покрита спеціальним світловідбиваючим складом, який базується на фазовій тканині. Відхиляє більшість куль при ударі. @@ -1018,6 +1088,7 @@ block.junction.description = Діє як міст для двох перехре block.bridge-conveyor.description = Покращений блок транспорту елементів. Дозволяє транспортувати предмети до 3-ох плиток з будь-якої місцевості чи будівлі. block.phase-conveyor.description = Покращений блок транспорту елементів. Використовує енергію для телепортування елементів на підключений фазовий конвеєр через кілька плиток. block.sorter.description = Сортує предмети. Якщо елемент відповідає вибраному, його можна передати. В іншому випадку елемент виводиться зліва та справа. +block.inverted-sorter.description = Обробляє елементи, як звичайний сортувальник, але виводить обрані елементи на сторони. block.router.description = Приймає елементи з одного напрямку та виводить їх до трьох інших напрямків порівну. Корисно для поділу матеріалів від одного джерела до кількох цілей.\n\n[scarlet]Ніколи не використовуйте поруч із входами до механізмів, оскільки вони будуть забиті вихідними предметами.[] block.distributor.description = Розширений маршрутизатор. Розділяє предмети до 7 інших напрямків порівну. block.overflow-gate.description = Комбінований розгалужувач і маршрутизатор. Виходи лише вліво і вправо, якщо передній шлях заблокований. diff --git a/core/assets/bundles/bundle_zh_CN.properties b/core/assets/bundles/bundle_zh_CN.properties index 248c7bc7ee..c925e101f2 100644 --- a/core/assets/bundles/bundle_zh_CN.properties +++ b/core/assets/bundles/bundle_zh_CN.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 = 不稳定开发版 @@ -16,14 +17,29 @@ screenshot.invalid = 地图太大,可能没有足够的内存用于截图。 gameover = 你的核心被摧毁了! gameover.pvp = [accent] {0}[]队获胜! highscore = [accent]新纪录! - +copied = 已复制。 load.sound = 音乐加载中 load.map = 地图加载中 load.image = 图片加载中 load.content = 内容加载中 load.system = 系统加载中 load.mod = 模组加载中 - +schematic = 蓝图 +schematic.add = 保存蓝图中…… +schematics = 蓝图 +schematic.replace = A schematic by that name already exists. Replace it? +schematic.import = 导入蓝图中…… +schematic.exportfile = 导出文件 +schematic.importfile = 导入蓝图 +schematic.browseworkshop = 流览创意工坊 +schematic.copy = 复制蓝图到剪贴板 +schematic.copy.import = 从剪贴板导入蓝图 +schematic.shareworkshop = 在创意工坊上分享蓝图 +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} @@ -31,9 +47,9 @@ stat.destroyed = 摧毁的建筑:[accent]{0} stat.deconstructed = 拆除的建筑:[accent]{0} stat.delivered = 发射的资源: stat.rank = 最终等级:[accent]{0} - launcheditems = [accent]发射的资源 -map.delete = 确定要删除 "[accent]{0}[]" 地图吗? +launchinfo = [unlaunched][[LAUNCH] 你的核心将会获得用蓝色标识出来的资源. +map.delete = 确定要删除名为 "[accent]{0}[]" 的地图吗? level.highscore = 最高分:[accent]{0} level.select = 选择关卡 level.mode = 游戏模式: @@ -44,7 +60,6 @@ database = 核心数据库 savegame = 保存游戏 loadgame = 载入游戏 joingame = 加入游戏 -addplayers = 添加/删除玩家 customgame = 自定义游戏 newgame = 新游戏 none = <无> @@ -65,16 +80,20 @@ uploadingcontent = 正在上传内容 uploadingpreviewfile = 正在上传预览文件 committingchanges = 提交更改 done = 已完成 - +feature.unsupported = Your device does not support this feature. mods.alphainfo = 请注意在测试版本中的模组[scarlet]可能有缺陷[]。\n在 Mindustry Github 或 Discord上报告你发现的问题。 mods.alpha = [accent](测试版) mods = 模组 mods.none = [LIGHT_GRAY]无模组! mods.guide = 模组教程 mods.report = 报告 Bug +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.reloadrequired = [scarlet]需要重启 @@ -83,7 +102,8 @@ 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若要将任何模组转换为文件夹,只需将其文件解压缩到文件夹中并删除旧压缩包,然后重新启动游戏或重新加载模组。 about.button = 关于 name = 名字: noname = 先取一个[accent]玩家名[]。 @@ -100,7 +120,7 @@ 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 = 你在这个服务器上被拉入黑名单了。 @@ -161,20 +181,19 @@ cantconnect = 无法加入([accent]{0}[])。 connecting = [accent]连接中…… connecting.data = [accent]加载中…… server.port = 端口: -server.addressinuse = 地址已经在使用中! -server.invalidport = 无效的端口号! +server.addressinuse = 地址已在使用! +server.invalidport = 无效的端口! server.error = [crimson]创建服务器错误:[accent]{0} -save.old = 这个存档属于旧版本游戏,不再被使用。\n\n[LIGHT_GRAY]存档向下兼容将在完整的4.0版本中实现。 save.new = 新存档 -save.overwrite = 你确定你要覆盖这个存档位吗? +save.overwrite = 你确定你要覆盖这个存档吗? overwrite = 覆盖 -save.none = 没有存档被找到! +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 = 导入存档 @@ -198,6 +217,7 @@ warning = 警告! confirm = 确认 delete = 删除 view.workshop = 浏览创意工坊 +workshop.listing = 编辑创意工坊目录 ok = 确定 open = 打开 customize = 自定义 @@ -218,6 +238,7 @@ loading = [accent]加载中…… reloading = [accent]重载模组中…… saving = [accent]保存中…… cancelbuilding = [accent][[{0}][]来清除规划 +selectschematic = [accent][[{0}][]来选择复制 pausebuilding = [accent][[{0}][]来暂停建造 resumebuilding = [scarlet][[{0}][]来恢复建造 wave = [accent]波次{0} @@ -238,16 +259,18 @@ map.nospawn = 这个地图没有核心!请在编辑器中添加一个[ROYAL] map.nospawn.pvp = 这个地图没有敌人的核心!请在编辑器中添加一个[ROYAL]敌方[]的核心。 map.nospawn.attack = 这个地图没有敌人的核心!请在编辑中向地图添加一个[SCARLET]敌方[]的核心。 map.invalid = 地图载入错误:地图文件可能已经损坏。 -map.update = 更新地图 -map.load.error = 获取创意工坊详细信息时出错:{0} -map.publish.error = 地图上传错误:{0} -map.missing = 地图已被删除或移动。\n[lightgray]链接已在创意工坊中被删除。 +workshop.update = 更新地图 +workshop.error = 获取创意工坊详细信息时出错:{0} map.publish.confirm = 确定上传此地图?\n\n[lightgray]确定你同意 Steam 创意工坊的最终用户许可协议,否则你的地图将不会被展示! -map.menu = 选择要对此地图执行的操作。 -map.changelog = 更改日志(可选): +workshop.menu = Select what you would like to do with this item. +workshop.info = Item Info +changelog = Changelog (optional): eula = Steam 最终用户许可协议 -map.publish = 地图已上传。 -map.publishing = [accent]地图上传中…… +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} +steam.error = Failed to initialize Steam services.\nError: {0} editor.brush = 笔刷 editor.openin = 在编辑器中打开 editor.oregen = 矿石的生成 @@ -287,11 +310,11 @@ editor.removeunit = 移除单位 editor.teams = 队伍 editor.errorload = 读取文件时出现错误:\n[accent]{0} editor.errorsave = 保存文件时出现错误:\n[accent]{0} -editor.errorimage = 这是一幅画,不是地图。不要更改文件的扩展名来让他工作。\n\n如果你想导入地图,请在编辑器中使用“导入地图”这一按钮。 +editor.errorimage = 这是一幅图片,不是地图。请不要更改文件的扩展名来导入。\n\n如果你想导入地图,请在编辑器中使用“导入地图”这一按钮。 editor.errorlegacy = 此地图太旧,而旧的地图格式不再受支持了。 editor.errornot = 这不是地图文件。 editor.errorheader = 此地图文件已失效或损坏。 -editor.errorname = 地图没有被定义的名称。你是否在尝试加载存档文件? +editor.errorname = 地图没有被定义的名称。是否需要加载存档文件? editor.update = 更新 editor.randomize = 随机化 editor.apply = 应用 @@ -324,7 +347,6 @@ editor.overwrite = [accent]警告!\n这将会覆盖一个已经存在的地图 editor.overwrite.confirm = [scarlet]警告![]存在同名地图。你确定你想要覆盖? editor.exists = 已经存在同名地图。 editor.selectmap = 选择一个地图加载: - toolmode.replace = 替换 toolmode.replace.description = 仅在实心块上绘制。 toolmode.replaceall = 全部替换 @@ -339,7 +361,6 @@ toolmode.fillteams = 填充团队 toolmode.fillteams.description = 填充团队而不是方块。 toolmode.drawteams = 绘制团队 toolmode.drawteams.description = 绘制团队而不是方块。 - filters.empty = [LIGHT_GRAY]没有筛选器!用下方的按钮添加一个。 filter.distort = 扭曲程度 filter.noise = 波动程度 @@ -371,7 +392,6 @@ filter.option.floor2 = 二重地面 filter.option.threshold2 = 二重阈值 filter.option.radius = 半径大小 filter.option.percentile = 百分比 - width = 宽度: height = 高度: menu = 菜单 @@ -387,13 +407,11 @@ tutorial = 教程 tutorial.retake = 重新游玩教程 editor = 编辑器 mapeditor = 地图编辑器 -donate = 打赏 - abandon = 放弃 abandon.text = 这个区域及其资源会被敌人重置。 locked = 已锁定 complete = [LIGHT_GRAY]完成: -zone.requirement = 在{1}中达到{0}波 +requirement.wave = Reach Wave {0} in {1} requirement.core = 在{0}中摧毁敌方核心 requirement.unlock = 解锁{0} resume = 暂停:\n[LIGHT_GRAY]{0} @@ -412,14 +430,13 @@ configure.locked = [LIGHT_GRAY]到达第{0}波\n才能设定发射资源。 configure.invalid = 数量必须是0到{0}之间的数字。 zone.unlocked = [LIGHT_GRAY]{0} 已解锁。 zone.requirement.complete = 已达到第{0}波。\n达到解锁{1}的需求。 -zone.config.complete = 已达到第{0}波。\n允许携带发射的资源进入此地区。 +zone.config.unlocked = Loadout unlocked:[lightgray]\n{0} zone.resources = 地图中的资源: zone.objective = [lightgray]目标:[accent]{0} zone.objective.survival = 生存 zone.objective.attack = 摧毁敌方核心 add = 添加…… boss.health = BOSS 生命值 - connectfail = [crimson]服务器连接失败:[accent]{0} error.unreachable = 服务器无法访问。\n确定输对地址了吗? error.invalidaddress = 地址无效。 @@ -430,7 +447,6 @@ error.mapnotfound = 找不到地图文件! error.io = 网络 I/O 错误。 error.any = 未知网络错误。 error.bloom = 未能初始化特效。\n您的设备可能不支持它。 - zone.groundZero.name = 零号地区 zone.desertWastes.name = 荒芜沙漠 zone.craters.name = 陨石带 @@ -445,7 +461,6 @@ 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]无法保证此着陆位置。 @@ -460,7 +475,6 @@ zone.nuclearComplex.description = 以前生产和加工钍的设施已变成废 zone.fungalPass.description = 介于高山和低矮孢子丛生的土地之间的过渡地带。这里有一个小型的敌方侦察基地。\n侦察它。\n使用尖刀和爬行者单位来摧毁两个核心。 zone.impact0078.description = <在此处插入说明> zone.crags.description = <在此处插入说明> - settings.language = 语言 settings.data = 游戏数据 settings.reset = 恢复默认 @@ -495,6 +509,7 @@ blocks.shootrange = 范围 blocks.size = 尺寸 blocks.liquidcapacity = 液体容量 blocks.powerrange = 能量范围 +blocks.powerconnections = Max Connections blocks.poweruse = 能量使用 blocks.powerdamage = 功率/损伤 blocks.itemcapacity = 物品容量 @@ -514,9 +529,9 @@ blocks.inaccuracy = 误差 blocks.shots = 发射数 blocks.reload = 每秒发射数 blocks.ammo = 子弹 - bar.drilltierreq = 需要更好的钻头 bar.drillspeed = 挖掘速度:{0}/s +bar.pumpspeed = Pump Speed: {0}/s bar.efficiency = 效率:{0}% bar.powerbalance = 能量:{0}/秒 bar.powerstored = 储能:{0}/{1} @@ -529,7 +544,6 @@ bar.heat = 热量 bar.power = 电力 bar.progress = 制造进度 bar.spawned = 单位数量:{0}/{1} - bullet.damage = [stat]{0}[lightgray] 伤害 bullet.splashdamage = [stat]{0}[lightgray] 范围伤害 ~[stat] {1}[lightgray] 格 bullet.incendiary = [stat] 燃烧 @@ -541,7 +555,6 @@ bullet.freezing = [stat] 冰冻 bullet.tarred = [stat] 减速 bullet.multiplier = [stat]{0}[lightgray]x 子弹数量 bullet.reload = [stat]{0}[lightgray]x 装弹 - unit.blocks = 方块 unit.powersecond = 能量单位/秒 unit.liquidsecond = 液体单位/秒 @@ -563,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 = 提示 setting.animatedwater.name = 流动的水 @@ -585,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} 秒 @@ -619,14 +635,16 @@ category.multiplayer.name = 多人 command.attack = 攻击 command.rally = 集合 command.retreat = 撤退 -keybind.gridMode.name = 选择块 -keybind.gridModeShift.name = 选择类别 keybind.clear_building.name = 清除建筑 keybind.press = 按一下键…… keybind.press.axis = 按一下轴或键…… keybind.screenshot.name = 地图截图 keybind.move_x.name = 水平移动 -keybind.move_y.name = 垂直移动 +keybind.move_y.name = 竖直移动 +keybind.schematic_select.name = 选择区域 +keybind.schematic_menu.name = 蓝图目录 +keybind.schematic_flip_x.name = 水平翻转 +keybind.schematic_flip_y.name = 竖直翻转 keybind.fullscreen.name = 切换全屏 keybind.select.name = 选择/射击 keybind.diagonal_placement.name = 自动铺设 @@ -663,7 +681,6 @@ mode.pvp.description = 和本地玩家对战。\n[gray]需要不同队伍的核 mode.attack.name = 攻击 mode.attack.description = 没有波数,但是有摧毁敌人基地的任务。\n[gray]需要姨妈红队核心。 mode.custom = 自定义模式 - rules.infiniteresources = 无限资源 rules.wavetimer = 波次计时器 rules.waves = 波次 @@ -690,7 +707,6 @@ rules.title.resourcesbuilding = 资源和建造 rules.title.player = 玩家 rules.title.enemy = 敌人 rules.title.unit = 单位 - content.item.name = 物品 content.liquid.name = 液体 content.unit.name = 部队 @@ -752,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 = 盐碱地 @@ -828,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 = 钍墙 @@ -847,7 +864,8 @@ block.junction.name = 连接点 block.router.name = 路由器 block.distributor.name = 分配器 block.sorter.name = 分类器 -block.message.name = 信息 +block.inverted-sorter.name = 反向分类器 +block.message.name = 信息板 block.overflow-gate.name = 溢流门 block.silicon-smelter.name = 硅冶炼厂 block.phase-weaver.name = 相织布编织器 @@ -965,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点击右下角的钻头菜单。\n选择[accent]机械钻头[]。\n单击将其放置在铜矿上。\n[accent]右键单击[]来停止。 tutorial.drill.mobile = 手动采矿效率低。\n[accent]钻头[]可以自动采矿。\n点击右下角的钻头菜单。\n选择[accent]机械钻头[]。\n点击将其放在铜矿上,点击[accent]对号[]来确定。\n点击[accent]叉号[]来取消。 tutorial.blockinfo = 每个方块具有不同的数据。每个钻头只能开采某些矿石。\n要检查块的信息和统计信息,[accent]在菜单中点击问号。[]\n\n[accent]现在查看机械钻头的数据吧。[] @@ -983,7 +1002,6 @@ tutorial.deposit = 将物品从机甲拖向方块来放下物品。\n\n[accent] tutorial.waves = [lightgray]敌人[]来了。\n\n保护核心,防御2波攻击。造更多的炮塔。[accent]点击[]以射击。\n建造更多的炮塔和钻头,并采更多的矿。 tutorial.waves.mobile = [lightgray]敌人[]来了。\n\n保护核心,防御2波攻击。造更多的炮塔。你的机甲将对敌人自动开火。\n建造更多的炮塔和钻头,并采更多的矿。 tutorial.launch = 特定波次中,你可以[accent]发射核心[],[accent]携带核心中所有资源[]离开所有的建筑。\n资源可用来研究科技。\n\n[accent]点击发射按钮。 - item.copper.description = 一种有用的结构材料。在各种类型的方块中广泛使用。 item.lead.description = 一种基本的起始材料。广泛用于电子设备和液体运输。 item.metaglass.description = 一种超级强硬的复合玻璃。通常用来传送和收藏液体。 @@ -1040,79 +1058,82 @@ 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.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 = 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很好地防御敌人。\n跨越多个区块。 block.phase-wall.description = 没有钍墙那样坚固,但是它可以使不太强的子弹发生偏转。 block.phase-wall-large.description = 没有钍墙那样坚固,但是它可以使不太强的子弹发生偏转。\n跨越多个区块。 -block.surge-wall.description = 强大的防守区块。\n有很小的机会向攻击者发射闪电。 -block.surge-wall-large.description = 强大的防御区块。\n有很小的机会向攻击者发射闪电。\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.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.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.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.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 = 存储大量物品。当存在非恒定的材料需求时,使用它来创建缓冲区。[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.scorch.description = 小型炮塔,燃烧任何靠近它的地面敌人。近距离非常有效。 block.hail.description = 小型远程炮台。 block.wave.description = 中型快速炮塔,射出液体泡泡。有液体输入时自动灭火。 @@ -1137,10 +1158,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 ea52df5c4c..87b5e8803b 100644 --- a/core/assets/bundles/bundle_zh_TW.properties +++ b/core/assets/bundles/bundle_zh_TW.properties @@ -3,11 +3,12 @@ credits = 感謝名單 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 電腦版下載與網頁版 +link.itch.io.description = itch.io 電腦版下載網頁 link.google-play.description = Google Play 商店頁面 link.wiki.description = 官方 Mindustry 維基 linkfail = 無法打開連結!\n我們已將該網址複製到您的剪貼簿。 @@ -16,11 +17,29 @@ screenshot.invalid = 地圖太大了,可能沒有足夠的內存用於截圖 gameover = 遊戲結束 gameover.pvp = [accent]{0}[]隊獲勝! highscore = [accent]新的高分紀錄! +copied = 已複製。 load.sound = 音效載入中 load.map = 地圖載入中 load.image = 圖片載入中 load.content = 內容載入中 load.system = 系統載入中 +load.mod = 模組載入中 +schematic = 藍圖 +schematic.add = 儲存藍圖... +schematics = 藍圖 +schematic.replace = 具有該名稱的藍圖已經存在。是否要取代它? +schematic.import = 匯入藍圖... +schematic.exportfile = 匯出檔案 +schematic.importfile = 匯入檔案 +schematic.browseworkshop = 瀏覽工作坊 +schematic.copy = 複製到剪貼簿 +schematic.copy.import = 從剪貼簿匯入 +schematic.shareworkshop = 分享到工作坊 +schematic.flip = [accent][[{0}][]/[accent][[{1}][]:翻轉藍圖 +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} @@ -28,31 +47,32 @@ stat.destroyed = 摧毀的建築:[accent]{0} stat.deconstructed = 拆除的建築:[accent]{0} stat.delivered = 發射的核心資源: stat.rank = 最終排名:[accent]{0} -launcheditems = [accent]發射了的物品 +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 = 載入遊戲 joingame = 多人連線 -addplayers = 增加/移除玩家 customgame = 自訂遊戲 newgame = 新遊戲 none = 〈沒有〉 minimap = 小地圖 +position = 位置 close = 關閉 website = 網頁 quit = 退出 -save.quit = 儲存與離開 +save.quit = 儲存並退出 maps = 地圖 maps.browse = 瀏覽地圖 continue = 繼續 -maps.none = [LIGHT_GRAY]找不到地圖! +maps.none = [lightgray]找不到地圖! invalid = 無效 preparingconfig = 配置準備中 preparingcontent = 內容準備中 @@ -60,19 +80,43 @@ uploadingcontent = 內容上傳中 uploadingpreviewfile = 上傳預覽文件 committingchanges = 提交變更 done = 完成 +feature.unsupported = 您的設備不支持此功能。 +mods.alphainfo = 請記住,模組仍處於Alpha狀態,[scarlet]可能會有很多BUG[].\n向Mindustry Github或Discord報告發現的任何問題。 +mods.alpha = [accent](Alpha) +mods = 模組 +mods.none = [lightgray]找不到模組! +mods.guide = 模組指南 +mods.report = 回報錯誤 +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]缺少依賴項目: {0} +mod.nowdisabled = [scarlet]「{0}'」模組缺少依賴項目:[accent] {1}\n[lightgray]必須先下載這些模組。\n此模組將被自動禁用。 +mod.enable = 啟用 +mod.requiresrestart = 遊戲將立即關閉以套用模組變更。 +mod.reloadrequired = [scarlet]需要重新載入 +mod.import = 匯入模組 +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 = 伺服器已關閉。 @@ -80,33 +124,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 = 封禁 @@ -118,8 +162,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 = 您確定要投票剔除該名玩家嗎? @@ -134,19 +178,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} -save.old = 這個存檔屬於舊版本,無法使用了。\n\n[LIGHT_GRAY]舊存檔兼容將在正式4.0版本中實現。 +server.error = [crimson]建立伺服器時發生錯誤。 save.new = 新存檔 save.overwrite = 您確定要覆蓋存檔嗎? overwrite = 覆蓋 save.none = 找不到存檔! -saveload = [accent]存檔中…… -savefail = 無法存檔! +saveload = [accent]存檔中... +savefail = 存檔失敗! save.delete.confirm = 您確定要刪除這個存檔嗎? save.delete = 刪除 save.export = 匯出存檔 @@ -174,6 +217,7 @@ warning = 警告。 confirm = 確認 delete = 刪除 view.workshop = 在工作坊中查看 +workshop.listing = 編輯工作坊清單 ok = 確定 open = 開啟 customize = 自訂 @@ -185,20 +229,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]載入中…… -saving = [accent]儲存中…… +loading = [accent]載入中... +reloading = [accent]模組重新載入中... +saving = [accent]儲存中... +cancelbuilding = [accent][[{0}][]清除計畫 +selectschematic = [accent][[{0}][]選擇並複製 +pausebuilding = [accent][[{0}][]暫停建造 +resumebuilding = [scarlet][[{0}][]恢復建造 wave = [accent]第{0}波 -wave.waiting = 將於{0}秒後抵達 -wave.waveInProgress = 第[LIGHT_GRAY]波正在進行中 -waiting = 等待中…… -waiting.players = 等待玩家中…… -wave.enemies = [LIGHT_GRAY]剩下{0}敵人 -wave.enemy = [LIGHT_GRAY]剩下{0}敵人 +wave.waiting = [lightgray]將於{0}秒後抵達 +wave.waveInProgress = 第[lightgray]波正在進行中 +waiting = [lightgray]等待中... +waiting.players = 等待玩家中... +wave.enemies = [lightgray]剩下{0}個敵人 +wave.enemy = [lightgray]剩下{0}個敵人 loadimage = 載入圖像 saveimage = 儲存圖像 unknown = 未知 @@ -210,11 +259,18 @@ map.nospawn = 這個地圖沒有核心!請在編輯器中添加一個[ROYAL] map.nospawn.pvp = 這個地圖沒有核心讓敵人重生!請在編輯器中添加一個[SCARLET]紅色[]的核心。 map.nospawn.attack = 這個地圖沒有敵人核心讓可以攻擊!請在編輯器中添加一個[SCARLET]紅色[]的核心。 map.invalid = 地圖載入錯誤:地圖可能已經損壞。 -map.publish.error = 發布地圖時出現錯誤: {0} +workshop.update = 更新項目 +workshop.error = 提取工作坊詳細信息時出錯: {0} map.publish.confirm = 您確定要發布此地圖嗎?\n\n[lightgray]首先請先確定您同意Steam工坊 EULA協定,否則您的地圖將不會顯示! +workshop.menu = 選擇您要對此項目執行的操作。 +workshop.info = 項目信息 +changelog = 變更日誌(可選): eula = Steam EULA -map.publish = 地圖發佈完成. -map.publishing = [accent]地圖發佈中... +missing = 此項目已被刪除或移動。\n[lightgray]工作坊列表現在已自動取消鏈接。 +publishing = [accent]發佈中... +publish.confirm = 您確定要發布嗎?\n\n[lightgray]首先確定您同意Workshop EULA,否則您的項目將不會顯示! +publish.error = 發佈項目時出錯: {0} +steam.error = Failed to initialize Steam services.\nError: {0} editor.brush = 粉刷 editor.openin = 在編輯器中開啟 editor.oregen = 礦石生成 @@ -233,21 +289,21 @@ workshop = 工作坊 waves.title = 波次 waves.remove = 移除 waves.never = 〈從來沒有〉 -waves.every = 一切 +waves.every = 每 waves.waves = 波次 -waves.perspawn = 每個重生 +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 = 移除單位 @@ -270,14 +326,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 = 匯出地形圖像檔 @@ -295,8 +351,8 @@ 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 = 清除礦物 @@ -305,7 +361,7 @@ 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 = 平均數 @@ -319,11 +375,11 @@ filter.clear = 清除 filter.option.ignore = 忽略 filter.scatter = 分散 filter.terrain = 地形 -filter.option.scale = 比例 +filter.option.scale = 規模 filter.option.chance = 機會 filter.option.mag = 大小 filter.option.threshold = 閾值 -filter.option.circle-scale = 圓形比例 +filter.option.circle-scale = 圓形規模 filter.option.octaves = 倍頻 filter.option.falloff = 衰減 filter.option.angle = 角度 @@ -344,7 +400,6 @@ campaign = 戰役 load = 載入 save = 儲存 fps = FPS:{0} -tps = TPS:{0} ping = 延遲:{0}ms language.restart = 請重新啟動遊戲以使選取的語言生效。 settings = 設定 @@ -352,41 +407,44 @@ tutorial = 教學 tutorial.retake = 重置教學 editor = 地圖編輯器 mapeditor = 地圖編輯器 -donate = 贊助 abandon = 放棄 abandon.text = 此區域及其所有資源將會丟失給敵人。 locked = 鎖定 -complete = [LIGHT_GRAY]完成: -zone.requirement = {0}波於區域{1} -resume = 繼續區域:\n[LIGHT_GRAY]{0} -bestwave = [LIGHT_GRAY]高分:{0} -launch = 發射 +complete = [lightgray]完成: +requirement.wave = 在{1}到達第{0}波 +requirement.core = 在{0}摧毀敵人核心 +requirement.unlock = 解鎖{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 = 如果您現在跳過,您將無法發射核心直到下一次的可發射波數。 -uncover = 揭露 +uncover = 探索 configure = 配置裝載 -configure.locked = [LIGHT_GRAY]到達波次{0}\n以配置裝載。 +bannedblocks = 禁用方塊 +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.complete = 到達波次{0}:\n裝載配置已解鎖。 -zone.resources = 檢測到的資源: +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 = 零號地區 @@ -394,28 +452,28 @@ zone.desertWastes.name = 沙漠荒原 zone.craters.name = 隕石坑 zone.frozenForest.name = 冰凍森林 zone.ruinousShores.name = 廢墟海岸 -zone.stainedMountains.name = 髒污山脈 +zone.stainedMountains.name = 汙染山脈 zone.desolateRift.name = 荒涼裂谷 zone.nuclearComplex.name = 核生產綜合體 -zone.overgrowth.name = 過度生長 +zone.overgrowth.name = 蔓生 zone.tarFields.name = 焦油田 zone.saltFlats.name = 鹽沼 zone.impact0078.name = 衝擊 0078 zone.crags.name = 岩壁 -zone.fungalPass.name = 真菌通行證 -zone.groundZero.description = 再次開始的最佳位置。敵人威脅度低。資源很少。\n盡可能的收集更多的鉛和銅。\n繼續前進。 -zone.frozenForest.description = 即使在這裡更靠近山脈,孢子也已經擴散了。寒冷的溫度不可能永遠容納它們。\n\n開始在能源勇於嘗試。建造燃燒發電機。學會使用修補。 -zone.desertWastes.description = 這些廢料規模巨大的,難以預測的,並且與廢棄的結構交錯在一起。\n此地區存在著煤炭。燃燒它以獲得能源或合成石墨。\n\n[lightgray]無法保證此地圖的著陸位置。 -zone.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.desolateRift.description = 一個非常危險的區域。資源豐富,但空間很小。高破壞風險。請盡快離開。不要被敵人攻擊之間的長時間間隔所迷惑。 -zone.nuclearComplex.description = 以前生產和加工釷的設施已變成廢墟。\n[lightgray]研究釷及其多種用途。\n\n敵人人數眾多,不斷的偵查入侵者。 -zone.fungalPass.description = 高山與低地之間被孢子纏繞的過渡區域。一個小的敵人偵察基地位於這裡。\n破壞它。\n使用匕首和爬行機甲單位來摧毀兩個核心。 -zone.impact0078.description = <在此處輸入敘述> +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.stainedMountains.description = 內陸的更深處是群山,還未被孢子所污染。\n提取在該區域蘊藏豐富的鈦,並學習如何使用它們。\n\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 = 遊戲數據 @@ -425,33 +483,33 @@ settings.controls = 操作 settings.game = 遊戲 settings.sound = 音效 settings.graphics = 圖形 -settings.cleardata = 清除遊戲數據…… +settings.cleardata = 清除遊戲數據... settings.clear.confirm = 您確定要清除數據嗎?\n此操作無法撤回! settings.clearall.confirm = [scarlet]警告![]\n這將清除所有數據,包括存檔、地圖、解鎖和熱鍵綁定。\n按「是」後,遊戲將刪除所有數據並自動退出。 -settings.clearunlocks = 清除已解鎖 -settings.clearall = 清除所有 paused = [accent]〈已暫停〉 +clear = 清除 +banned = [scarlet]Banned yes = 是 no = 否 -info.title = [accent]資訊 +info.title = 資訊 error.title = [crimson]發生錯誤 error.crashtitle = 發生錯誤 -attackpvponly = [scarlet]僅在攻擊/PvP模式下可用 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 = Max Connections blocks.poweruse = 能量使用 blocks.powerdamage = 能量/傷害 blocks.itemcapacity = 物品容量 @@ -469,10 +527,11 @@ blocks.buildtime = 建設時間 blocks.buildcost = 建造成本 blocks.inaccuracy = 誤差 blocks.shots = 射擊數 -blocks.reload = 重裝彈藥 +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} @@ -490,12 +549,12 @@ bullet.splashdamage = [stat]{0}[lightgray]範圍傷害 ~[stat] {1}[lightgray]格 bullet.incendiary = [stat]燃燒 bullet.homing = [stat]追踪 bullet.shock = [stat]暈眩 -bullet.frag = [stat]碎片 +bullet.frag = [stat]破片彈 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 = 液體單位/秒 @@ -512,18 +571,20 @@ category.general = 一般 category.power = 能量 category.liquids = 液體 category.items = 物品 -category.crafting = 合成 +category.crafting = 需求 category.shooting = 射擊 category.optional = 可選的強化 -setting.landscape.name = 鎖定景觀 +setting.landscape.name = 鎖定水平畫面 setting.shadows.name = 陰影 +setting.blockreplace.name = Automatic Block Suggestions setting.linear.name = 線性過濾 +setting.hints.name = 提示 setting.animatedwater.name = 水動畫 setting.animatedshields.name = 護盾動畫 -setting.antialias.name = 消除鋸齒[LIGHT_GRAY](需要重啟遊戲)[] -setting.indicators.name = 盟友指標 +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 = 没有 @@ -538,15 +599,18 @@ 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}秒 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 = 靜音 @@ -556,8 +620,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[accent]任何人都可以加入您的遊戲。\n[lightgray]以後可以在“設置”->“遊戲”->“公開遊戲可見度”中進行更改。 +public.beta = 請注意,該遊戲的Beta版本無法公開遊戲大廳。 uiscale.reset = UI縮放已變更\n按下"確定"確認這個比例\n[scarlet][accent] {0}[] 秒後...退出並還原設定 uiscale.cancel = 取消並退出 setting.bloom.name = 特效 @@ -569,13 +635,16 @@ category.multiplayer.name = 多人 command.attack = 攻擊 command.rally = Rally command.retreat = 撤退 -keybind.gridMode.name = 方塊選取 -keybind.gridModeShift.name = 類別選取 -keybind.press = 按一下按鍵…… -keybind.press.axis = 按一下軸向或按鍵…… +keybind.clear_building.name = 清除建築物 +keybind.press = 按一下按鍵... +keybind.press.axis = 按一下軸向或按鍵... keybind.screenshot.name = 地圖截圖 keybind.move_x.name = 水平移動 keybind.move_y.name = 垂直移動 +keybind.schematic_select.name = 選擇區域 +keybind.schematic_menu.name = 藍圖目錄 +keybind.schematic_flip_x.name = X軸翻轉 +keybind.schematic_flip_y.name = Y軸翻轉 keybind.fullscreen.name = 全螢幕切換 keybind.select.name = 選取 keybind.diagonal_placement.name = 對角線放置 @@ -587,12 +656,14 @@ keybind.zoom_hold.name = 按住縮放 keybind.zoom.name = 縮放 keybind.menu.name = 主選單 keybind.pause.name = 暫停遊戲 +keybind.pause_building.name = 暫停/恢復建造 keybind.minimap.name = 小地圖 keybind.dash.name = 衝刺 keybind.chat.name = 聊天 keybind.player_list.name = 玩家列表 keybind.console.name = 終端機 keybind.rotate.name = 旋轉 +keybind.rotateplaced.name = 旋轉現有(按住) keybind.toggle_menus.name = 切換畫面 keybind.chat_history_prev.name = 之前的聊天記錄 keybind.chat_history_next.name = 之後的聊天記錄 @@ -604,9 +675,10 @@ mode.survival.name = 生存 mode.survival.description = 一般模式。有限的資源與自動來襲的波次。 mode.sandbox.name = 沙盒 mode.sandbox.description = 無限的資源,與不倒數計時的波次。 +mode.editor.name = 編輯 mode.pvp.name = 對戰 -mode.pvp.description = 和其他玩家鬥爭。 -mode.attack.name = 攻擊 +mode.pvp.description = 和其他玩家競爭、戰鬥。 +mode.attack.name = 進攻 mode.attack.description = 沒有波次,目標是摧毀敵人的基地。 mode.custom = 自訂規則 rules.infiniteresources = 無限資源 @@ -614,19 +686,19 @@ 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.waitForWaveToEnd = 等待所有敵人毀滅才開始下一波次 +rules.dropzoneradius = 空降區半徑:[lightgray](格) rules.respawns = 每波次最多重生次數 rules.limitedRespawns = 限制重生 rules.title.waves = 波次 @@ -637,7 +709,7 @@ rules.title.enemy = 敵人 rules.title.unit = 單位 content.item.name = 物品 content.liquid.name = 液體 -content.unit.name = 機組 +content.unit.name = 單位 content.block.name = 方塊 content.mech.name = 機甲 item.copper.name = 銅 @@ -647,26 +719,26 @@ item.graphite.name = 石墨 item.titanium.name = 鈦 item.thorium.name = 釷 item.silicon.name = 矽 -item.plastanium.name = 塑料 +item.plastanium.name = 塑鋼 item.phase-fabric.name = 相織布 item.surge-alloy.name = 波動合金 item.spore-pod.name = 孢子莢 item.sand.name = 沙 item.blast-compound.name = 爆炸混合物 -item.pyratite.name = 硫 -item.metaglass.name = 強化玻璃 +item.pyratite.name = 火焰彈 +item.metaglass.name = 鋼化玻璃 item.scrap.name = 廢料 liquid.water.name = 水 -liquid.slag.name = 礦渣 +liquid.slag.name = 熔渣 liquid.oil.name = 原油 liquid.cryofluid.name = 冷凍液 mech.alpha-mech.name = 阿爾法 mech.alpha-mech.weapon = 重型機關槍 -mech.alpha-mech.ability = 無人機群 +mech.alpha-mech.ability = 自修復 mech.delta-mech.name = 德爾塔 mech.delta-mech.weapon = 電弧生成機 mech.delta-mech.ability = 放電 -mech.tau-mech.name = 牛頭機甲 +mech.tau-mech.name = 滔 mech.tau-mech.weapon = 重構激光 mech.tau-mech.ability = 修復陣 mech.omega-mech.name = 奧米伽 @@ -676,26 +748,26 @@ mech.dart-ship.name = 鏢船 mech.dart-ship.weapon = 機關槍 mech.javelin-ship.name = 標槍 mech.javelin-ship.weapon = 爆發導彈 -mech.javelin-ship.ability = 放電助推器 -mech.trident-ship.name = 三叉 -mech.trident-ship.weapon = 炸彈 -mech.glaive-ship.name = 長柄 +mech.javelin-ship.ability = 電弧助推器 +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 = 鹽 @@ -721,11 +793,11 @@ block.scrap-wall-gigantic.name = 超巨型廢牆 block.thruster.name = 推進器 block.kiln.name = 窯 block.graphite-press.name = 石墨壓縮機 -block.multi-press.name = 多用途壓縮機 -block.constructing = {0}\n[LIGHT_GRAY](建設中) +block.multi-press.name = 多重壓縮機 +block.constructing = {0}\n[lightgray](建設中) block.spawn.name = 敵人生成 block.core-shard.name = 核心:碎片 -block.core-foundation.name = 核心:基礎 +block.core-foundation.name = 核心:基地 block.core-nucleus.name = 核心:核子 block.deepwater.name = 深水 block.water.name = 水 @@ -771,25 +843,29 @@ 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 = 釷牆 block.thorium-wall-large.name = 大型釷牆 block.door.name = 門 block.door-large.name = 大門 -block.duo.name = 雙炮 -block.scorch.name = 燒焦炮 -block.scatter.name = 分散炮 -block.hail.name = 冰雹炮 -block.lancer.name = 藍瑟炮 +block.duo.name = 雙砲 +block.scorch.name = 焦土砲 +block.scatter.name = 分散砲 +block.hail.name = 冰雹砲 +block.lancer.name = 光矛砲 block.conveyor.name = 輸送帶 block.titanium-conveyor.name = 鈦輸送帶 block.armored-conveyor.name = 裝甲輸送帶 -block.armored-conveyor.description = 以與鈦傳送帶相同的速度移動物品,但擁有更多防禦。除其他傳送帶外,不接受任何資源從側面輸入。 +block.armored-conveyor.description = 以與鈦輸送帶相同的速度移動物品,但擁有更高的防禦。除其他傳送帶外,不接受任何從側面輸入的資源。 +block.junction.name = 樞紐 block.router.name = 分配器 block.distributor.name = 大型分配器 block.sorter.name = 分類器 -block.message.name = 訊息 +block.inverted-sorter.name = 反向分類器 +block.message.name = 訊息板 block.overflow-gate.name = 溢流器 block.silicon-smelter.name = 煉矽廠 block.phase-weaver.name = 相織布編織器 @@ -813,73 +889,73 @@ block.mechanical-drill.name = 機械鑽頭 block.pneumatic-drill.name = 氣動鑽頭 block.laser-drill.name = 激光鑽頭 block.water-extractor.name = 水提取器 -block.cultivator.name = 耕種機 -block.dart-mech-pad.name = 鏢船機甲墊 -block.delta-mech-pad.name = 德爾塔機甲墊 -block.javelin-ship-pad.name = 標槍機甲墊 -block.trident-ship-pad.name = 三叉船墊 -block.glaive-ship-pad.name = 長柄船墊 -block.omega-mech-pad.name = 奧米伽機甲墊 -block.tau-mech-pad.name = 牛頭機甲墊 +block.cultivator.name = 培養槽 +block.dart-mech-pad.name = 阿爾法機甲坪 +block.delta-mech-pad.name = 德爾塔機甲坪 +block.javelin-ship-pad.name = 標槍機坪 +block.trident-ship-pad.name = 三叉戟機坪 +block.glaive-ship-pad.name = 偃月刀機坪 +block.omega-mech-pad.name = 奧米伽機甲坪 +block.tau-mech-pad.name = 滔機甲坪 block.conduit.name = 管線 block.mechanical-pump.name = 機械泵 block.item-source.name = 物品源 -block.item-void.name = 物品虚 +block.item-void.name = 物品虛空 block.liquid-source.name = 液體源 -block.power-void.name = 能量空虛 -block.power-source.name = 無限能量 +block.power-void.name = 能量虛空 +block.power-source.name = 無限能量源 block.unloader.name = 裝卸器 block.vault.name = 存儲庫 -block.wave.name = 波浪炮 -block.swarmer.name = 群炮 -block.salvo.name = 齊射炮 -block.ripple.name = 波紋炮 +block.wave.name = 波浪砲 +block.swarmer.name = 群集砲 +block.salvo.name = 齊射砲 +block.ripple.name = 波紋砲 block.phase-conveyor.name = 相織傳送帶 block.bridge-conveyor.name = 輸送帶橋 -block.plastanium-compressor.name = 塑料壓縮機 -block.pyratite-mixer.name = 硫混合器 +block.plastanium-compressor.name = 塑鋼壓縮機 +block.pyratite-mixer.name = 火焰彈混合器 block.blast-mixer.name = 爆炸混合器 block.solar-panel.name = 太陽能板 block.solar-panel-large.name = 大型太陽能板 -block.oil-extractor.name = 石油鑽井 -block.command-center.name = 命令中心 -block.draug-factory.name = 幽靈採礦機工廠 -block.spirit-factory.name = 輕型無人機工廠 +block.oil-extractor.name = 原油鑽井 +block.command-center.name = 指揮中心 +block.draug-factory.name = 殭屍採礦機工廠 +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.revenant-factory.name = 亡魂戰鬥機工廠 +block.fortress-factory.name = 要塞機甲工廠 +block.revenant-factory.name = 復仇鬼戰鬥機工廠 block.repair-point.name = 維修點 block.pulse-conduit.name = 脈衝管線 block.phase-conduit.name = 相織管線 block.liquid-router.name = 液體分配器 -block.liquid-tank.name = 液體儲存罐 -block.liquid-junction.name = 液體連接點 +block.liquid-tank.name = 液體儲存槽 +block.liquid-junction.name = 液體樞紐 block.bridge-conduit.name = 管線橋 block.rotary-pump.name = 迴旋泵 block.thorium-reactor.name = 釷反應堆 block.mass-driver.name = 質量驅動器 -block.blast-drill.name = 爆破鑽頭 +block.blast-drill.name = 氣爆鑽頭 block.thermal-pump.name = 熱能泵 -block.thermal-generator.name = 熱能發電機 +block.thermal-generator.name = 地熱發電機 block.alloy-smelter.name = 合金冶煉廠 block.mender.name = 修理方塊 block.mend-projector.name = 修理投影器 block.surge-wall.name = 波動牆 block.surge-wall-large.name = 大型波動牆 -block.cyclone.name = 氣旋炮 -block.fuse.name = 融合炮 -block.shock-mine.name = 休克地雷 -block.overdrive-projector.name = 超速投影器 +block.cyclone.name = 颶風砲 +block.fuse.name = 融合砲 +block.shock-mine.name = 衝擊地雷 +block.overdrive-projector.name = 超速運轉投影器 block.force-projector.name = 護盾投影器 -block.arc.name = 電弧 +block.arc.name = 電弧砲 block.rtg-generator.name = 放射性同位素熱發電機 -block.spectre.name = 幽靈炮 -block.meltdown.name = 熔毀炮 +block.spectre.name = 鬼影砲 +block.meltdown.name = 熔毀砲 block.container.name = 容器 block.launch-pad.name = 小型發射台 block.launch-pad-large.name = 大型發射台 @@ -890,29 +966,30 @@ team.orange.name = 橘 team.derelict.name = 灰 team.green.name = 綠 team.purple.name = 紫 -unit.spirit.name = 輕型無人機 -unit.draug.name = 幽靈礦工無人機 +unit.spirit.name = 幽靈無人機 +unit.draug.name = 殭屍採礦無人機 unit.phantom.name = 幻影無人機 -unit.dagger.name = 匕首 -unit.crawler.name = 爬行 +unit.dagger.name = 匕首機甲 +unit.crawler.name = 爬行機甲 unit.titan.name = 泰坦 unit.ghoul.name = 食屍鬼轟炸機 unit.wraith.name = 怨靈戰鬥機 -unit.fortress.name = 堡壘 -unit.revenant.name = 亡魂 +unit.fortress.name = 要塞 +unit.revenant.name = 復仇鬼 unit.eruptor.name = 爆發者 -unit.chaos-array.name = 混沌陣 +unit.chaos-array.name = 混沌陣列 unit.eradicator.name = 消除者 unit.lich.name = 巫妖 -unit.reaper.name = 收割者 +unit.reaper.name = 收掠者 tutorial.next = [lightgray]<按下以繼續> tutorial.intro = 您已進入[scarlet] Mindustry 教學。[]\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.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.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.conveyor.mobile = [accent]輸送帶[]能夠將物品運輸到核心。製作一條從鑽頭開始到核心的輸送帶。\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]按左上角的此按鈕暫停。 @@ -922,65 +999,65 @@ tutorial.breaking = 方塊經常需要被銷毀。\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 = [lightgray]敵人[]來臨。\n\n防衛核心2波。建造更多的砲塔以防衛。 tutorial.waves.mobile = [lightgray]敵人[]接近。\n\n保護核心抵抗兩波攻擊。您的飛船將自動向敵人開火。\n建造更多的砲塔和鑽頭。開採更多的銅。 tutorial.launch = 一旦您達到特定的波數, 您就可以[accent] 發射核心[],放棄防禦並[accent]獲取核心中的所有資源。[]\n這些資源可以用於研究新科技。\n\n[accent]按下發射按鈕。 item.copper.description = 一種有用的結構材料。在各種類型的方塊中廣泛使用。 item.lead.description = 一種基本的起始材料。被廣泛用於電子設備和運輸液體方塊。 -item.metaglass.description = 一種超級強硬玻璃混合物。廣泛用於液體分配和存儲。 -item.graphite.description = 礦化碳,用於彈藥和電氣絕緣。 +item.metaglass.description = 一種高強度的玻璃。廣泛用於液體分配和存儲。 +item.graphite.description = 礦化的碳,用於彈藥和電氣絕緣。 item.sand.description = 一種常見的材料,廣泛用於冶煉,包括製作合金和助熔劑。 -item.coal.description = 一種常見並容易獲得的燃料。 -item.titanium.description = 一種罕見的超輕金屬,被廣泛運用於運輸液體、鑽頭和飛機。 -item.thorium.description = 一種稠密的放射性金屬,用作支撐結構和核燃料。 -item.scrap.description = 舊結構和單位的遺留剩餘物。含有痕量的許多不同的金屬。 -item.silicon.description = 一種非常有用的半導體,被用於太陽能電池板和很多複雜的電子設備。 -item.plastanium.description = 一種輕量、可延展的材料,用於高級的飛機和碎彈藥。 +item.coal.description = 遠在「播種」事件前就形成的植物化石。一種常見並容易獲得的燃料。 +item.titanium.description = 一種罕見的超輕金屬,被廣泛運用於運輸液體、鑽頭和飛行載具。 +item.thorium.description = 一種高密度的放射性金屬,用作結構支撐和核燃料。 +item.scrap.description = 舊結構和單位的殘骸。含有微量的各種金屬。 +item.silicon.description = 一種非常有用的半導體,被用於太陽能電池板、很多複雜的電子設備和追蹤導彈彈藥。 +item.plastanium.description = 一種輕量、可延展的材料,用於高級的飛行載具和破片彈藥。 item.phase-fabric.description = 一種近乎無重量的物質,用於先進的電子設備和自修復技術。 item.surge-alloy.description = 一種具有獨特電子特性的高級合金。 -item.spore-pod.description = 用於轉化為石油、爆炸物和燃料。 -item.blast-compound.description = 一種用於炸彈和炸藥的揮發性混合物。雖然它可以作為燃料燃燒,但不建議這樣做。 +item.spore-pod.description = 合成的胞子莢。合成大氣濃度的胞子做為工業用途。用於轉化為原油、爆炸物和燃料。 +item.blast-compound.description = 一種用於炸彈和爆裂物的不穩定混合物。不建議作為燃料。 item.pyratite.description = 一種在燃燒武器中使用的極易燃物質。 -liquid.water.description = 常用於冷卻機器和廢物處理。 -liquid.slag.description = 各種不同類型的熔融金屬混合在一起的液體。可以被分解成其所組成之礦物,或作為武器射向敵方單位。 -liquid.oil.description = 可以燃燒、爆炸或用作冷卻劑。 -liquid.cryofluid.description = 冷卻機器最有效的液體。 -mech.alpha-mech.description = 標準的機甲。具有不錯的速度和傷害輸出;可以製造多達3架無人機以提高進攻能力。 -mech.delta-mech.description = 一種快速、輕裝甲的機甲,是用於打了就跑的攻擊。對結構造成的傷害很小,但可以用弧形閃電武器很快殺死大量敵方機組。 -mech.tau-mech.description = 支援機甲。射擊友方方塊以修復它們。可以使用它的修復能力熄滅火焰並治療一定範圍內的友軍。 -mech.omega-mech.description = 一種笨重、裝甲重的機甲,用於在前線突擊。它的裝甲能力可以阻擋高達90%的傷害。 -mech.dart-ship.description = 標準飛船。快速、輕便,但有低的攻擊能力和慢的採礦速度。 -mech.javelin-ship.description = 一種打了就跑的侵襲船。雖然最初很慢,但它可以加速到很快的速度,並飛過敵人的前哨站,利用其閃電能力和導彈造成大量的傷害。 -mech.trident-ship.description = 一種重型轟炸機。有比較厚的裝甲。 -mech.glaive-ship.description = 一種大型、裝甲厚的武裝直升機。配備燃燒機關槍。有優秀的加速能力與最快的速度。 -unit.draug.description = 原始的採礦無人機。生產便宜。消耗品。自動在附近開採銅和鉛。將開採的資源交給最接近的核心。 -unit.spirit.description = 起始的無人機。默認在核心產生。自動挖掘礦石、收集物品和修理方塊。 -unit.phantom.description = 一種高級的無人機。自動挖掘礦石、收集物品和修理方塊。比輕型無人機明顯更有效。 -unit.dagger.description = 一種基本的地面單位。最好一群地使用。 -unit.crawler.description = 一種地面單位,由精簡的機架組成,頂部綁有炸藥。不是特別耐用。與敵人接觸時爆炸。 -unit.titan.description = 一種高級的具有裝甲的地面單位。使用碳化物作為彈藥。攻擊地面單位和空中單位。 -unit.fortress.description = 一種具有重型大砲的地面單位。 -unit.eruptor.description = 設計用於拆除建築物的重型機械。向敵人的防禦工事發射一道爐渣,融化它們,並點燃周圍可燃物。 -unit.wraith.description = 一種快速、打了就跑的攔截機。 -unit.ghoul.description = 一種重型的鋪蓋性的轟炸機。使用爆炸化合物或黃鐵礦作為彈藥。 +liquid.water.description = 最有用的液體。常用於冷卻機器和廢物處理。 +liquid.slag.description = 各種不同類型的熔融金屬混合在一起的液體。可以被分解成其所組成之礦物,或作為武器向敵方單位噴灑。 +liquid.oil.description = 用於進階材料製造的液體。可以轉化為煤炭作為燃料或噴灑向敵方單位後點燃作為武器。 +liquid.cryofluid.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.glaive-ship.description = 一種大型、配有良好裝甲的砲艇。配備燃燒機關槍。高機動性。 +unit.draug.description = 原始的採礦無人機。生產便宜。消耗品。自動在附近開採銅和鉛。將開採的資源送入最接近的核心。 +unit.spirit.description = 改造的殭屍採礦無人機,設計來修復而非採礦。會自動修理整個區域內的受損方塊。 +unit.phantom.description = 一種高級的無人機。跟隨玩家,並輔助建造及重建被摧毀的建築。 +unit.dagger.description = 一種基本的地面單位。成群使用時具有壓倒性威力。 +unit.crawler.description = 一種地面單位,由精簡的機架組成,頂部綁有炸藥。不特別耐打。與敵人接觸時爆炸。 +unit.titan.description = 一種高級的具有裝甲的地面單位。配備兩具迷你的焦土級火焰發射器。攻擊地面單位和空中單位。 +unit.fortress.description = 一種具有重型大砲的地面單位。配備兩具冰雹型的大砲,用於對敵方建築和單位的長距離攻擊。 +unit.eruptor.description = 設計用於拆除建築物的重型機械。向敵人的防禦工事發射一道熔渣,融化它們,並點燃周圍可燃物。 +unit.wraith.description = 一種快速、打帶跑的攔截機。針對發電機進行打擊。 +unit.ghoul.description = 一種重型的鋪蓋性轟炸機。摧毀敵方建築,並針對重要基礎設施進行打擊。 unit.revenant.description = 重型的盤旋導彈陣列。 -block.message.description = 儲存一條消息。用於盟友之間的交流。 +block.message.description = 儲存一條訊息。用於盟友之間的溝通。 block.graphite-press.description = 將煤炭壓縮成石墨。 block.multi-press.description = 石墨壓縮機的升級版。利用水和電力快速高效地處理煤炭。 block.silicon-smelter.description = 使用高純度焦炭還原沙子以生產矽。 -block.kiln.description = 將沙子和鉛熔煉成金屬玻璃。需要少量能量。 -block.plastanium-compressor.description = 使用油和鈦以生產塑料。 -block.phase-weaver.description = 使用放射性的釷和大量的沙子以生產相織布。 -block.alloy-smelter.description = 使用鈦、鉛、矽和銅以生產波動合金。 -block.cryofluidmixer.description = 混合水和鈦形成冷卻效率更高的冷凍液。 -block.blast-mixer.description = 使用油將硫變成比較不易燃但更具爆炸性的爆炸混合器。 -block.pyratite-mixer.description = 混合煤、鉛和沙子成為易燃的硫。 -block.melter.description = 將石頭加熱到很高的溫度以獲得熔岩。 -block.separator.description = 將石頭暴露在水壓下以獲得石頭中的各種礦物質。 -block.spore-press.description = 將孢子莢壓縮成油。 -block.pulverizer.description = 將石頭壓成沙子。當缺少天然沙子時有用。 -block.coal-centrifuge.description = 將石油凝固成煤礦。 -block.incinerator.description = 清除任何多餘的物品或液體。 +block.kiln.description = 將沙子和鉛熔煉成鋼化玻璃。需要少量能量。 +block.plastanium-compressor.description = 將原油和鈦壓縮製造塑鋼。 +block.phase-weaver.description = 使用放射性的釷和大量的沙子生產相織布。需要巨量能量。 +block.alloy-smelter.description = 使用鈦、鉛、矽和銅以生產波動合金。 +block.cryofluidmixer.description = 混合水和研磨的鈦粉製造冷卻效率更高的冷凍液。對釷反應堆是必要的。 +block.blast-mixer.description = 混合胞子碎塊將火焰彈變成比較不易燃但更具爆炸性的爆炸混合物。 +block.pyratite-mixer.description = 混合煤、鉛和沙子混合成為易燃的火焰彈。 +block.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.item-source.description = 無限輸出物品。僅限沙盒。 @@ -989,19 +1066,21 @@ 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.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.phase-wall.description = 沒有釷牆那麼堅固但特殊的相位化合物塗層會使大多的子彈偏離。 +block.phase-wall-large.description = 沒有釷牆那麼堅固但特殊的相位化合物塗層會使大多的子彈偏離。\n佔據多個方塊。 block.surge-wall.description = 最強的防禦方塊。\n有低機率對攻擊者觸發閃電。 -block.surge-wall-large.description = 最強的防衛方塊。\n有低機率對攻擊者觸發閃電。\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.overdrive-projector.description = 提高附近建築物的速度,如鑽頭和輸送帶。 -block.force-projector.description = 在自身周圍形成一個六角形能量力場護盾,保護內部的建築物和單位免受子彈的傷害。 +block.mend-projector.description = 高級的修理方塊。可選擇使用相織布增加範圍和效率。 +block.overdrive-projector.description = 提高附近建築物的速度,如鑽頭和輸送帶。可選擇使用相織布增加範圍和效率。 +block.force-projector.description = 在自身周圍形成一個六角形能量力場護盾,保護內部的建築物和單位免受傷害。承受太多傷害時會過熱。可選擇用冷卻液避免過熱。可以使用相織布增加護盾範圍。 block.shock-mine.description = 傷害踩到地雷的敵人。敵人幾乎看不見。 block.conveyor.description = 基本物品傳輸方塊。將物品向前移動並自動將它們放入砲塔或機器中。能夠旋轉方向。 block.titanium-conveyor.description = 高級物品傳輸方塊。比標準輸送帶更快地移動物品。 @@ -1009,14 +1088,15 @@ block.junction.description = 作為兩個交叉輸送帶的橋樑。適用於兩 block.bridge-conveyor.description = 高級的物品運輸方塊。允許跨過最多3個任何地形或建築物的方塊運輸物品。 block.phase-conveyor.description = 高級物品傳輸方塊。使用能量將物品傳送到幾個方塊外連接的相織輸送帶。 block.sorter.description = 對物品進行分類。如果物品與所選種類匹配,則允許其通過。否則,物品將從左邊和右邊輸出。 -block.router.description = 接受來自一個方向的物品並將它們平均輸出到最多3個其他方向。 用於將物品從一個來源分割為多個目標。 +block.inverted-sorter.description = 處理物品的方式類似於分類器,但將所選擇的物品輸出到側面。 +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.thermal-pump.description = 終極泵。輸出速度是機械泵的三倍並且是唯一能夠抽熔岩的泵。 -block.conduit.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 = 存儲大量液體。當液體需求非恆定時,使用它來創建緩衝或作為冷卻重要方塊的保障。 @@ -1026,62 +1106,62 @@ block.phase-conduit.description = 高級的液體運輸方塊。使用能量將 block.power-node.description = 將能量傳輸到相連的節點。該節點將從任何相鄰方塊接收能量或向任何相鄰方塊供應能量。 block.power-node-large.description = 具有更大範圍和更多連接的高級電源節點。 block.surge-tower.description = 具有兩個可用連接的超遠程能量節點。 -block.battery.description = 有能量剩餘時,存儲電力並在能量短缺時提供能量。 +block.battery.description = 有能量剩餘時存儲電力並在能量短缺時提供能量。 block.battery-large.description = 比普通電池存儲更多的能量。 -block.combustion-generator.description = 透過燃燒油或可燃物品以產生能量。 -block.thermal-generator.description = 使用熔岩產生大量的能量。 -block.turbine-generator.description = 比燃燒發電機更有效,但需要水以操作。 -block.differential-generator.description = 產生大量能量。利用冷卻液和燃燒的硫之間的溫差產生大量的能量。 -block.rtg-generator.description = 一種放射性同位素熱發電機,不需要冷卻,但比釷反應堆產生的能量少。 +block.combustion-generator.description = 透過燃燒原油或可燃物品以產生能量。 +block.thermal-generator.description = 放置在熱的位置時會產生能量。 +block.turbine-generator.description = 比燃燒發電機更有效率,但需要水才能運作。 +block.differential-generator.description = 產生大量能量。利用冷卻液和燃燒的火焰彈之間的溫差產生大量的能量。 +block.rtg-generator.description = 一種簡單、可靠的發電機,不需要冷卻,但產生的能量比釷反應堆少。 block.solar-panel.description = 透過太陽產生少量的能量。 block.solar-panel-large.description = 比標準太陽能板產生更多的能量,但建造起來昂貴得多。 -block.thorium-reactor.description = 從高度放射性釷產生大量能量。需要持續冷卻。如果供應的冷卻劑不足,會劇烈爆炸。 -block.impact-reactor.description = 先進的發電機,能夠以峰值效率產生大量功率。需要大量的電源輸入才能啟動該過程。 -block.mechanical-drill.description = 一種便宜的鑽頭。當放置在適當的方塊上時,以緩慢的速度無限期地輸出物品。 -block.pneumatic-drill.description = 一種改進的鑽頭。它挖掘更快,能夠利用氣壓挖掘更硬的材料。 +block.thorium-reactor.description = 從高度放射性釷產生大量能量。需要持續冷卻。如果供應的冷卻劑不足,會劇烈爆炸。產生的能量取決於釷裝載量,滿載時會達到基礎發電功率。 +block.impact-reactor.description = 先進的發電機,在尖峰值效率時能產生巨量能量。需要大量的電源輸入才能啟動該過程。 +block.mechanical-drill.description = 一種便宜的鑽頭。當放置在適當的方塊上時,以緩慢的速度無限期地輸出物品。只能挖掘基本的原料。 +block.pneumatic-drill.description = 一種改進的鑽頭,可以挖掘鈦。比機械鑽頭挖掘的更快。 block.laser-drill.description = 通過激光技術可以更快地挖掘,但需要能量。此外,這種鑽頭可以挖掘放射性釷。 block.blast-drill.description = 終極的鑽頭。需要大量能量。 block.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.cultivator.description = 將大氣中微小濃度的胞子培養成工業等級的孢子莢。 +block.oil-extractor.description = 使用大量的能量、水以及沙子鑽取原油。當附近沒有直接的原油來源時使用它。 +block.core-shard.description = 初代的核心膠囊。一旦被摧毀,與該地區的所有聯繫都將失去。不要讓這種情況發生。 +block.core-foundation.description = 第二代核心。有更好的裝甲。可以存儲更多資源。 +block.core-nucleus.description = 第三代核心,也是最後一代。裝甲非常好。可以存儲大量資源。 +block.vault.description = 存儲大量的每一種物品。當物品需求非恆定時,使用它來創建緩衝。使用[lightgray]裝卸器[]以從存儲庫提取物品。 +block.container.description = 存儲少量的每一種物品。當物品需求非恆定時,使用它來創建緩衝。使用[lightgray]裝卸器[]以從容器提取物品。 block.unloader.description = 將物品從容器、存儲庫或核心卸載到傳輸帶上或直接卸載到相鄰的方塊中。透過點擊卸載器來更改要卸載的物品類型。 -block.launch-pad.description = 無需經過核心即可直接發射物品。 +block.launch-pad.description = 無需發射核心即可直接發射物品。 block.launch-pad-large.description = 發射台的進階版。可存儲更多物品。更快的發射速度。 block.duo.description = 一種小而便宜的砲塔。 block.scatter.description = 一種中型防空砲塔。向敵方單位噴射鉛塊或碎片。 -block.scorch.description = 燃燒所有靠近它的地面敵人。近距離效果很好。 -block.hail.description = 一種小型火砲。 -block.wave.description = 一種可以快速射出液體氣泡的中型砲塔。 -block.lancer.description = 一種射出電子束的中型砲塔。 -block.arc.description = 一種向敵人射出隨機電弧的小砲塔。 -block.swarmer.description = 一種射出爆炸導彈的中型砲塔。 -block.salvo.description = 一種齊射的中型砲塔。 -block.fuse.description = 一種射出強大的短程射線的大型砲塔。 -block.ripple.description = 一種一次射出幾發子彈的大型火砲。 -block.cyclone.description = 一種快速射擊的大型砲塔。 -block.spectre.description = 一種一次射出兩顆強大的子彈的大型砲塔。 -block.meltdown.description = 一種射出強大的遠程光束的大型砲塔。 +block.scorch.description = 燃燒所有靠近它的地面敵人。在近距離效果很好。 +block.hail.description = 一種小型的長距離迫擊砲。 +block.wave.description = 一種可以向敵人噴灑液體束的中型砲塔。提供水時可以自動滅火。 +block.lancer.description = 一種對地的中型雷射砲塔。充能並發射出強大的能源束。 +block.arc.description = 一種近距的小型電擊砲塔。向敵人發射電弧。 +block.swarmer.description = 一種中型導彈砲塔。能攻擊空中和地面的敵人。發射追蹤導彈。 +block.salvo.description = 一種更大、更先進版本的雙炮。快速地向敵人齊射數發子彈。 +block.fuse.description = 一種近距的大型能量砲塔。向敵人發射三道貫穿性的能源束。 +block.ripple.description = 極為強大的迫擊炮塔。一次向敵人發射數發子彈。 +block.cyclone.description = 一種對空和對地的大型砲塔。向附近單位發射爆裂性的碎塊。 +block.spectre.description = 一種雙炮管的巨型砲塔。向空中及地面敵人發射大型的穿甲彈。 +block.meltdown.description = 一種巨型激光砲塔。充能並發射持續性的激光光束。需要冷卻液以運作。 block.command-center.description = 向地圖上的盟軍發出移動命令。\n使單位巡邏,攻擊敵人的核心或撤退到核心/工廠。當沒有敵人核心時,部隊將默認在攻擊命令下進行巡邏。 -block.draug-factory.description = 生產幽靈採礦無人機 -block.spirit-factory.description = 生產輕型無人機,用於開採礦石和修復方塊。 -block.phantom-factory.description = 生產高級的無人機,比輕型無人機明顯更有效。 -block.wraith-factory.description = 生產快速、打了就跑的攔截機單位。 +block.draug-factory.description = 生產殭屍採礦無人機。 +block.spirit-factory.description = 生產幽靈無人機,用於修復方塊。 +block.phantom-factory.description = 生產高級的建造無人機。 +block.wraith-factory.description = 生產快速、打帶跑的攔截機單位。 block.ghoul-factory.description = 生產重型鋪蓋轟炸機。 -block.revenant-factory.description = 生產重型激光地面單位。 +block.revenant-factory.description = 生產重型飛行導彈單位。 block.dagger-factory.description = 生產基本地面單位。 block.crawler-factory.description = 生產快速的自爆部隊。 block.titan-factory.description = 生產具有裝甲的高級地面單位。 block.fortress-factory.description = 生產重型火砲地面單位。 block.repair-point.description = 持續治療附近最近的受損單位。 -block.dart-mech-pad.description = 提供轉換為基本攻擊機制的能力。\n站在上面的時候按下它使用。 -block.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/contributors b/core/assets/contributors index cff8b843f1..93fcb7ccc4 100644 --- a/core/assets/contributors +++ b/core/assets/contributors @@ -82,3 +82,4 @@ AzariasB amrsoll ねらひかだ Draco +Quezler diff --git a/core/assets/sprites/block_colors.png b/core/assets/sprites/block_colors.png index a518537775..8a6f48f220 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 fb1de5ace9..a6039324d8 100644 --- a/core/assets/sprites/sprites.atlas +++ b/core/assets/sprites/sprites.atlas @@ -6,5754 +6,5852 @@ filter: Nearest,Nearest repeat: none force-projector-top rotate: false - xy: 651, 752 + xy: 553, 735 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 mend-projector-top rotate: false - xy: 1243, 1163 + xy: 1333, 1299 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 mender-top rotate: false - xy: 955, 467 + xy: 1419, 567 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 overdrive-projector-top rotate: false - xy: 1375, 1295 + xy: 1465, 1299 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 shock-mine rotate: false - xy: 1721, 1059 + xy: 1443, 843 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 bridge-arrow rotate: false - xy: 695, 12 + xy: 1371, 805 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 bridge-conveyor-bridge rotate: false - xy: 763, 80 + xy: 1269, 771 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 bridge-conveyor-end rotate: false - xy: 763, 46 + xy: 1303, 771 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 center rotate: false - xy: 763, 12 + xy: 1337, 771 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 armored-conveyor-0-0 rotate: false - xy: 2010, 1573 + xy: 1129, 735 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-armored-conveyor-full rotate: false - xy: 2010, 1573 + xy: 1129, 735 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 armored-conveyor-0-1 rotate: false - xy: 1733, 1365 + xy: 1129, 701 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 armored-conveyor-0-2 rotate: false - xy: 1733, 1331 + xy: 1129, 667 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 armored-conveyor-0-3 rotate: false - xy: 1767, 1365 + xy: 1129, 633 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 armored-conveyor-1-0 rotate: false - xy: 1733, 1297 + xy: 1079, 589 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 armored-conveyor-1-1 rotate: false - xy: 1767, 1331 + xy: 1113, 589 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 armored-conveyor-1-2 rotate: false - xy: 1801, 1365 + xy: 1996, 991 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 armored-conveyor-1-3 rotate: false - xy: 1733, 1263 + xy: 1164, 967 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 armored-conveyor-2-0 rotate: false - xy: 1767, 1297 + xy: 1198, 975 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 armored-conveyor-2-1 rotate: false - xy: 1801, 1331 + xy: 1232, 975 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 armored-conveyor-2-2 rotate: false - xy: 1835, 1365 + xy: 1266, 975 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 armored-conveyor-2-3 rotate: false - xy: 1733, 1229 + xy: 1300, 975 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 armored-conveyor-3-0 rotate: false - xy: 1767, 1263 + xy: 1334, 975 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 armored-conveyor-3-1 rotate: false - xy: 1801, 1297 + xy: 1368, 975 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 armored-conveyor-3-2 rotate: false - xy: 1835, 1331 + xy: 1402, 979 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 armored-conveyor-3-3 rotate: false - xy: 1869, 1365 + xy: 1171, 933 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 armored-conveyor-4-0 rotate: false - xy: 1733, 1195 + xy: 1205, 941 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 armored-conveyor-4-1 rotate: false - xy: 1767, 1229 + xy: 1239, 941 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 armored-conveyor-4-2 rotate: false - xy: 1801, 1263 + xy: 1273, 941 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 armored-conveyor-4-3 rotate: false - xy: 1835, 1297 + xy: 1307, 941 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conveyor-0-1 rotate: false - xy: 1633, 825 + xy: 1333, 737 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conveyor-0-2 rotate: false - xy: 1633, 791 + xy: 1265, 635 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conveyor-0-3 rotate: false - xy: 1971, 1101 + xy: 1299, 669 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conveyor-1-0 rotate: false - xy: 2005, 1101 + xy: 1333, 703 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conveyor-1-1 rotate: false - xy: 829, 148 + xy: 1367, 737 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conveyor-1-2 rotate: false - xy: 831, 114 + xy: 1299, 635 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conveyor-1-3 rotate: false - xy: 831, 80 + xy: 1333, 669 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conveyor-2-0 rotate: false - xy: 831, 46 + xy: 1367, 703 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conveyor-2-1 rotate: false - xy: 831, 12 + xy: 1333, 635 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conveyor-2-2 rotate: false - xy: 1667, 1003 + xy: 1367, 669 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conveyor-2-3 rotate: false - xy: 1667, 969 + xy: 1367, 635 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conveyor-3-0 rotate: false - xy: 1667, 935 + xy: 1215, 601 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conveyor-3-1 rotate: false - xy: 1667, 901 + xy: 1249, 601 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conveyor-3-2 rotate: false - xy: 1667, 867 + xy: 1283, 601 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conveyor-3-3 rotate: false - xy: 1667, 833 + xy: 1317, 601 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conveyor-4-0 rotate: false - xy: 1667, 799 + xy: 1351, 601 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conveyor-4-1 rotate: false - xy: 1683, 1037 + xy: 1385, 601 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conveyor-4-2 rotate: false - xy: 1701, 1003 + xy: 1215, 567 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conveyor-4-3 rotate: false - xy: 1701, 969 + xy: 1249, 567 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-conveyor-0-1 rotate: false - xy: 1789, 1059 + xy: 1405, 775 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-conveyor-0-2 rotate: false - xy: 1823, 1059 + xy: 1439, 809 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-conveyor-0-3 rotate: false - xy: 1857, 1059 + xy: 1439, 775 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-conveyor-1-0 rotate: false - xy: 1891, 1059 + xy: 1435, 741 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-conveyor-1-1 rotate: false - xy: 1925, 1059 + xy: 1435, 707 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-conveyor-1-2 rotate: false - xy: 1735, 1025 + xy: 1435, 673 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-conveyor-1-3 rotate: false - xy: 1735, 991 + xy: 1435, 639 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-conveyor-2-0 rotate: false - xy: 1769, 1025 + xy: 1453, 605 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-conveyor-2-1 rotate: false - xy: 1735, 957 + xy: 1453, 571 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-conveyor-2-2 rotate: false - xy: 1769, 991 + xy: 1453, 537 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-conveyor-2-3 rotate: false - xy: 1803, 1025 + xy: 1075, 551 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-conveyor-3-0 rotate: false - xy: 1735, 923 + xy: 1109, 555 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-conveyor-3-1 rotate: false - xy: 1769, 957 + xy: 1477, 813 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-conveyor-3-2 rotate: false - xy: 1803, 991 + xy: 1511, 813 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-conveyor-3-3 rotate: false - xy: 1837, 1025 + xy: 1545, 813 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-conveyor-4-0 rotate: false - xy: 1735, 889 + xy: 1579, 813 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-conveyor-4-1 rotate: false - xy: 1769, 923 + xy: 1613, 813 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-conveyor-4-2 rotate: false - xy: 1803, 957 + xy: 1647, 813 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-conveyor-4-3 rotate: false - xy: 1837, 991 + xy: 1681, 813 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 mass-driver-base rotate: false - xy: 852, 1657 + xy: 717, 261 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 phase-conveyor-arrow rotate: false - xy: 989, 433 + xy: 1249, 533 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 phase-conveyor-bridge rotate: false - xy: 1023, 433 + xy: 1283, 533 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 phase-conveyor-end rotate: false - xy: 953, 399 + xy: 1317, 533 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 blast-drill rotate: false - xy: 1804, 1917 + xy: 204, 993 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 blast-drill-rim rotate: false - xy: 323, 1392 + xy: 334, 993 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 blast-drill-rotator rotate: false - xy: 526, 1595 + xy: 477, 1371 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 blast-drill-top rotate: false - xy: 453, 1392 + xy: 413, 1241 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 drill-top rotate: false - xy: 1177, 1295 + xy: 913, 325 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 turbine-generator-liquid rotate: false - xy: 1177, 1295 + xy: 913, 325 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 laser-drill rotate: false - xy: 749, 946 + xy: 619, 343 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 laser-drill-rim rotate: false - xy: 749, 848 + xy: 619, 245 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 laser-drill-rotator rotate: false - xy: 749, 750 + xy: 619, 147 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 laser-drill-top rotate: false - xy: 749, 652 + xy: 619, 49 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 mechanical-drill rotate: false - xy: 1045, 965 + xy: 1135, 1299 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 mechanical-drill-rotator rotate: false - xy: 1111, 1031 + xy: 1201, 1299 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 mechanical-drill-top rotate: false - xy: 1177, 1097 + xy: 1267, 1299 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 oil-extractor rotate: false - xy: 852, 1559 + xy: 717, 163 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 oil-extractor-liquid rotate: false - xy: 950, 1657 + xy: 717, 65 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 oil-extractor-rotator rotate: false - xy: 950, 1559 + xy: 749, 751 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 oil-extractor-top rotate: false - xy: 1048, 1657 + xy: 815, 653 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 pneumatic-drill rotate: false - xy: 1375, 1229 + xy: 1861, 1299 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 pneumatic-drill-rotator rotate: false - xy: 1045, 833 + xy: 1927, 1299 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 pneumatic-drill-top rotate: false - xy: 1111, 899 + xy: 921, 1183 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 water-extractor rotate: false - xy: 1441, 1031 + xy: 1911, 1167 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 water-extractor-liquid rotate: false - xy: 1441, 965 + xy: 956, 1101 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 water-extractor-rotator rotate: false - xy: 1441, 899 + xy: 956, 1035 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 water-extractor-top rotate: false - xy: 1441, 833 + xy: 1022, 1101 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 block-border rotate: false - xy: 1767, 1195 + xy: 1436, 979 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-middle rotate: false - xy: 2005, 1169 + xy: 1749, 915 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-select rotate: false - xy: 727, 148 + xy: 1579, 881 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conduit-liquid rotate: false - xy: 1474, 683 + xy: 1265, 737 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 place-arrow rotate: false - xy: 1048, 1559 + xy: 815, 555 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 rubble-1-0 rotate: false - xy: 1243, 1031 + xy: 1069, 1233 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 rubble-1-1 rotate: false - xy: 1309, 1097 + xy: 1135, 1233 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 rubble-2-0 rotate: false - xy: 1375, 1163 + xy: 1201, 1233 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 rubble-2-1 rotate: false - xy: 1045, 767 + xy: 1267, 1233 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 rubble-3-0 rotate: false - xy: 1244, 1657 + xy: 815, 261 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 rubble-3-1 rotate: false - xy: 1244, 1657 + xy: 815, 261 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 rubble-4-0 rotate: false - xy: 423, 742 + xy: 1059, 1497 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 rubble-4-1 rotate: false - xy: 423, 742 + xy: 1059, 1497 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 +rubble-5-0 + rotate: false + xy: 1876, 1887 + size: 160, 160 + orig: 160, 160 + offset: 0, 0 + index: -1 +rubble-5-1 + rotate: false + xy: 1876, 1887 + size: 160, 160 + orig: 160, 160 + offset: 0, 0 + index: -1 +rubble-6-0 + rotate: false + xy: 1, 750 + size: 192, 192 + orig: 192, 192 + offset: 0, 0 + index: -1 +rubble-6-1 + rotate: false + xy: 1, 750 + size: 192, 192 + orig: 192, 192 + offset: 0, 0 + index: -1 +rubble-7-0 + rotate: false + xy: 323, 1501 + size: 224, 224 + orig: 224, 224 + offset: 0, 0 + index: -1 +rubble-7-1 + rotate: false + xy: 323, 1501 + size: 224, 224 + orig: 224, 224 + offset: 0, 0 + index: -1 +rubble-8-0 + rotate: false + xy: 1, 1147 + size: 256, 256 + orig: 256, 256 + offset: 0, 0 + index: -1 +rubble-8-1 + rotate: false + xy: 1, 1147 + size: 256, 256 + orig: 256, 256 + offset: 0, 0 + index: -1 bridge-conduit-arrow rotate: false - xy: 729, 46 + xy: 1987, 855 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 bridge-conveyor-arrow rotate: false - xy: 729, 46 + xy: 1987, 855 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 bridge-conduit-bridge rotate: false - xy: 729, 12 + xy: 1201, 771 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 bridge-conduit-end rotate: false - xy: 763, 114 + xy: 1235, 771 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conduit-bottom rotate: false - xy: 795, 148 + xy: 1197, 737 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conduit-bottom-0 rotate: false - xy: 797, 114 + xy: 1197, 703 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conduit-bottom-1 rotate: false - xy: 797, 80 + xy: 1231, 737 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conduit-bottom-2 rotate: false - xy: 797, 46 + xy: 1197, 669 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conduit-bottom-3 rotate: false - xy: 797, 46 + xy: 1197, 669 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conduit-bottom-4 rotate: false - xy: 797, 46 + xy: 1197, 669 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conduit-bottom-6 rotate: false - xy: 797, 46 + xy: 1197, 669 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conduit-bottom-5 rotate: false - xy: 797, 12 + xy: 1231, 703 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conduit-top-0 rotate: false - xy: 1508, 683 + xy: 1197, 635 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conduit-top-1 rotate: false - xy: 1649, 1037 + xy: 1231, 669 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conduit-top-2 rotate: false - xy: 1633, 995 + xy: 1265, 703 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conduit-top-3 rotate: false - xy: 1633, 961 + xy: 1299, 737 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 pulse-conduit-top-3 rotate: false - xy: 1633, 961 + xy: 1299, 737 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conduit-top-4 rotate: false - xy: 1633, 927 + xy: 1231, 635 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conduit-top-5 rotate: false - xy: 1633, 893 + xy: 1265, 669 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conduit-top-6 rotate: false - xy: 1633, 859 + xy: 1299, 703 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 liquid-router-bottom rotate: false - xy: 851, 308 + xy: 1953, 847 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 liquid-router-liquid rotate: false - xy: 885, 308 + xy: 1987, 821 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 liquid-router-top rotate: false - xy: 921, 455 + xy: 1401, 737 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 liquid-tank-bottom rotate: false - xy: 754, 1632 + xy: 717, 653 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 liquid-tank-liquid rotate: false - xy: 754, 1534 + xy: 717, 555 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 liquid-tank-top rotate: false - xy: 779, 1436 + xy: 717, 457 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 phase-conduit-arrow rotate: false - xy: 989, 467 + xy: 1147, 559 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 phase-conduit-bridge rotate: false - xy: 1023, 467 + xy: 1181, 559 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 phase-conduit-end rotate: false - xy: 955, 433 + xy: 1215, 533 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 pulse-conduit-top-0 rotate: false - xy: 987, 399 + xy: 1385, 533 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 pulse-conduit-top-1 rotate: false - xy: 953, 331 + xy: 1419, 533 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 pulse-conduit-top-2 rotate: false - xy: 987, 365 + xy: 1097, 475 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 pulse-conduit-top-4 rotate: false - xy: 1021, 399 + xy: 1097, 441 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 pulse-conduit-top-5 rotate: false - xy: 987, 331 + xy: 1097, 407 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 pulse-conduit-top-6 rotate: false - xy: 1021, 365 + xy: 1097, 373 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 alpha-mech-pad rotate: false - xy: 295, 24 + xy: 1976, 1821 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 block-alpha-mech-pad-full rotate: false - xy: 295, 24 + xy: 1976, 1821 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 battery rotate: false - xy: 1869, 1331 + xy: 1341, 941 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-battery-full rotate: false - xy: 1869, 1331 + xy: 1341, 941 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 battery-large rotate: false - xy: 293, 384 + xy: 527, 1143 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 block-battery-large-full rotate: false - xy: 293, 384 + xy: 527, 1143 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 combustion-generator-top rotate: false - xy: 801, 182 + xy: 1371, 771 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 differential-generator-liquid rotate: false - xy: 651, 1142 + xy: 521, 343 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 differential-generator-top rotate: false - xy: 651, 1044 + xy: 521, 245 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 impact-reactor rotate: false - xy: 219, 1262 + xy: 1586, 1757 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 impact-reactor-bottom rotate: false - xy: 349, 1262 + xy: 1716, 1757 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 impact-reactor-light rotate: false - xy: 479, 1262 + xy: 1846, 1757 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 impact-reactor-plasma-0 rotate: false - xy: 293, 1132 + xy: 929, 1586 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 impact-reactor-plasma-1 rotate: false - xy: 293, 1002 + xy: 1059, 1627 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 impact-reactor-plasma-2 rotate: false - xy: 423, 1132 + xy: 1189, 1627 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 impact-reactor-plasma-3 rotate: false - xy: 293, 872 + xy: 1319, 1627 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 power-source rotate: false - xy: 953, 365 + xy: 1351, 533 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 rtg-generator-top rotate: false - xy: 953, 263 + xy: 1097, 169 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 thorium-reactor-center rotate: false - xy: 1342, 1559 + xy: 549, 1583 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 thorium-reactor-lights rotate: false - xy: 877, 1461 + xy: 647, 1583 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 turbine-generator-top rotate: false - xy: 1441, 1295 + xy: 1647, 1167 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 alloy-smelter rotate: false - xy: 1, 1 + xy: 1, 4 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 block-alloy-smelter-full rotate: false - xy: 1, 1 + xy: 1, 4 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 alloy-smelter-top rotate: false - xy: 1934, 1949 + xy: 1449, 1529 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 blast-mixer rotate: false - xy: 1073, 1493 + xy: 1976, 1755 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 block-blast-mixer-full rotate: false - xy: 1073, 1493 + xy: 1976, 1755 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 cryofluidmixer-bottom rotate: false - xy: 979, 867 + xy: 890, 919 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 cryofluidmixer-liquid rotate: false - xy: 913, 735 + xy: 890, 853 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 cryofluidmixer-top rotate: false - xy: 979, 801 + xy: 913, 787 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 cultivator rotate: false - xy: 979, 735 + xy: 913, 721 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 cultivator-middle rotate: false - xy: 1045, 1295 + xy: 913, 655 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 cultivator-top rotate: false - xy: 1045, 1229 + xy: 913, 589 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 kiln-top rotate: false - xy: 1177, 1163 + xy: 937, 1256 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 silicon-smelter-top rotate: false - xy: 1177, 1163 + xy: 937, 1256 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 phase-weaver rotate: false - xy: 1111, 965 + xy: 1597, 1299 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 phase-weaver-bottom rotate: false - xy: 1177, 1031 + xy: 1663, 1299 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 phase-weaver-weave rotate: false - xy: 1243, 1097 + xy: 1729, 1299 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 plastanium-compressor-top rotate: false - xy: 1309, 1163 + xy: 1795, 1299 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 pulverizer rotate: false - xy: 1021, 331 + xy: 1097, 339 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 pulverizer-rotator rotate: false - xy: 953, 297 + xy: 1097, 305 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 pump-liquid rotate: false - xy: 987, 297 + xy: 1097, 271 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 separator-liquid rotate: false - xy: 1375, 1031 + xy: 1927, 1233 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 spore-press rotate: false - xy: 1243, 833 + xy: 1053, 1167 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 spore-press-frame0 rotate: false - xy: 1309, 899 + xy: 1119, 1167 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 spore-press-frame1 rotate: false - xy: 1375, 965 + xy: 1185, 1167 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 spore-press-frame2 rotate: false - xy: 1243, 767 + xy: 1251, 1167 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 spore-press-liquid rotate: false - xy: 1309, 833 + xy: 1317, 1167 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 spore-press-top rotate: false - xy: 1375, 899 + xy: 1383, 1167 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 unloader-center rotate: false - xy: 1735, 855 + xy: 1749, 813 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 arc-heat rotate: false - xy: 609, 1262 + xy: 1129, 769 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-1 rotate: false - xy: 1903, 1365 + xy: 1375, 941 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-2 rotate: false - xy: 563, 216 + xy: 1969, 1689 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 block-3 rotate: false - xy: 423, 514 + xy: 1547, 1529 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 block-4 rotate: false - xy: 163, 1031 + xy: 543, 1241 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 hail-heat rotate: false - xy: 1607, 1357 + xy: 1037, 585 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 lancer-heat rotate: false - xy: 1309, 1295 + xy: 1069, 1299 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 meltdown-heat rotate: false - xy: 293, 742 + xy: 1579, 1627 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 ripple-heat rotate: false - xy: 1146, 1559 + xy: 815, 359 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 salvo-heat rotate: false - xy: 1177, 899 + xy: 1399, 1233 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 salvo-panel-left rotate: false - xy: 1243, 965 + xy: 1465, 1233 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 salvo-panel-right rotate: false - xy: 1309, 1031 + xy: 1531, 1233 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 scorch-heat rotate: false - xy: 1021, 263 + xy: 1097, 101 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 wave-liquid rotate: false - xy: 1045, 701 + xy: 1022, 1035 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 crawler-factory rotate: false - xy: 979, 933 + xy: 890, 1051 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 dagger-factory rotate: false - xy: 979, 933 + xy: 890, 1051 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 draug-factory rotate: false - xy: 979, 933 + xy: 890, 1051 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 phantom-factory rotate: false - xy: 979, 933 + xy: 890, 1051 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 spirit-factory rotate: false - xy: 979, 933 + xy: 890, 1051 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 wraith-factory rotate: false - xy: 979, 933 + xy: 890, 1051 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 crawler-factory-top rotate: false - xy: 913, 801 + xy: 890, 985 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 dagger-factory-top rotate: false - xy: 1111, 1295 + xy: 913, 523 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 draug-factory-top rotate: false - xy: 1111, 1229 + xy: 913, 391 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 fortress-factory rotate: false - xy: 651, 654 + xy: 651, 751 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 fortress-factory-top rotate: false - xy: 749, 1240 + xy: 619, 637 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 ghoul-factory-top rotate: false - xy: 749, 1240 + xy: 619, 637 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 titan-factory-top rotate: false - xy: 749, 1240 + xy: 619, 637 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 ghoul-factory rotate: false - xy: 749, 1044 + xy: 619, 441 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 phantom-factory-top rotate: false - xy: 1045, 899 + xy: 1531, 1299 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 rally-point rotate: false - xy: 1177, 965 + xy: 1003, 1233 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 repair-point-base rotate: false - xy: 919, 285 + xy: 1097, 203 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 revenant-factory rotate: false - xy: 423, 872 + xy: 1709, 1627 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 revenant-factory-top rotate: false - xy: 293, 612 + xy: 1839, 1627 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 spirit-factory-top rotate: false - xy: 1177, 767 + xy: 987, 1167 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 titan-factory rotate: false - xy: 975, 1461 + xy: 745, 1579 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 wraith-factory-top rotate: false - xy: 1111, 701 + xy: 1088, 1101 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 door-large-open rotate: false - xy: 1045, 1163 + xy: 913, 457 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 door-open rotate: false - xy: 1276, 675 + xy: 1029, 373 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 +insulator-wall + rotate: false + xy: 1029, 271 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +insulator-wall-large + rotate: false + xy: 937, 1322 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 scrap-wall-huge2 rotate: false - xy: 1244, 1559 + xy: 815, 163 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 scrap-wall-huge3 rotate: false - xy: 1342, 1657 + xy: 815, 65 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 scrap-wall-large1 rotate: false - xy: 1111, 767 + xy: 1663, 1233 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 scrap-wall-large2 rotate: false - xy: 1177, 833 + xy: 1729, 1233 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 scrap-wall-large3 rotate: false - xy: 1243, 899 + xy: 1795, 1233 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 scrap-wall-large4 rotate: false - xy: 1309, 965 + xy: 1861, 1233 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 scrap-wall2 rotate: false - xy: 1967, 1067 + xy: 1097, 67 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 scrap-wall3 rotate: false - xy: 2001, 1067 + xy: 1097, 33 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 scrap-wall4 rotate: false - xy: 1687, 1075 + xy: 1409, 843 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 scrap-wall5 rotate: false - xy: 1687, 1075 + xy: 1409, 843 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 bullet rotate: false - xy: 913, 681 + xy: 979, 538 size: 52, 52 orig: 52, 52 offset: 0, 0 index: -1 bullet-back rotate: false - xy: 1556, 1549 + xy: 1386, 1113 size: 52, 52 orig: 52, 52 offset: 0, 0 index: -1 casing rotate: false - xy: 847, 660 + xy: 2038, 2031 size: 8, 16 orig: 8, 16 offset: 0, 0 index: -1 circle-shadow rotate: false - xy: 645, 1844 + xy: 863, 1846 size: 201, 201 orig: 201, 201 offset: 0, 0 index: -1 error rotate: false - xy: 1719, 1503 + xy: 817, 15 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 laser rotate: false - xy: 155, 301 + xy: 1072, 927 size: 4, 48 orig: 4, 48 offset: 0, 0 index: -1 laser-end rotate: false - xy: 489, 208 + xy: 549, 1509 size: 72, 72 orig: 72, 72 offset: 0, 0 index: -1 minelaser rotate: false - xy: 155, 251 + xy: 195, 894 size: 4, 48 orig: 4, 48 offset: 0, 0 index: -1 minelaser-end rotate: false - xy: 651, 580 + xy: 623, 1509 size: 72, 72 orig: 72, 72 offset: 0, 0 index: -1 missile rotate: false - xy: 759, 1732 + xy: 863, 1808 size: 36, 36 orig: 36, 36 offset: 0, 0 index: -1 missile-back rotate: false - xy: 1649, 1071 + xy: 1129, 879 size: 36, 36 orig: 36, 36 offset: 0, 0 index: -1 scale_marker rotate: false - xy: 557, 202 + xy: 607, 1371 size: 4, 4 orig: 4, 4 offset: 0, 0 index: -1 scorch1 rotate: false - xy: 1735, 753 + xy: 1469, 673 size: 28, 100 orig: 28, 100 offset: 0, 0 index: -1 scorch2 rotate: false - xy: 1765, 753 + xy: 1499, 711 size: 28, 100 orig: 28, 100 offset: 0, 0 index: -1 scorch3 rotate: false - xy: 1055, 331 + xy: 1529, 711 size: 28, 100 orig: 28, 100 offset: 0, 0 index: -1 scorch4 rotate: false - xy: 1023, 573 + xy: 1559, 711 size: 28, 100 orig: 28, 100 offset: 0, 0 index: -1 scorch5 rotate: false - xy: 1053, 599 + xy: 1589, 711 size: 28, 100 orig: 28, 100 offset: 0, 0 index: -1 shell rotate: false - xy: 1691, 1113 + xy: 1129, 841 size: 36, 36 orig: 36, 36 offset: 0, 0 index: -1 shell-back rotate: false - xy: 797, 1732 + xy: 1129, 803 size: 36, 36 orig: 36, 36 offset: 0, 0 index: -1 shot rotate: false - xy: 1755, 1059 + xy: 1405, 809 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 transfer rotate: false - xy: 285, 201 + xy: 1059, 1796 size: 4, 48 orig: 4, 48 offset: 0, 0 index: -1 transfer-arrow rotate: false - xy: 1871, 1025 + xy: 1715, 813 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 transfer-end rotate: false - xy: 759, 1770 + xy: 607, 1435 size: 72, 72 orig: 72, 72 offset: 0, 0 index: -1 white rotate: false - xy: 645, 1725 + xy: 974, 899 size: 3, 3 orig: 3, 3 offset: 0, 0 index: -1 arc rotate: false - xy: 1045, 1361 + xy: 723, 1145 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-arc-full rotate: false - xy: 1733, 1161 + xy: 1409, 945 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-blast-drill-full rotate: false - xy: 163, 901 + xy: 799, 1677 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 block-bridge-conduit-full rotate: false - xy: 1801, 1229 + xy: 1470, 983 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 bridge-conduit rotate: false - xy: 1801, 1229 + xy: 1470, 983 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-bridge-conveyor-full rotate: false - xy: 1835, 1263 + xy: 1504, 983 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 bridge-conveyor rotate: false - xy: 1835, 1263 + xy: 1504, 983 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-char-full rotate: false - xy: 1869, 1297 + xy: 1538, 983 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-cliffs-full rotate: false - xy: 1903, 1331 + xy: 1572, 983 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-coal-centrifuge-full rotate: false - xy: 361, 24 + xy: 843, 1537 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 coal-centrifuge rotate: false - xy: 361, 24 + xy: 843, 1537 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 block-combustion-generator-full rotate: false - xy: 1767, 1161 + xy: 1606, 983 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 combustion-generator rotate: false - xy: 1767, 1161 + xy: 1606, 983 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-command-center-full rotate: false - xy: 1139, 1493 + xy: 909, 1520 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 command-center rotate: false - xy: 1139, 1493 + xy: 909, 1520 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 block-conduit-full rotate: false - xy: 1801, 1195 + xy: 1640, 983 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-container-full rotate: false - xy: 629, 216 + xy: 975, 1520 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 container rotate: false - xy: 629, 216 + xy: 975, 1520 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 block-conveyor-full rotate: false - xy: 1835, 1229 + xy: 1674, 983 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conveyor-0-0 rotate: false - xy: 1835, 1229 + xy: 1674, 983 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-copper-wall-full rotate: false - xy: 1869, 1263 + xy: 1708, 983 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 copper-wall rotate: false - xy: 1869, 1263 + xy: 1708, 983 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-copper-wall-large-full rotate: false - xy: 1205, 1493 + xy: 697, 1513 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 copper-wall-large rotate: false - xy: 1205, 1493 + xy: 697, 1513 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 block-core-foundation-full rotate: false - xy: 163, 771 + xy: 929, 1716 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 core-foundation rotate: false - xy: 163, 771 + xy: 929, 1716 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 block-core-nucleus-full rotate: false - xy: 1, 999 + xy: 1066, 1887 size: 160, 160 orig: 160, 160 offset: 0, 0 index: -1 core-nucleus rotate: false - xy: 1, 999 + xy: 1066, 1887 size: 160, 160 orig: 160, 160 offset: 0, 0 index: -1 block-core-shard-full rotate: false - xy: 293, 286 + xy: 1645, 1529 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 core-shard rotate: false - xy: 293, 286 + xy: 1645, 1529 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 block-craters-full rotate: false - xy: 1903, 1297 + xy: 1742, 983 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-crawler-factory-full rotate: false - xy: 695, 216 + xy: 763, 1513 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 block-cryofluidmixer-full rotate: false - xy: 1271, 1493 + xy: 681, 1443 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 block-cultivator-full rotate: false - xy: 1337, 1493 + xy: 747, 1447 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 block-cyclone-full rotate: false - xy: 656, 1632 + xy: 1743, 1529 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 block-dagger-factory-full rotate: false - xy: 427, 24 + xy: 813, 1447 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 block-dark-metal-full rotate: false - xy: 1801, 1161 + xy: 1776, 983 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-dark-panel-1-full rotate: false - xy: 1835, 1195 + xy: 1810, 983 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-dark-panel-2-full rotate: false - xy: 1869, 1229 + xy: 1844, 983 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-dark-panel-3-full rotate: false - xy: 1903, 1263 + xy: 1878, 983 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-dark-panel-4-full rotate: false - xy: 1835, 1161 + xy: 1912, 983 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-dark-panel-5-full rotate: false - xy: 1869, 1195 + xy: 1946, 983 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-dark-panel-6-full rotate: false - xy: 1903, 1229 + xy: 1443, 945 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-darksand-full rotate: false - xy: 1869, 1161 + xy: 1477, 949 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-darksand-tainted-water-full rotate: false - xy: 1903, 1195 + xy: 1511, 949 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-darksand-water-full rotate: false - xy: 1903, 1161 + xy: 1545, 949 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-dart-ship-pad-full rotate: false - xy: 847, 1272 + xy: 879, 1454 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 dart-ship-pad rotate: false - xy: 847, 1272 + xy: 879, 1454 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 block-deepwater-full rotate: false - xy: 1607, 1029 + xy: 1579, 949 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-delta-mech-pad-full rotate: false - xy: 847, 1206 + xy: 945, 1454 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 delta-mech-pad rotate: false - xy: 847, 1206 + xy: 945, 1454 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 block-differential-generator-full rotate: false - xy: 553, 1164 + xy: 1841, 1529 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 differential-generator rotate: false - xy: 553, 1164 + xy: 1841, 1529 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 block-distributor-full rotate: false - xy: 847, 1140 + xy: 681, 1377 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 distributor rotate: false - xy: 847, 1140 + xy: 681, 1377 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 block-door-full rotate: false - xy: 1599, 995 + xy: 1613, 949 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 door rotate: false - xy: 1599, 995 + xy: 1613, 949 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-door-large-full rotate: false - xy: 847, 1074 + xy: 747, 1381 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 door-large rotate: false - xy: 847, 1074 + xy: 747, 1381 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 block-draug-factory-full rotate: false - xy: 847, 1008 + xy: 813, 1381 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 block-dunerocks-full rotate: false - xy: 1599, 961 + xy: 1647, 949 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-duo-full rotate: false - xy: 1599, 927 + xy: 1681, 949 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-force-projector-full rotate: false - xy: 553, 1066 + xy: 464, 1029 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 force-projector rotate: false - xy: 553, 1066 + xy: 464, 1029 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 block-fortress-factory-full rotate: false - xy: 553, 968 + xy: 464, 931 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 block-fuse-full rotate: false - xy: 553, 870 + xy: 464, 833 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 block-ghoul-factory-full rotate: false - xy: 553, 772 + xy: 455, 735 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 block-glaive-ship-pad-full rotate: false - xy: 553, 674 + xy: 625, 1143 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 glaive-ship-pad rotate: false - xy: 553, 674 + xy: 625, 1143 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 block-graphite-press-full rotate: false - xy: 847, 942 + xy: 879, 1388 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 graphite-press rotate: false - xy: 847, 942 + xy: 879, 1388 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 block-grass-full rotate: false - xy: 1599, 893 + xy: 1715, 949 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-hail-full rotate: false - xy: 1599, 859 + xy: 1749, 949 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-holostone-full rotate: false - xy: 1599, 825 + xy: 1783, 949 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-hotrock-full rotate: false - xy: 1599, 791 + xy: 1817, 949 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-ice-full rotate: false - xy: 973, 501 + xy: 1851, 949 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-ice-snow-full rotate: false - xy: 1007, 501 + xy: 1885, 949 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-icerocks-full rotate: false - xy: 1937, 1365 + xy: 1919, 949 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-ignarock-full rotate: false - xy: 1937, 1331 + xy: 1953, 949 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-impact-reactor-full rotate: false - xy: 163, 641 + xy: 204, 863 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 block-incinerator-full rotate: false - xy: 1937, 1297 + xy: 1987, 957 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 incinerator rotate: false - xy: 1937, 1297 + xy: 1987, 957 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-inverted-sorter-full rotate: false - xy: 1937, 1263 + xy: 1171, 899 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 inverted-sorter rotate: false - xy: 1937, 1263 + xy: 1171, 899 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-item-source-full rotate: false - xy: 1937, 1229 + xy: 1205, 907 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-source rotate: false - xy: 1937, 1229 + xy: 1205, 907 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-item-void-full rotate: false - xy: 1937, 1195 + xy: 1239, 907 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-void rotate: false - xy: 1937, 1195 + xy: 1239, 907 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-javelin-ship-pad-full rotate: false - xy: 847, 876 + xy: 945, 1388 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 javelin-ship-pad rotate: false - xy: 847, 876 + xy: 945, 1388 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 block-junction-full rotate: false - xy: 1937, 1161 + xy: 1273, 907 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 junction rotate: false - xy: 1937, 1161 + xy: 1273, 907 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-kiln-full rotate: false - xy: 847, 810 + xy: 673, 1311 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 kiln rotate: false - xy: 847, 810 + xy: 673, 1311 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 block-lancer-full rotate: false - xy: 847, 744 + xy: 673, 1245 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 block-laser-drill-full rotate: false - xy: 553, 576 + xy: 562, 1045 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 block-launch-pad-full rotate: false - xy: 99, 1 + xy: 562, 947 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 launch-pad rotate: false - xy: 99, 1 + xy: 562, 947 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 block-launch-pad-large-full rotate: false - xy: 163, 511 + xy: 334, 863 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 launch-pad-large rotate: false - xy: 163, 511 + xy: 334, 863 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 block-liquid-junction-full rotate: false - xy: 1971, 1373 + xy: 1307, 907 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 liquid-junction rotate: false - xy: 1971, 1373 + xy: 1307, 907 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-liquid-router-full rotate: false - xy: 1971, 1339 + xy: 1341, 907 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-liquid-source-full rotate: false - xy: 2005, 1373 + xy: 1375, 907 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 liquid-source rotate: false - xy: 2005, 1373 + xy: 1375, 907 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-liquid-tank-full rotate: false - xy: 197, 23 + xy: 562, 849 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 block-magmarock-full rotate: false - xy: 1971, 1305 + xy: 1409, 911 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-mass-driver-full rotate: false - xy: 656, 1534 + xy: 660, 1045 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 block-mechanical-drill-full rotate: false - xy: 847, 678 + xy: 1011, 1431 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 block-mechanical-pump-full rotate: false - xy: 2005, 1339 + xy: 1443, 911 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 mechanical-pump rotate: false - xy: 2005, 1339 + xy: 1443, 911 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-meltdown-full rotate: false - xy: 163, 381 + xy: 195, 733 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 block-melter-full rotate: false - xy: 1971, 1271 + xy: 1477, 915 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 melter rotate: false - xy: 1971, 1271 + xy: 1477, 915 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-mend-projector-full rotate: false - xy: 491, 142 + xy: 1077, 1431 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 mend-projector rotate: false - xy: 491, 142 + xy: 1077, 1431 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 block-mender-full rotate: false - xy: 2005, 1305 + xy: 1511, 915 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 mender rotate: false - xy: 2005, 1305 + xy: 1511, 915 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-message-full rotate: false - xy: 1971, 1237 + xy: 1545, 915 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 message rotate: false - xy: 1971, 1237 + xy: 1545, 915 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-metal-floor-2-full rotate: false - xy: 2005, 1271 + xy: 1579, 915 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-metal-floor-3-full rotate: false - xy: 1971, 1203 + xy: 1613, 915 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-metal-floor-5-full rotate: false - xy: 2005, 1237 + xy: 1647, 915 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-metal-floor-damaged-full rotate: false - xy: 1971, 1169 + xy: 1681, 915 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-metal-floor-full rotate: false - xy: 2005, 1203 + xy: 1715, 915 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-moss-full rotate: false - xy: 1733, 1127 + xy: 1783, 915 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-multi-press-full rotate: false - xy: 293, 188 + xy: 660, 947 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 multi-press rotate: false - xy: 293, 188 + xy: 660, 947 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 block-oil-extractor-full rotate: false - xy: 391, 384 + xy: 660, 849 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 block-omega-mech-pad-full rotate: false - xy: 391, 286 + xy: 423, 635 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 omega-mech-pad rotate: false - xy: 391, 286 + xy: 423, 635 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 block-ore-coal-full rotate: false - xy: 1767, 1127 + xy: 1817, 915 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-ore-coal-medium rotate: false - xy: 1767, 1127 + xy: 1817, 915 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-ore-coal-large rotate: false - xy: 609, 1296 + xy: 1407, 1455 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-ore-coal-small rotate: false - xy: 583, 1410 + xy: 1473, 787 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-ore-coal-tiny rotate: false - xy: 955, 505 + xy: 1041, 1568 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-ore-coal-xlarge rotate: false - xy: 973, 635 + xy: 979, 380 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-ore-copper-full rotate: false - xy: 1801, 1127 + xy: 1851, 915 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-ore-copper-medium rotate: false - xy: 1801, 1127 + xy: 1851, 915 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-ore-copper-large rotate: false - xy: 1557, 1003 + xy: 549, 1685 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-ore-copper-small rotate: false - xy: 1934, 1923 + xy: 259, 1379 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-ore-copper-tiny rotate: false - xy: 583, 1392 + xy: 1041, 1550 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-ore-copper-xlarge rotate: false - xy: 973, 585 + xy: 1540, 1117 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-ore-lead-full rotate: false - xy: 1835, 1127 + xy: 1885, 915 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-ore-lead-medium rotate: false - xy: 1835, 1127 + xy: 1885, 915 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-ore-lead-large rotate: false - xy: 1557, 961 + xy: 571, 9 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-ore-lead-small rotate: false - xy: 521, 586 + xy: 847, 757 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-ore-lead-tiny rotate: false - xy: 1717, 1041 + xy: 1041, 1532 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-ore-lead-xlarge rotate: false - xy: 1474, 717 + xy: 979, 330 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-ore-scrap-full rotate: false - xy: 1869, 1127 + xy: 1919, 915 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-ore-scrap-medium rotate: false - xy: 1869, 1127 + xy: 1919, 915 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-ore-scrap-large rotate: false - xy: 1557, 919 + xy: 867, 23 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-ore-scrap-small rotate: false - xy: 423, 488 + xy: 951, 35 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-ore-scrap-tiny rotate: false - xy: 155, 103 + xy: 1041, 1514 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-ore-scrap-xlarge rotate: false - xy: 923, 523 + xy: 1590, 1117 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-ore-thorium-full rotate: false - xy: 1903, 1127 + xy: 1953, 915 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-ore-thorium-medium rotate: false - xy: 1903, 1127 + xy: 1953, 915 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-ore-thorium-large rotate: false - xy: 1557, 877 + xy: 591, 1685 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-ore-thorium-small rotate: false - xy: 219, 1162 + xy: 1993, 1237 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-ore-thorium-tiny rotate: false - xy: 852, 1541 + xy: 204, 1129 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-ore-thorium-xlarge rotate: false - xy: 973, 535 + xy: 979, 280 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-ore-titanium-full rotate: false - xy: 1937, 1127 + xy: 1987, 923 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-ore-titanium-medium rotate: false - xy: 1937, 1127 + xy: 1987, 923 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-ore-titanium-large rotate: false - xy: 1557, 835 + xy: 99, 2 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-ore-titanium-small rotate: false - xy: 1073, 1467 + xy: 901, 1820 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-ore-titanium-tiny rotate: false - xy: 877, 1443 + xy: 956, 886 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-ore-titanium-xlarge rotate: false - xy: 1730, 1607 + xy: 1640, 1117 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-overdrive-projector-full rotate: false - xy: 725, 586 + xy: 1143, 1431 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 overdrive-projector rotate: false - xy: 725, 586 + xy: 1143, 1431 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 block-overflow-gate-full rotate: false - xy: 1971, 1135 + xy: 1167, 865 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 overflow-gate rotate: false - xy: 1971, 1135 + xy: 1167, 865 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-pebbles-full rotate: false - xy: 2005, 1135 + xy: 1167, 831 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-phantom-factory-full rotate: false - xy: 791, 586 + xy: 1209, 1431 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 block-phase-conduit-full rotate: false - xy: 1729, 1093 + xy: 1167, 797 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 phase-conduit rotate: false - xy: 1729, 1093 + xy: 1167, 797 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-phase-conveyor-full rotate: false - xy: 1763, 1093 + xy: 1163, 763 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 phase-conveyor rotate: false - xy: 1763, 1093 + xy: 1163, 763 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-phase-wall-full rotate: false - xy: 1797, 1093 + xy: 1163, 729 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 phase-wall rotate: false - xy: 1797, 1093 + xy: 1163, 729 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-phase-wall-large-full rotate: false - xy: 903, 1395 + xy: 1275, 1431 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 phase-wall-large rotate: false - xy: 903, 1395 + xy: 1275, 1431 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 block-phase-weaver-full rotate: false - xy: 969, 1395 + xy: 1341, 1431 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 block-pine-full rotate: false - xy: 1780, 1607 + xy: 979, 230 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-plastanium-compressor-full rotate: false - xy: 1035, 1395 + xy: 1011, 1365 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 plastanium-compressor rotate: false - xy: 1035, 1395 + xy: 1011, 1365 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +block-plastanium-wall-full + rotate: false + xy: 1163, 695 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +plastanium-wall + rotate: false + xy: 1163, 695 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-plastanium-wall-large-full + rotate: false + xy: 1077, 1365 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +plastanium-wall-large + rotate: false + xy: 1077, 1365 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 block-pneumatic-drill-full rotate: false - xy: 1403, 1493 + xy: 1143, 1365 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 block-power-node-full rotate: false - xy: 1831, 1093 + xy: 1163, 661 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 power-node rotate: false - xy: 1831, 1093 + xy: 1163, 661 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-power-node-large-full rotate: false - xy: 1101, 1427 + xy: 1209, 1365 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 power-node-large rotate: false - xy: 1101, 1427 + xy: 1209, 1365 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 block-power-source-full rotate: false - xy: 1865, 1093 + xy: 1163, 627 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-power-void-full rotate: false - xy: 1899, 1093 + xy: 1147, 593 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 power-void rotate: false - xy: 1899, 1093 + xy: 1147, 593 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-pulse-conduit-full rotate: false - xy: 1933, 1093 + xy: 1181, 593 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-pulverizer-full rotate: false - xy: 563, 182 + xy: 1987, 889 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-pyratite-mixer-full rotate: false - xy: 1167, 1427 + xy: 1275, 1365 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 pyratite-mixer rotate: false - xy: 1167, 1427 + xy: 1275, 1365 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 block-repair-point-full rotate: false - xy: 597, 182 + xy: 1205, 873 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-revenant-factory-full rotate: false - xy: 848, 1755 + xy: 325, 733 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 block-ripple-full rotate: false - xy: 391, 188 + xy: 423, 537 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 block-rock-full rotate: false - xy: 1830, 1607 + xy: 1690, 1117 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-rocks-full rotate: false - xy: 631, 182 + xy: 1239, 873 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-rotary-pump-full rotate: false - xy: 1233, 1427 + xy: 1341, 1365 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 rotary-pump rotate: false - xy: 1233, 1427 + xy: 1341, 1365 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 block-router-full rotate: false - xy: 665, 182 + xy: 1273, 873 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 router rotate: false - xy: 665, 182 + xy: 1273, 873 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-rtg-generator-full rotate: false - xy: 1299, 1427 + xy: 1407, 1365 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 rtg-generator rotate: false - xy: 1299, 1427 + xy: 1407, 1365 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 block-salt-full rotate: false - xy: 699, 182 + xy: 1307, 873 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-saltrocks-full rotate: false - xy: 733, 182 + xy: 1341, 873 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-salvo-full rotate: false - xy: 1365, 1427 + xy: 1473, 1365 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 block-sand-boulder-full rotate: false - xy: 767, 182 + xy: 1375, 873 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-sand-full rotate: false - xy: 557, 148 + xy: 1409, 877 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-sand-water-full rotate: false - xy: 591, 148 + xy: 1443, 877 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-sandrocks-full rotate: false - xy: 625, 148 + xy: 1477, 881 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-scatter-full rotate: false - xy: 1431, 1427 + xy: 1539, 1365 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 block-scorch-full rotate: false - xy: 659, 148 + xy: 1511, 881 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-scrap-wall-full rotate: false - xy: 693, 148 + xy: 1545, 881 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 scrap-wall1 rotate: false - xy: 693, 148 + xy: 1545, 881 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-scrap-wall-gigantic-full rotate: false - xy: 978, 1755 + xy: 163, 603 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 scrap-wall-gigantic rotate: false - xy: 978, 1755 + xy: 163, 603 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 block-scrap-wall-huge-full rotate: false - xy: 295, 90 + xy: 423, 439 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 scrap-wall-huge1 rotate: false - xy: 295, 90 + xy: 423, 439 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 block-scrap-wall-large-full rotate: false - xy: 1101, 1361 + xy: 1605, 1365 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 block-separator-full rotate: false - xy: 1167, 1361 + xy: 1671, 1365 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 separator rotate: false - xy: 1167, 1361 + xy: 1671, 1365 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 block-shale-boulder-full rotate: false - xy: 761, 148 + xy: 1613, 881 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-shale-full rotate: false - xy: 559, 114 + xy: 1647, 881 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-shalerocks-full rotate: false - xy: 559, 80 + xy: 1681, 881 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-shock-mine-full rotate: false - xy: 593, 114 + xy: 1715, 881 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-shrubs-full rotate: false - xy: 559, 46 + xy: 1749, 881 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-silicon-smelter-full rotate: false - xy: 1233, 1361 + xy: 1737, 1365 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 silicon-smelter rotate: false - xy: 1233, 1361 + xy: 1737, 1365 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 block-snow-full rotate: false - xy: 593, 80 + xy: 1783, 881 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-snow-pine-full rotate: false - xy: 1880, 1607 + xy: 979, 180 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-snowrock-full rotate: false - xy: 1930, 1607 + xy: 1740, 1117 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-snowrocks-full rotate: false - xy: 627, 114 + xy: 1817, 881 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-solar-panel-full rotate: false - xy: 559, 12 + xy: 1851, 881 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 solar-panel rotate: false - xy: 559, 12 + xy: 1851, 881 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-solar-panel-large-full rotate: false - xy: 393, 90 + xy: 423, 341 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 solar-panel-large rotate: false - xy: 393, 90 + xy: 423, 341 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 block-sorter-full rotate: false - xy: 593, 46 + xy: 1885, 881 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 sorter rotate: false - xy: 593, 46 + xy: 1885, 881 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-spawn-full rotate: false - xy: 627, 80 + xy: 1919, 881 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-spectre-full rotate: false - xy: 1108, 1755 + xy: 163, 473 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 block-spirit-factory-full rotate: false - xy: 1299, 1361 + xy: 1803, 1365 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 block-spore-cluster-full rotate: false - xy: 1557, 793 + xy: 2001, 1389 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-spore-moss-full rotate: false - xy: 661, 114 + xy: 1953, 881 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-spore-pine-full rotate: false - xy: 1980, 1607 + xy: 979, 130 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-spore-press-full rotate: false - xy: 1365, 1361 + xy: 1869, 1365 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 block-sporerocks-full rotate: false - xy: 593, 12 + xy: 1201, 839 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-stone-full rotate: false - xy: 627, 46 + xy: 1235, 839 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-surge-tower-full rotate: false - xy: 1431, 1361 + xy: 1935, 1365 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 surge-tower rotate: false - xy: 1431, 1361 + xy: 1935, 1365 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 block-surge-wall-full rotate: false - xy: 661, 80 + xy: 1201, 805 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 surge-wall rotate: false - xy: 661, 80 + xy: 1201, 805 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-surge-wall-large-full rotate: false - xy: 857, 612 + xy: 723, 1179 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 surge-wall-large rotate: false - xy: 857, 612 + xy: 723, 1179 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 block-swarmer-full rotate: false - xy: 857, 546 + xy: 739, 1311 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 block-tainted-water-full rotate: false - xy: 695, 114 + xy: 1269, 839 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-tar-full rotate: false - xy: 627, 12 + xy: 1235, 805 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-tau-mech-pad-full rotate: false - xy: 761, 216 + xy: 739, 1245 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 tau-mech-pad rotate: false - xy: 761, 216 + xy: 739, 1245 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 block-tendrils-full rotate: false - xy: 661, 46 + xy: 1303, 839 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-thermal-generator-full rotate: false - xy: 493, 76 + xy: 805, 1315 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 thermal-generator rotate: false - xy: 493, 76 + xy: 805, 1315 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 block-thermal-pump-full rotate: false - xy: 521, 478 + xy: 423, 243 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 thermal-pump rotate: false - xy: 521, 478 + xy: 423, 243 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 block-thorium-reactor-full rotate: false - xy: 489, 380 + xy: 423, 145 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 thorium-reactor rotate: false - xy: 489, 380 + xy: 423, 145 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 block-thorium-wall-full rotate: false - xy: 695, 80 + xy: 1269, 805 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 thorium-wall rotate: false - xy: 695, 80 + xy: 1269, 805 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-thorium-wall-large-full rotate: false - xy: 493, 10 + xy: 805, 1249 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 thorium-wall-large rotate: false - xy: 493, 10 + xy: 805, 1249 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 block-thruster-full rotate: false - xy: 1238, 1755 + xy: 293, 603 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 thruster rotate: false - xy: 1238, 1755 + xy: 293, 603 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 block-titan-factory-full rotate: false - xy: 489, 282 + xy: 423, 47 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 block-titanium-conveyor-full rotate: false - xy: 729, 114 + xy: 1337, 839 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-conveyor-0-0 rotate: false - xy: 729, 114 + xy: 1337, 839 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-titanium-wall-full rotate: false - xy: 661, 12 + xy: 1303, 805 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-wall rotate: false - xy: 661, 12 + xy: 1303, 805 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-titanium-wall-large-full rotate: false - xy: 913, 1329 + xy: 789, 1179 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 titanium-wall-large rotate: false - xy: 913, 1329 + xy: 789, 1179 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 block-trident-ship-pad-full rotate: false - xy: 913, 1263 + xy: 758, 1113 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 trident-ship-pad rotate: false - xy: 913, 1263 + xy: 758, 1113 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 block-turbine-generator-full rotate: false - xy: 979, 1329 + xy: 758, 1047 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 turbine-generator rotate: false - xy: 979, 1329 + xy: 758, 1047 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 block-unloader-full rotate: false - xy: 695, 46 + xy: 1371, 839 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 unloader rotate: false - xy: 695, 46 + xy: 1371, 839 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-vault-full rotate: false - xy: 619, 478 + xy: 1449, 1431 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 vault rotate: false - xy: 619, 478 + xy: 1449, 1431 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 block-water-extractor-full rotate: false - xy: 913, 1197 + xy: 758, 981 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 block-water-full rotate: false - xy: 729, 80 + xy: 1337, 805 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-wave-full rotate: false - xy: 979, 1263 + xy: 758, 915 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 block-white-tree-dead-full rotate: false - xy: 1, 1725 + xy: 1, 1727 size: 320, 320 orig: 320, 320 offset: 0, 0 index: -1 block-white-tree-full rotate: false - xy: 1, 1403 + xy: 1, 1405 size: 320, 320 orig: 320, 320 offset: 0, 0 index: -1 block-wraith-factory-full rotate: false - xy: 913, 1131 + xy: 758, 849 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 cracks-1-0 rotate: false - xy: 1701, 935 + xy: 1283, 567 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 cracks-1-1 rotate: false - xy: 1701, 901 + xy: 1317, 567 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 cracks-1-2 rotate: false - xy: 1701, 867 + xy: 1351, 567 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 cracks-1-3 rotate: false - xy: 1701, 833 + xy: 1385, 567 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 cracks-1-4 rotate: false - xy: 1701, 799 + xy: 1033, 509 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 cracks-1-5 rotate: false - xy: 1667, 765 + xy: 1029, 475 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 cracks-1-6 rotate: false - xy: 1701, 765 + xy: 1029, 441 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 cracks-1-7 rotate: false - xy: 1242, 675 + xy: 1029, 407 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 cracks-2-0 rotate: false - xy: 979, 1197 + xy: 824, 1113 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 cracks-2-1 rotate: false - xy: 913, 1065 + xy: 824, 1047 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 cracks-2-2 rotate: false - xy: 979, 1131 + xy: 824, 981 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 cracks-2-3 rotate: false - xy: 913, 999 + xy: 824, 915 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 cracks-2-4 rotate: false - xy: 979, 1065 + xy: 824, 849 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 cracks-2-5 rotate: false - xy: 913, 933 + xy: 847, 783 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 cracks-2-6 rotate: false - xy: 979, 999 + xy: 855, 1183 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 cracks-2-7 rotate: false - xy: 913, 867 + xy: 890, 1117 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 cracks-3-0 rotate: false - xy: 587, 380 + xy: 1547, 1431 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 cracks-3-1 rotate: false - xy: 587, 282 + xy: 1645, 1431 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 cracks-3-2 rotate: false - xy: 685, 380 + xy: 1743, 1431 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 cracks-3-3 rotate: false - xy: 685, 282 + xy: 1841, 1431 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 cracks-3-4 rotate: false - xy: 583, 1436 + xy: 1939, 1529 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 cracks-3-5 rotate: false - xy: 681, 1436 + xy: 1939, 1431 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 cracks-3-6 rotate: false - xy: 609, 1338 + xy: 521, 637 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 cracks-3-7 rotate: false - xy: 707, 1338 + xy: 521, 539 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 cracks-4-0 rotate: false - xy: 1758, 1787 + xy: 293, 343 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 cracks-4-1 rotate: false - xy: 1888, 1787 + xy: 293, 213 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 cracks-4-2 rotate: false - xy: 1498, 1661 + xy: 163, 83 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 cracks-4-3 rotate: false - xy: 1628, 1661 + xy: 293, 83 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 cracks-4-4 rotate: false - xy: 1758, 1657 + xy: 1066, 1757 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 cracks-4-5 rotate: false - xy: 1888, 1657 + xy: 1196, 1757 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 cracks-4-6 rotate: false - xy: 163, 251 + xy: 1326, 1757 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 cracks-4-7 rotate: false - xy: 155, 121 + xy: 1456, 1757 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 cracks-5-0 rotate: false - xy: 848, 1885 + xy: 1, 588 size: 160, 160 orig: 160, 160 offset: 0, 0 index: -1 cracks-5-1 rotate: false - xy: 1, 837 + xy: 1228, 1887 size: 160, 160 orig: 160, 160 offset: 0, 0 index: -1 cracks-5-2 rotate: false - xy: 1010, 1885 + xy: 1, 426 size: 160, 160 orig: 160, 160 offset: 0, 0 index: -1 cracks-5-3 rotate: false - xy: 1, 675 + xy: 1390, 1887 size: 160, 160 orig: 160, 160 offset: 0, 0 index: -1 cracks-5-4 rotate: false - xy: 1172, 1885 + xy: 1, 264 size: 160, 160 orig: 160, 160 offset: 0, 0 index: -1 cracks-5-5 rotate: false - xy: 1, 513 + xy: 1552, 1887 size: 160, 160 orig: 160, 160 offset: 0, 0 index: -1 cracks-5-6 rotate: false - xy: 1334, 1885 + xy: 1, 102 size: 160, 160 orig: 160, 160 offset: 0, 0 index: -1 cracks-5-7 rotate: false - xy: 1, 351 + xy: 1714, 1887 size: 160, 160 orig: 160, 160 offset: 0, 0 index: -1 cyclone rotate: false - xy: 651, 1240 + xy: 521, 441 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 duo rotate: false - xy: 1310, 675 + xy: 1029, 339 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 fuse rotate: false - xy: 749, 1142 + xy: 619, 539 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 hail rotate: false - xy: 1344, 675 + xy: 1029, 305 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-blast-compound-large rotate: false - xy: 1607, 1315 + xy: 1033, 543 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 item-blast-compound-medium rotate: false - xy: 1412, 675 + xy: 1029, 203 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-blast-compound-small rotate: false - xy: 1017, 709 + xy: 1783, 821 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 item-blast-compound-tiny rotate: false - xy: 197, 5 + xy: 1407, 1437 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 item-blast-compound-xlarge rotate: false - xy: 1969, 1507 + xy: 1246, 1059 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 item-coal-large rotate: false - xy: 1607, 1273 + xy: 613, 7 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 item-coal-medium rotate: false - xy: 759, 552 + xy: 1029, 135 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-coal-small rotate: false - xy: 1507, 769 + xy: 1469, 647 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 item-coal-tiny rotate: false - xy: 1079, 1377 + xy: 697, 31 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 item-coal-xlarge rotate: false - xy: 1547, 1445 + xy: 1296, 1059 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 item-copper-large rotate: false - xy: 1607, 1231 + xy: 655, 7 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 item-copper-medium rotate: false - xy: 717, 518 + xy: 1029, 67 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-copper-small rotate: false - xy: 1446, 683 + xy: 1499, 685 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 item-copper-tiny rotate: false - xy: 1017, 691 + xy: 1172, 1025 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 item-copper-xlarge rotate: false - xy: 1547, 1395 + xy: 1346, 1059 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 item-graphite-large rotate: false - xy: 1607, 1189 + xy: 909, 19 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 item-graphite-medium rotate: false - xy: 751, 518 + xy: 1067, 509 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-graphite-small rotate: false - xy: 827, 560 + xy: 1619, 787 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 item-graphite-tiny rotate: false - xy: 1533, 777 + xy: 1619, 717 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 item-graphite-xlarge rotate: false - xy: 1597, 1449 + xy: 1396, 1063 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 item-lead-large rotate: false - xy: 1607, 1147 + xy: 2001, 1347 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 item-lead-medium rotate: false - xy: 751, 484 + xy: 1063, 441 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-lead-small rotate: false - xy: 783, 288 + xy: 285, 1379 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 item-lead-tiny rotate: false - xy: 1769, 879 + xy: 1887, 829 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 item-lead-xlarge rotate: false - xy: 1597, 1399 + xy: 1446, 1067 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 item-metaglass-large rotate: false - xy: 1607, 1105 + xy: 1993, 1305 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 item-metaglass-medium rotate: false - xy: 783, 450 + xy: 1063, 373 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-metaglass-small rotate: false - xy: 1803, 931 + xy: 873, 757 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 item-metaglass-tiny rotate: false - xy: 1055, 287 + xy: 1671, 743 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 item-metaglass-xlarge rotate: false - xy: 1647, 1453 + xy: 1496, 1067 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 item-phase-fabric-large rotate: false - xy: 1607, 1063 + xy: 1993, 1263 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 item-phase-fabric-medium rotate: false - xy: 783, 382 + xy: 1063, 305 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-phase-fabric-small rotate: false - xy: 1837, 965 + xy: 1809, 821 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 item-phase-fabric-tiny rotate: false - xy: 1049, 555 + xy: 1697, 769 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 item-phase-fabric-xlarge rotate: false - xy: 1697, 1453 + xy: 1546, 1067 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 item-plastanium-large rotate: false - xy: 1649, 1361 + xy: 1088, 1001 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 item-plastanium-medium rotate: false - xy: 783, 314 + xy: 1063, 237 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-plastanium-small rotate: false - xy: 1871, 999 + xy: 1525, 685 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 item-plastanium-tiny rotate: false - xy: 1109, 683 + xy: 1723, 795 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 item-plastanium-xlarge rotate: false - xy: 1647, 1403 + xy: 1596, 1067 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 item-pyratite-large rotate: false - xy: 1691, 1361 + xy: 1130, 1001 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 item-pyratite-medium rotate: false - xy: 819, 484 + xy: 1063, 169 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-pyratite-small rotate: false - xy: 1905, 1033 + xy: 1619, 761 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 item-pyratite-tiny rotate: false - xy: 1083, 631 + xy: 1011, 1502 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 item-pyratite-xlarge rotate: false - xy: 1697, 1403 + xy: 1646, 1067 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 item-sand-large rotate: false - xy: 1649, 1319 + xy: 1080, 959 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 item-sand-medium rotate: false - xy: 817, 416 + xy: 1063, 101 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-sand-small rotate: false - xy: 1769, 897 + xy: 1645, 787 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 item-sand-tiny rotate: false - xy: 1986, 1931 + xy: 222, 1129 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 item-sand-xlarge rotate: false - xy: 1747, 1449 + xy: 1696, 1067 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 item-scrap-large rotate: false - xy: 1649, 1277 + xy: 1122, 959 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 item-scrap-medium rotate: false - xy: 817, 348 + xy: 1063, 33 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-scrap-small rotate: false - xy: 1055, 305 + xy: 1835, 821 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 item-scrap-tiny rotate: false - xy: 475, 496 + xy: 956, 868 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 item-scrap-xlarge rotate: false - xy: 1747, 1399 + xy: 1746, 1067 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 item-silicon-large rotate: false - xy: 1691, 1319 + xy: 1087, 917 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 item-silicon-medium rotate: false - xy: 853, 512 + xy: 1511, 847 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-silicon-small rotate: false - xy: 1023, 547 + xy: 1551, 685 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 item-silicon-tiny rotate: false - xy: 271, 1170 + xy: 1425, 1437 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 item-silicon-xlarge rotate: false - xy: 1797, 1449 + xy: 1796, 1067 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 item-spore-pod-large rotate: false - xy: 1649, 1235 + xy: 1087, 875 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 item-spore-pod-medium rotate: false - xy: 853, 478 + xy: 1579, 847 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-spore-pod-small rotate: false - xy: 1083, 675 + xy: 1619, 735 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 item-spore-pod-tiny rotate: false - xy: 173, 103 + xy: 697, 13 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 item-spore-pod-xlarge rotate: false - xy: 1797, 1399 + xy: 1846, 1067 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 item-surge-alloy-large rotate: false - xy: 1691, 1277 + xy: 1087, 833 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 item-surge-alloy-medium rotate: false - xy: 921, 489 + xy: 1647, 847 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-surge-alloy-small rotate: false - xy: 1083, 649 + xy: 1645, 761 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 item-surge-alloy-tiny rotate: false - xy: 215, 5 + xy: 1172, 1007 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 item-surge-alloy-xlarge rotate: false - xy: 1847, 1449 + xy: 1896, 1067 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 item-thorium-large rotate: false - xy: 1649, 1193 + xy: 1087, 791 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 item-thorium-medium rotate: false - xy: 885, 444 + xy: 1715, 847 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-thorium-small rotate: false - xy: 1053, 573 + xy: 1671, 787 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 item-thorium-tiny rotate: false - xy: 1035, 683 + xy: 1637, 717 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 item-thorium-xlarge rotate: false - xy: 1847, 1399 + xy: 1946, 1067 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 item-titanium-large rotate: false - xy: 1691, 1235 + xy: 1087, 749 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 item-titanium-medium rotate: false - xy: 885, 410 + xy: 1783, 847 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-titanium-small rotate: false - xy: 1960, 1923 + xy: 1861, 821 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 item-titanium-tiny rotate: false - xy: 1769, 861 + xy: 1905, 829 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 item-titanium-xlarge rotate: false - xy: 1897, 1449 + xy: 1996, 1075 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 lancer rotate: false - xy: 1243, 1229 + xy: 1003, 1299 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 liquid-cryofluid-large rotate: false - xy: 1649, 1151 + xy: 1087, 707 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 liquid-cryofluid-medium rotate: false - xy: 885, 376 + xy: 1851, 847 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 liquid-cryofluid-small rotate: false - xy: 449, 488 + xy: 1577, 685 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 liquid-cryofluid-tiny rotate: false - xy: 1055, 269 + xy: 1741, 795 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 liquid-cryofluid-xlarge rotate: false - xy: 1997, 1457 + xy: 1346, 1009 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 liquid-oil-large rotate: false - xy: 1691, 1193 + xy: 1087, 665 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 liquid-oil-medium rotate: false - xy: 885, 342 + xy: 1919, 847 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 liquid-oil-small rotate: false - xy: 245, 1162 + xy: 1645, 735 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 liquid-oil-tiny rotate: false - xy: 1109, 665 + xy: 240, 1129 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 liquid-oil-xlarge rotate: false - xy: 1997, 1407 + xy: 1396, 1013 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 liquid-slag-large rotate: false - xy: 1649, 1109 + xy: 1087, 623 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 liquid-slag-medium rotate: false - xy: 919, 387 + xy: 1401, 669 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 liquid-slag-small rotate: false - xy: 809, 288 + xy: 1671, 761 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 liquid-slag-tiny rotate: false - xy: 1127, 683 + xy: 1923, 829 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 liquid-slag-xlarge rotate: false - xy: 1507, 1345 + xy: 1446, 1017 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 liquid-water-large rotate: false - xy: 1691, 1151 + xy: 1129, 917 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 liquid-water-medium rotate: false - xy: 919, 319 + xy: 1419, 601 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 liquid-water-small rotate: false - xy: 1931, 1033 + xy: 1697, 787 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 liquid-water-tiny rotate: false - xy: 1083, 613 + xy: 1759, 795 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 liquid-water-xlarge rotate: false - xy: 1507, 1295 + xy: 1496, 1017 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 mass-driver rotate: false - xy: 805, 1338 + xy: 717, 359 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 mech-alpha-mech-full rotate: false - xy: 1507, 1245 + xy: 1546, 1017 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 mech-dart-ship-full rotate: false - xy: 1507, 1195 + xy: 1596, 1017 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 mech-delta-mech-full rotate: false - xy: 1507, 1145 + xy: 1646, 1017 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 mech-glaive-ship-full rotate: false - xy: 526, 1537 + xy: 1969, 1631 size: 56, 56 orig: 56, 56 offset: 0, 0 index: -1 mech-javelin-ship-full rotate: false - xy: 1507, 1095 + xy: 1696, 1017 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 mech-omega-mech-full rotate: false - xy: 1242, 709 + xy: 607, 1377 size: 56, 56 orig: 56, 56 offset: 0, 0 index: -1 mech-tau-mech-full rotate: false - xy: 1498, 1603 + xy: 1088, 1043 size: 56, 56 orig: 56, 56 offset: 0, 0 index: -1 mech-trident-ship-full rotate: false - xy: 584, 1537 + xy: 1154, 1109 size: 56, 56 orig: 56, 56 offset: 0, 0 index: -1 mech-vanguard-ship-full rotate: false - xy: 1507, 1045 + xy: 1746, 1017 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 meltdown rotate: false - xy: 423, 1002 + xy: 1449, 1627 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 repair-point rotate: false - xy: 1021, 297 + xy: 1097, 237 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ripple rotate: false - xy: 1146, 1657 + xy: 815, 457 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 salvo rotate: false - xy: 1111, 833 + xy: 1333, 1233 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 scatter rotate: false - xy: 1375, 1097 + xy: 1597, 1233 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 scorch rotate: false - xy: 987, 263 + xy: 1097, 135 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 spectre rotate: false - xy: 293, 482 + xy: 1189, 1497 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 swarmer rotate: false - xy: 1309, 767 + xy: 1449, 1167 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 unit-chaos-array-full rotate: false - xy: 423, 612 + xy: 1319, 1497 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 unit-crawler-full rotate: false - xy: 1557, 1245 + xy: 1037, 827 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 unit-dagger-full rotate: false - xy: 1557, 1195 + xy: 1037, 777 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 unit-eradicator-full rotate: false - xy: 1, 99 + xy: 259, 1123 size: 152, 124 orig: 152, 124 offset: 0, 0 index: -1 unit-eruptor-full rotate: false - xy: 1441, 1229 + xy: 1713, 1167 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 unit-fortress-full rotate: false - xy: 1441, 1163 + xy: 1779, 1167 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 unit-titan-full rotate: false - xy: 1441, 1097 + xy: 1845, 1167 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 wave rotate: false - xy: 1441, 767 + xy: 956, 969 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 item-blast-compound rotate: false - xy: 1378, 675 + xy: 1029, 237 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-coal rotate: false - xy: 725, 552 + xy: 1029, 169 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-copper rotate: false - xy: 793, 552 + xy: 1029, 101 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-graphite rotate: false - xy: 717, 484 + xy: 1029, 33 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-lead rotate: false - xy: 785, 518 + xy: 1063, 475 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-metaglass rotate: false - xy: 785, 484 + xy: 1063, 407 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-phase-fabric rotate: false - xy: 783, 416 + xy: 1063, 339 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-plastanium rotate: false - xy: 783, 348 + xy: 1063, 271 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-pyratite rotate: false - xy: 819, 518 + xy: 1063, 203 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-sand rotate: false - xy: 817, 450 + xy: 1063, 135 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-scrap rotate: false - xy: 817, 382 + xy: 1063, 67 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-silicon rotate: false - xy: 817, 314 + xy: 1477, 847 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-spore-pod rotate: false - xy: 887, 512 + xy: 1545, 847 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-surge-alloy rotate: false - xy: 887, 478 + xy: 1613, 847 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-thorium rotate: false - xy: 851, 444 + xy: 1681, 847 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-titanium rotate: false - xy: 851, 410 + xy: 1749, 847 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 liquid-cryofluid rotate: false - xy: 851, 376 + xy: 1817, 847 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 liquid-oil rotate: false - xy: 851, 342 + xy: 1885, 847 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 liquid-slag rotate: false - xy: 919, 421 + xy: 1401, 703 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 liquid-water rotate: false - xy: 919, 353 + xy: 1401, 635 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 alpha-mech rotate: false - xy: 967, 685 + xy: 521, 1 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 alpha-mech-base rotate: false - xy: 1610, 1553 + xy: 979, 488 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 alpha-mech-leg rotate: false - xy: 1660, 1553 + xy: 1440, 1117 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 delta-mech rotate: false - xy: 1810, 1557 + xy: 357, 33 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 delta-mech-base rotate: false - xy: 1860, 1557 + xy: 979, 30 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 delta-mech-leg rotate: false - xy: 1910, 1557 + xy: 717, 15 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 omega-mech rotate: false - xy: 1300, 709 + xy: 1022, 977 size: 56, 56 orig: 56, 56 offset: 0, 0 index: -1 omega-mech-armor rotate: false - xy: 1309, 1229 + xy: 1399, 1299 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 omega-mech-base rotate: false - xy: 1556, 1603 + xy: 979, 708 size: 56, 56 orig: 56, 56 offset: 0, 0 index: -1 omega-mech-leg rotate: false - xy: 1358, 709 + xy: 1212, 1109 size: 56, 56 orig: 56, 56 offset: 0, 0 index: -1 tau-mech rotate: false - xy: 1672, 1603 + xy: 979, 592 size: 56, 56 orig: 56, 56 offset: 0, 0 index: -1 tau-mech-base rotate: false - xy: 1557, 1345 + xy: 1022, 927 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 tau-mech-leg rotate: false - xy: 1557, 1295 + xy: 1037, 877 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 dart-ship rotate: false - xy: 1760, 1557 + xy: 307, 33 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 glaive-ship rotate: false - xy: 1440, 1559 + xy: 99, 44 size: 56, 56 orig: 56, 56 offset: 0, 0 index: -1 javelin-ship rotate: false - xy: 1897, 1399 + xy: 1196, 1009 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 javelin-ship-shield rotate: false - xy: 1947, 1457 + xy: 1246, 1009 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 trident-ship rotate: false - xy: 1498, 1545 + xy: 1328, 1109 size: 56, 56 orig: 56, 56 offset: 0, 0 index: -1 vanguard-ship rotate: false - xy: 1557, 1095 + xy: 1037, 677 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 blank rotate: false - xy: 913, 678 + xy: 1, 1 size: 1, 1 orig: 1, 1 offset: 0, 0 index: -1 circle rotate: false - xy: 323, 1522 + xy: 1, 944 size: 201, 201 orig: 201, 201 offset: 0, 0 index: -1 shape-3 rotate: false - xy: 1177, 702 + xy: 956, 904 size: 63, 63 orig: 63, 63 offset: 0, 0 index: -1 chaos-array rotate: false - xy: 1368, 1755 + xy: 163, 343 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 chaos-array-base rotate: false - xy: 1498, 1791 + xy: 293, 473 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 chaos-array-leg rotate: false - xy: 1628, 1791 + xy: 163, 213 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 crawler rotate: false - xy: 1497, 1445 + xy: 1840, 1117 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 crawler-base rotate: false - xy: 1497, 1395 + xy: 1890, 1117 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 crawler-leg rotate: false - xy: 1569, 1499 + xy: 1940, 1117 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 dagger rotate: false - xy: 1619, 1503 + xy: 157, 33 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 dagger-base rotate: false - xy: 1669, 1503 + xy: 207, 33 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 dagger-leg rotate: false - xy: 1710, 1553 + xy: 257, 33 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 draug rotate: false - xy: 1960, 1557 + xy: 767, 15 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 eradicator rotate: false - xy: 1496, 1921 + xy: 323, 1375 size: 152, 124 orig: 152, 124 offset: 0, 0 index: -1 eradicator-base rotate: false - xy: 1, 225 + xy: 645, 1681 size: 152, 124 orig: 152, 124 offset: 0, 0 index: -1 eradicator-leg rotate: false - xy: 1650, 1921 + xy: 259, 1249 size: 152, 124 orig: 152, 124 offset: 0, 0 index: -1 eruptor rotate: false - xy: 1045, 1097 + xy: 913, 259 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 eruptor-base rotate: false - xy: 1111, 1163 + xy: 913, 193 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 eruptor-leg rotate: false - xy: 1177, 1229 + xy: 913, 127 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 fortress rotate: false - xy: 1243, 1295 + xy: 913, 61 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 fortress-base rotate: false - xy: 1045, 1031 + xy: 871, 1315 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 titan-base rotate: false - xy: 1045, 1031 + xy: 871, 1315 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 fortress-leg rotate: false - xy: 1111, 1097 + xy: 871, 1249 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 ghoul rotate: false - xy: 219, 1188 + xy: 843, 1603 size: 72, 72 orig: 72, 72 offset: 0, 0 index: -1 lich rotate: false - xy: 1, 1161 + xy: 645, 1807 size: 216, 240 orig: 216, 240 offset: 0, 0 index: -1 phantom rotate: false - xy: 1614, 1603 + xy: 979, 650 size: 56, 56 orig: 56, 56 offset: 0, 0 index: -1 power-cell rotate: false - xy: 1416, 709 + xy: 1270, 1109 size: 56, 56 orig: 56, 56 offset: 0, 0 index: -1 reaper rotate: false - xy: 323, 1725 + xy: 323, 1727 size: 320, 320 orig: 320, 320 offset: 0, 0 index: -1 revenant rotate: false - xy: 645, 1730 + xy: 413, 1127 size: 112, 112 orig: 112, 112 offset: 0, 0 index: -1 spirit rotate: false - xy: 1507, 845 + xy: 1946, 1017 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 titan rotate: false - xy: 1375, 833 + xy: 1515, 1167 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 titan-leg rotate: false - xy: 1375, 767 + xy: 1581, 1167 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 wraith rotate: false - xy: 1557, 1045 + xy: 1037, 627 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 artillery-equip rotate: false - xy: 923, 623 + xy: 979, 430 size: 48, 56 orig: 48, 56 offset: 0, 0 index: -1 blaster-equip rotate: false - xy: 923, 573 + xy: 1490, 1117 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 bomber-equip rotate: false - xy: 1469, 1495 + xy: 1790, 1117 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 missiles-equip rotate: false - xy: 1469, 1495 + xy: 1790, 1117 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 chain-blaster-equip rotate: false - xy: 1519, 1495 + xy: 979, 80 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 chaos-equip rotate: false - xy: 1440, 1617 + xy: 979, 766 size: 56, 136 orig: 56, 136 offset: 0, 0 index: -1 eradication-equip rotate: false - xy: 651, 850 + xy: 521, 51 size: 96, 192 orig: 96, 192 offset: 0, 0 index: -1 eruption-equip rotate: false - xy: 1769, 1499 + xy: 1977, 1175 size: 48, 56 orig: 48, 56 offset: 0, 0 index: -1 flakgun-equip rotate: false - xy: 1819, 1507 + xy: 1990, 1125 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 flamethrower-equip rotate: false - xy: 1869, 1499 + xy: 1146, 1043 size: 48, 56 orig: 48, 56 offset: 0, 0 index: -1 heal-blaster-equip rotate: false - xy: 1919, 1507 + xy: 1196, 1059 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 lich-missiles-equip rotate: false - xy: 1947, 1407 + xy: 1296, 1009 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 reaper-gun-equip rotate: false - xy: 1507, 995 + xy: 1796, 1017 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 revenant-missiles-equip rotate: false - xy: 1507, 945 + xy: 1846, 1017 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 shockgun-equip rotate: false - xy: 1507, 895 + xy: 1896, 1017 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 swarmer-equip rotate: false - xy: 1507, 795 + xy: 1996, 1025 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 vanguard-blaster-equip rotate: false - xy: 1557, 1145 + xy: 1037, 727 size: 48, 48 orig: 48, 48 offset: 0, 0 @@ -7144,1995 +7242,2009 @@ filter: Nearest,Nearest repeat: none alloy-smelter-icon-editor rotate: false - xy: 1, 23 + xy: 1, 11 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 alpha-mech-pad-icon-editor rotate: false - xy: 745, 861 + xy: 745, 849 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 arc-icon-editor rotate: false - xy: 261, 145 + xy: 261, 133 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 armored-conveyor-icon-editor rotate: false - xy: 569, 399 + xy: 493, 83 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 battery-icon-editor rotate: false - xy: 603, 399 + xy: 611, 387 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 battery-large-icon-editor rotate: false - xy: 745, 927 + xy: 745, 915 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 blast-drill-icon-editor rotate: false - xy: 1, 251 + xy: 1, 239 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 blast-mixer-icon-editor rotate: false - xy: 811, 861 + xy: 811, 849 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 block-border-editor rotate: false - xy: 637, 399 + xy: 493, 49 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 bridge-conduit-icon-editor rotate: false - xy: 671, 399 + xy: 645, 387 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 bridge-conveyor-icon-editor rotate: false - xy: 295, 13 + xy: 679, 387 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 char-icon-editor rotate: false - xy: 329, 13 + xy: 295, 1 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-char1 rotate: false - xy: 329, 13 + xy: 295, 1 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 clear-editor rotate: false - xy: 261, 378 + xy: 261, 366 size: 1, 1 orig: 1, 1 offset: 0, 0 index: -1 cliffs-icon-editor rotate: false - xy: 363, 13 + xy: 329, 1 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 coal-centrifuge-icon-editor rotate: false - xy: 877, 861 + xy: 877, 849 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 combustion-generator-icon-editor rotate: false - xy: 397, 13 + xy: 363, 1 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 command-center-icon-editor rotate: false - xy: 943, 861 + xy: 943, 849 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 conduit-icon-editor rotate: false - xy: 493, 103 + xy: 397, 1 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 container-icon-editor rotate: false - xy: 1009, 861 + xy: 1009, 849 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 conveyor-icon-editor rotate: false - xy: 535, 145 + xy: 431, 1 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 copper-wall-icon-editor rotate: false - xy: 431, 29 + xy: 465, 1 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 copper-wall-large-icon-editor rotate: false - xy: 1075, 861 + xy: 1075, 849 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 core-foundation-icon-editor rotate: false - xy: 323, 733 + xy: 323, 721 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 core-nucleus-icon-editor rotate: false - xy: 323, 863 + xy: 323, 851 size: 160, 160 orig: 160, 160 offset: 0, 0 index: -1 core-shard-icon-editor rotate: false - xy: 99, 23 + xy: 99, 11 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 craters-icon-editor rotate: false - xy: 477, 69 + xy: 527, 83 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-craters1 rotate: false - xy: 477, 69 + xy: 527, 83 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 crawler-factory-icon-editor rotate: false - xy: 1141, 861 + xy: 1141, 849 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 cryofluidmixer-icon-editor rotate: false - xy: 1207, 861 + xy: 1207, 849 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 cultivator-icon-editor rotate: false - xy: 1273, 861 + xy: 1273, 849 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 cyclone-icon-editor rotate: false - xy: 843, 927 + xy: 843, 915 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 dagger-factory-icon-editor rotate: false - xy: 1339, 861 + xy: 1339, 849 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 dark-metal-icon-editor rotate: false - xy: 569, 365 + xy: 527, 49 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 dark-panel-1-icon-editor rotate: false - xy: 603, 365 + xy: 499, 15 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-dark-panel-1 rotate: false - xy: 603, 365 + xy: 499, 15 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 dark-panel-2-icon-editor rotate: false - xy: 637, 365 + xy: 533, 15 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-dark-panel-2 rotate: false - xy: 637, 365 + xy: 533, 15 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 dark-panel-3-icon-editor rotate: false - xy: 671, 365 + xy: 543, 133 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-dark-panel-3 rotate: false - xy: 671, 365 + xy: 543, 133 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 dark-panel-4-icon-editor rotate: false - xy: 555, 331 + xy: 611, 353 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-dark-panel-4 rotate: false - xy: 555, 331 + xy: 611, 353 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 dark-panel-5-icon-editor rotate: false - xy: 589, 331 + xy: 645, 353 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-dark-panel-5 rotate: false - xy: 589, 331 + xy: 645, 353 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 dark-panel-6-icon-editor rotate: false - xy: 555, 297 + xy: 679, 353 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-dark-panel-6 rotate: false - xy: 555, 297 + xy: 679, 353 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 darksand-icon-editor rotate: false - xy: 623, 331 + xy: 577, 345 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-darksand1 rotate: false - xy: 623, 331 + xy: 577, 345 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 darksand-tainted-water-icon-editor rotate: false - xy: 589, 297 + xy: 555, 311 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-darksand-tainted-water rotate: false - xy: 589, 297 + xy: 555, 311 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 darksand-water-icon-editor rotate: false - xy: 555, 263 + xy: 555, 277 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-darksand-water rotate: false - xy: 555, 263 + xy: 555, 277 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 dart-ship-pad-icon-editor rotate: false - xy: 1405, 861 + xy: 1405, 849 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 deepwater-icon-editor rotate: false - xy: 657, 331 + xy: 555, 243 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-deepwater rotate: false - xy: 657, 331 + xy: 555, 243 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 delta-mech-pad-icon-editor rotate: false - xy: 1471, 861 + xy: 1471, 849 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 differential-generator-icon-editor rotate: false - xy: 941, 927 + xy: 941, 915 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 distributor-icon-editor rotate: false - xy: 1537, 861 + xy: 1537, 849 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 door-icon-editor rotate: false - xy: 623, 297 + xy: 555, 209 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 door-large-icon-editor rotate: false - xy: 1603, 861 + xy: 1603, 849 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 draug-factory-icon-editor rotate: false - xy: 1669, 861 + xy: 1669, 849 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 dunerocks-icon-editor rotate: false - xy: 589, 263 + xy: 555, 175 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 duo-icon-editor rotate: false - xy: 555, 229 + xy: 589, 311 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-char2 rotate: false - xy: 657, 297 + xy: 589, 277 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-char3 rotate: false - xy: 623, 263 + xy: 589, 243 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-clear rotate: false - xy: 733, 883 + xy: 733, 871 size: 10, 10 orig: 10, 10 offset: 0, 0 index: -1 editor-craters2 rotate: false - xy: 589, 229 + xy: 589, 209 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-craters3 rotate: false - xy: 555, 195 + xy: 589, 175 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-darksand2 rotate: false - xy: 657, 263 + xy: 577, 141 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-darksand3 rotate: false - xy: 623, 229 + xy: 623, 319 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-grass1 rotate: false - xy: 589, 195 + xy: 623, 285 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 grass-icon-editor rotate: false - xy: 589, 195 + xy: 623, 285 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-grass2 rotate: false - xy: 657, 229 + xy: 657, 319 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-grass3 rotate: false - xy: 623, 195 + xy: 623, 251 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-holostone1 rotate: false - xy: 657, 195 + xy: 657, 285 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 holostone-icon-editor rotate: false - xy: 657, 195 + xy: 657, 285 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-holostone2 rotate: false - xy: 569, 161 + xy: 623, 217 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-holostone3 rotate: false - xy: 603, 161 + xy: 657, 251 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-hotrock1 rotate: false - xy: 637, 161 + xy: 623, 183 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 hotrock-icon-editor rotate: false - xy: 637, 161 + xy: 623, 183 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-hotrock2 rotate: false - xy: 671, 161 + xy: 657, 217 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-hotrock3 rotate: false - xy: 511, 69 + xy: 657, 183 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-ice-snow1 rotate: false - xy: 637, 127 + xy: 691, 217 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ice-snow-icon-editor rotate: false - xy: 637, 127 + xy: 691, 217 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-ice-snow2 rotate: false - xy: 671, 127 + xy: 691, 183 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-ice-snow3 rotate: false - xy: 545, 69 + xy: 611, 141 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-ice1 rotate: false - xy: 527, 103 + xy: 691, 319 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ice-icon-editor rotate: false - xy: 527, 103 + xy: 691, 319 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-ice2 rotate: false - xy: 569, 127 + xy: 691, 285 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-ice3 rotate: false - xy: 603, 127 + xy: 691, 251 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-ignarock1 rotate: false - xy: 691, 331 + xy: 645, 149 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ignarock-icon-editor rotate: false - xy: 691, 331 + xy: 645, 149 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-ignarock2 rotate: false - xy: 691, 297 + xy: 679, 149 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-ignarock3 rotate: false - xy: 691, 263 + xy: 713, 149 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-magmarock1 rotate: false - xy: 691, 229 + xy: 577, 107 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 magmarock-icon-editor rotate: false - xy: 691, 229 + xy: 577, 107 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-magmarock2 rotate: false - xy: 691, 195 + xy: 611, 107 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-magmarock3 rotate: false - xy: 705, 161 + xy: 645, 115 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-metal-floor rotate: false - xy: 705, 127 + xy: 679, 115 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 metal-floor-icon-editor rotate: false - xy: 705, 127 + xy: 679, 115 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-metal-floor-2 rotate: false - xy: 465, 29 + xy: 713, 115 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 metal-floor-2-icon-editor rotate: false - xy: 465, 29 + xy: 713, 115 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-metal-floor-3 rotate: false - xy: 499, 35 + xy: 561, 73 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 metal-floor-3-icon-editor rotate: false - xy: 499, 35 + xy: 561, 73 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-metal-floor-5 rotate: false - xy: 499, 1 + xy: 595, 73 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 metal-floor-5-icon-editor rotate: false - xy: 499, 1 + xy: 595, 73 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-metal-floor-damaged1 rotate: false - xy: 533, 35 + xy: 629, 73 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 metal-floor-damaged-icon-editor rotate: false - xy: 533, 35 + xy: 629, 73 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-metal-floor-damaged2 rotate: false - xy: 533, 1 + xy: 663, 81 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-metal-floor-damaged3 rotate: false - xy: 705, 399 + xy: 697, 81 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-moss1 rotate: false - xy: 705, 365 + xy: 731, 81 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 moss-icon-editor rotate: false - xy: 705, 365 + xy: 731, 81 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-moss2 rotate: false - xy: 725, 331 + xy: 567, 39 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-moss3 rotate: false - xy: 725, 297 + xy: 601, 39 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-ore-coal1 rotate: false - xy: 725, 263 + xy: 635, 39 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-ore-coal2 rotate: false - xy: 725, 229 + xy: 669, 47 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-ore-coal3 rotate: false - xy: 725, 195 + xy: 703, 47 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-ore-copper1 rotate: false - xy: 739, 161 + xy: 737, 47 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-ore-copper2 rotate: false - xy: 739, 127 + xy: 567, 5 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-ore-copper3 rotate: false - xy: 567, 35 + xy: 601, 5 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-ore-lead1 rotate: false - xy: 567, 1 + xy: 635, 5 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-ore-lead2 rotate: false - xy: 579, 93 + xy: 669, 13 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-ore-lead3 rotate: false - xy: 613, 93 + xy: 703, 13 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-ore-scrap1 rotate: false - xy: 647, 93 + xy: 737, 13 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-ore-scrap2 rotate: false - xy: 681, 93 + xy: 713, 387 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-ore-scrap3 rotate: false - xy: 715, 93 + xy: 713, 353 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-ore-thorium1 rotate: false - xy: 749, 93 + xy: 725, 319 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-ore-thorium2 rotate: false - xy: 601, 59 + xy: 725, 285 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-ore-thorium3 rotate: false - xy: 601, 25 + xy: 725, 251 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-ore-titanium1 rotate: false - xy: 635, 59 + xy: 725, 217 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-ore-titanium2 rotate: false - xy: 635, 25 + xy: 725, 183 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-ore-titanium3 rotate: false - xy: 669, 59 + xy: 747, 149 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-pebbles1 rotate: false - xy: 669, 25 + xy: 747, 115 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-pebbles2 rotate: false - xy: 703, 59 + xy: 765, 81 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-pebbles3 rotate: false - xy: 703, 25 + xy: 771, 47 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-salt rotate: false - xy: 737, 59 + xy: 771, 13 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 salt-icon-editor rotate: false - xy: 737, 59 + xy: 771, 13 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-sand-water rotate: false - xy: 733, 827 + xy: 835, 815 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 sand-water-icon-editor rotate: false - xy: 733, 827 + xy: 835, 815 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-sand1 rotate: false - xy: 737, 25 + xy: 733, 815 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 sand-icon-editor rotate: false - xy: 737, 25 + xy: 733, 815 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-sand2 rotate: false - xy: 771, 59 + xy: 767, 815 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-sand3 rotate: false - xy: 771, 25 + xy: 801, 815 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-shale1 rotate: false - xy: 767, 827 + xy: 869, 815 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 shale-icon-editor rotate: false - xy: 767, 827 + xy: 869, 815 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-shale2 rotate: false - xy: 801, 827 + xy: 903, 815 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-shale3 rotate: false - xy: 835, 827 + xy: 937, 815 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-snow1 rotate: false - xy: 869, 827 + xy: 971, 815 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-snow2 rotate: false - xy: 903, 827 + xy: 1005, 815 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-snow3 rotate: false - xy: 937, 827 + xy: 1039, 815 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-spawn rotate: false - xy: 971, 827 + xy: 1073, 815 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-spore-moss1 rotate: false - xy: 1005, 827 + xy: 1107, 815 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 spore-moss-icon-editor rotate: false - xy: 1005, 827 + xy: 1107, 815 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-spore-moss2 rotate: false - xy: 1039, 827 + xy: 1141, 815 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-spore-moss3 rotate: false - xy: 1073, 827 + xy: 1175, 815 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-stone1 rotate: false - xy: 1107, 827 + xy: 1209, 815 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 stone-icon-editor rotate: false - xy: 1107, 827 + xy: 1209, 815 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-stone2 rotate: false - xy: 1141, 827 + xy: 1243, 815 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-stone3 rotate: false - xy: 1175, 827 + xy: 1277, 815 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-tainted-water rotate: false - xy: 1209, 827 + xy: 1311, 815 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 tainted-water-icon-editor rotate: false - xy: 1209, 827 + xy: 1311, 815 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-tar rotate: false - xy: 1243, 827 + xy: 1345, 815 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 tar-icon-editor rotate: false - xy: 1243, 827 + xy: 1345, 815 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-tendrils1 rotate: false - xy: 1277, 827 + xy: 1379, 815 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-tendrils2 rotate: false - xy: 1311, 827 + xy: 1413, 815 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-tendrils3 rotate: false - xy: 1345, 827 + xy: 1447, 815 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-water rotate: false - xy: 1379, 827 + xy: 1481, 815 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 water-icon-editor rotate: false - xy: 1379, 827 + xy: 1481, 815 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 force-projector-icon-editor rotate: false - xy: 1039, 927 + xy: 1039, 915 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 fortress-factory-icon-editor rotate: false - xy: 1137, 927 + xy: 1137, 915 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 fuse-icon-editor rotate: false - xy: 1235, 927 + xy: 1235, 915 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 ghoul-factory-icon-editor rotate: false - xy: 1333, 927 + xy: 1333, 915 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 glaive-ship-pad-icon-editor rotate: false - xy: 1431, 927 + xy: 1431, 915 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 graphite-press-icon-editor rotate: false - xy: 1735, 861 + xy: 1735, 849 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 hail-icon-editor rotate: false - xy: 1413, 827 + xy: 1515, 815 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 icerocks-icon-editor rotate: false - xy: 1447, 827 + xy: 1549, 815 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 impact-reactor-icon-editor rotate: false - xy: 485, 895 + xy: 485, 883 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 incinerator-icon-editor rotate: false - xy: 1481, 827 + xy: 1583, 815 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 inverted-sorter-icon-editor rotate: false - xy: 1515, 827 + xy: 1617, 815 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-source-icon-editor rotate: false - xy: 1549, 827 + xy: 1651, 815 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-void-icon-editor rotate: false - xy: 1583, 827 + xy: 1685, 815 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 javelin-ship-pad-icon-editor rotate: false - xy: 1801, 861 + xy: 1801, 849 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 junction-icon-editor rotate: false - xy: 1617, 827 + xy: 1719, 815 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 kiln-icon-editor rotate: false - xy: 1867, 861 + xy: 1867, 849 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 lancer-icon-editor rotate: false - xy: 1933, 861 + xy: 1933, 849 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 laser-drill-icon-editor rotate: false - xy: 1529, 927 + xy: 1529, 915 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 launch-pad-icon-editor rotate: false - xy: 1627, 927 + xy: 1627, 915 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 launch-pad-large-icon-editor rotate: false - xy: 1, 121 + xy: 1, 109 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 liquid-junction-icon-editor rotate: false - xy: 1651, 827 + xy: 1753, 815 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 liquid-router-icon-editor rotate: false - xy: 1685, 827 + xy: 1787, 815 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 liquid-source-icon-editor rotate: false - xy: 1719, 827 + xy: 1821, 815 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 liquid-tank-icon-editor rotate: false - xy: 1725, 927 + xy: 1725, 915 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 mass-driver-icon-editor rotate: false - xy: 1823, 927 + xy: 1823, 915 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 mechanical-drill-icon-editor rotate: false - xy: 485, 829 + xy: 485, 817 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 mechanical-pump-icon-editor rotate: false - xy: 1753, 827 + xy: 1855, 815 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 meltdown-icon-editor rotate: false - xy: 131, 251 + xy: 131, 239 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 melter-icon-editor rotate: false - xy: 1787, 827 + xy: 1889, 815 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 mend-projector-icon-editor rotate: false - xy: 551, 829 + xy: 551, 817 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 mender-icon-editor rotate: false - xy: 1821, 827 + xy: 1923, 815 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 message-icon-editor rotate: false - xy: 1855, 827 + xy: 1957, 815 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 multi-press-icon-editor rotate: false - xy: 1921, 927 + xy: 1921, 915 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 oil-extractor-icon-editor rotate: false - xy: 323, 375 + xy: 323, 363 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 omega-mech-pad-icon-editor rotate: false - xy: 197, 23 + xy: 197, 11 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 overdrive-projector-icon-editor rotate: false - xy: 617, 829 + xy: 617, 817 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 overflow-gate-icon-editor rotate: false - xy: 1889, 827 + xy: 717, 781 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 pebbles-icon-editor rotate: false - xy: 1923, 827 + xy: 717, 747 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 phantom-factory-icon-editor rotate: false - xy: 453, 763 + xy: 453, 751 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 phase-conduit-icon-editor rotate: false - xy: 1957, 827 + xy: 751, 781 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 phase-conveyor-icon-editor rotate: false - xy: 717, 793 + xy: 717, 713 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 phase-wall-icon-editor rotate: false - xy: 717, 759 + xy: 785, 781 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 phase-wall-large-icon-editor rotate: false - xy: 519, 763 + xy: 519, 751 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 phase-weaver-icon-editor rotate: false - xy: 453, 697 + xy: 453, 685 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 pine-icon-editor rotate: false - xy: 1999, 877 + xy: 1999, 865 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 plastanium-compressor-icon-editor rotate: false - xy: 519, 697 + xy: 519, 685 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +plastanium-wall-icon-editor + rotate: false + xy: 751, 747 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +plastanium-wall-large-icon-editor + rotate: false + xy: 585, 751 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 pneumatic-drill-icon-editor rotate: false - xy: 585, 763 + xy: 453, 619 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 power-node-icon-editor rotate: false - xy: 751, 793 + xy: 717, 679 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 power-node-large-icon-editor rotate: false - xy: 453, 631 + xy: 519, 619 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 power-source-icon-editor rotate: false - xy: 717, 725 + xy: 819, 781 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 power-void-icon-editor rotate: false - xy: 785, 793 + xy: 785, 747 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 pulse-conduit-icon-editor rotate: false - xy: 751, 759 + xy: 751, 713 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 pulverizer-icon-editor rotate: false - xy: 717, 691 + xy: 717, 645 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 pyratite-mixer-icon-editor rotate: false - xy: 519, 631 + xy: 585, 685 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 repair-point-icon-editor rotate: false - xy: 819, 793 + xy: 853, 781 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 revenant-factory-icon-editor rotate: false - xy: 323, 603 + xy: 323, 591 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 ripple-icon-editor rotate: false - xy: 261, 277 + xy: 261, 265 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 rock-icon-editor rotate: false - xy: 1999, 827 + xy: 1999, 815 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 rocks-icon-editor rotate: false - xy: 785, 759 + xy: 819, 747 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 rotary-pump-icon-editor rotate: false - xy: 585, 697 + xy: 453, 553 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 router-icon-editor rotate: false - xy: 751, 725 + xy: 785, 713 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 rtg-generator-icon-editor rotate: false - xy: 453, 565 + xy: 519, 553 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 saltrocks-icon-editor rotate: false - xy: 717, 657 + xy: 751, 679 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 salvo-icon-editor rotate: false - xy: 519, 565 + xy: 585, 619 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 sand-boulder-icon-editor rotate: false - xy: 853, 793 + xy: 717, 611 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 sandrocks-icon-editor rotate: false - xy: 819, 759 + xy: 887, 781 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 scatter-icon-editor rotate: false - xy: 585, 631 + xy: 453, 487 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 scorch-icon-editor rotate: false - xy: 785, 725 + xy: 853, 747 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 scrap-wall-gigantic-icon-editor rotate: false - xy: 615, 895 + xy: 615, 883 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 scrap-wall-huge-icon-editor rotate: false - xy: 261, 179 + xy: 261, 167 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 scrap-wall-icon-editor rotate: false - xy: 751, 691 + xy: 819, 713 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 scrap-wall-large-icon-editor rotate: false - xy: 453, 499 + xy: 519, 487 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 separator-icon-editor rotate: false - xy: 519, 499 + xy: 585, 553 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 shale-boulder-icon-editor rotate: false - xy: 717, 623 + xy: 785, 679 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 shalerocks-icon-editor rotate: false - xy: 887, 793 + xy: 751, 645 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 shock-mine-icon-editor rotate: false - xy: 853, 759 + xy: 717, 577 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 shrubs-icon-editor rotate: false - xy: 819, 725 + xy: 921, 781 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 silicon-smelter-icon-editor rotate: false - xy: 585, 565 + xy: 585, 487 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 snow-icon-editor rotate: false - xy: 785, 691 + xy: 887, 747 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 snow-pine-icon-editor rotate: false - xy: 519, 383 + xy: 519, 371 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 snowrock-icon-editor rotate: false - xy: 683, 845 + xy: 683, 833 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 snowrocks-icon-editor rotate: false - xy: 751, 657 + xy: 853, 713 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 solar-panel-icon-editor rotate: false - xy: 717, 589 + xy: 819, 679 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 solar-panel-large-icon-editor rotate: false - xy: 359, 277 + xy: 359, 265 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 sorter-icon-editor rotate: false - xy: 921, 793 + xy: 785, 645 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 spawn-icon-editor rotate: false - xy: 887, 759 + xy: 751, 611 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 spectre-icon-editor rotate: false - xy: 131, 121 + xy: 131, 109 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 spirit-factory-icon-editor rotate: false - xy: 585, 499 + xy: 519, 421 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 spore-cluster-icon-editor rotate: false - xy: 493, 137 + xy: 569, 379 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 spore-pine-icon-editor rotate: false - xy: 427, 63 + xy: 493, 117 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 spore-press-icon-editor rotate: false - xy: 519, 433 + xy: 585, 421 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 sporerocks-icon-editor rotate: false - xy: 853, 725 + xy: 717, 543 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 surge-tower-icon-editor rotate: false - xy: 585, 433 + xy: 651, 751 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 surge-wall-icon-editor rotate: false - xy: 819, 691 + xy: 955, 781 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 surge-wall-large-icon-editor rotate: false - xy: 651, 763 + xy: 651, 685 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 swarmer-icon-editor rotate: false - xy: 651, 697 + xy: 651, 619 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 tau-mech-pad-icon-editor rotate: false - xy: 651, 631 + xy: 651, 553 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 tendrils-icon-editor rotate: false - xy: 785, 657 + xy: 921, 747 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 thermal-generator-icon-editor rotate: false - xy: 651, 565 + xy: 651, 487 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 thermal-pump-icon-editor rotate: false - xy: 359, 179 + xy: 359, 167 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 thorium-reactor-icon-editor rotate: false - xy: 421, 375 + xy: 421, 363 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 thorium-wall-icon-editor rotate: false - xy: 751, 623 + xy: 887, 713 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 thorium-wall-large-icon-editor rotate: false - xy: 651, 499 + xy: 651, 421 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 thruster-icon-editor rotate: false - xy: 323, 473 + xy: 323, 461 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 titan-factory-icon-editor rotate: false - xy: 457, 277 + xy: 457, 265 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 titanium-conveyor-icon-editor rotate: false - xy: 717, 555 + xy: 853, 679 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-wall-icon-editor rotate: false - xy: 955, 793 + xy: 819, 645 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-wall-large-icon-editor rotate: false - xy: 651, 433 + xy: 295, 101 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 trident-ship-pad-icon-editor rotate: false - xy: 295, 113 + xy: 295, 35 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 turbine-generator-icon-editor rotate: false - xy: 295, 47 + xy: 361, 101 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 unloader-icon-editor rotate: false - xy: 921, 759 + xy: 785, 611 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 vault-icon-editor rotate: false - xy: 457, 179 + xy: 457, 167 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 water-extractor-icon-editor rotate: false - xy: 361, 113 + xy: 361, 35 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 wave-icon-editor rotate: false - xy: 361, 47 + xy: 427, 101 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 white-tree-dead-icon-editor rotate: false - xy: 1, 703 + xy: 1, 691 size: 320, 320 orig: 320, 320 offset: 0, 0 index: -1 white-tree-icon-editor rotate: false - xy: 1, 381 + xy: 1, 369 size: 320, 320 orig: 320, 320 offset: 0, 0 index: -1 wraith-factory-icon-editor rotate: false - xy: 427, 113 + xy: 427, 35 size: 64, 64 orig: 64, 64 offset: 0, 0 @@ -9235,7 +9347,7 @@ filter: Nearest,Nearest repeat: none bar rotate: false - xy: 1647, 286 + xy: 589, 68 size: 27, 36 split: 9, 9, 9, 9 orig: 27, 36 @@ -9243,7 +9355,7 @@ bar index: -1 bar-top rotate: false - xy: 1618, 286 + xy: 589, 106 size: 27, 36 split: 9, 10, 9, 10 orig: 27, 36 @@ -9251,7 +9363,7 @@ bar-top index: -1 block-alloy-smelter-large rotate: false - xy: 301, 632 + xy: 401, 682 size: 40, 40 orig: 40, 40 offset: 0, 0 @@ -9265,14 +9377,14 @@ block-alloy-smelter-medium index: -1 block-alloy-smelter-small rotate: false - xy: 2023, 596 + xy: 2009, 778 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-alloy-smelter-tiny rotate: false - xy: 1, 1 + xy: 749, 203 size: 16, 16 orig: 16, 16 offset: 0, 0 @@ -9286,28 +9398,28 @@ block-alloy-smelter-xlarge index: -1 block-alpha-mech-pad-large rotate: false - xy: 351, 682 + xy: 301, 532 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-alpha-mech-pad-medium rotate: false - xy: 2009, 906 + xy: 385, 151 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-alpha-mech-pad-small rotate: false - xy: 2023, 570 + xy: 783, 504 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-alpha-mech-pad-tiny rotate: false - xy: 385, 5 + xy: 2031, 588 size: 16, 16 orig: 16, 16 offset: 0, 0 @@ -9321,28 +9433,28 @@ block-alpha-mech-pad-xlarge index: -1 block-arc-large rotate: false - xy: 301, 590 + xy: 351, 582 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-arc-medium rotate: false - xy: 2009, 872 + xy: 2009, 906 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-arc-small rotate: false - xy: 2009, 778 + xy: 301, 2 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-arc-tiny rotate: false - xy: 1001, 363 + xy: 1, 1 size: 16, 16 orig: 16, 16 offset: 0, 0 @@ -9356,28 +9468,28 @@ block-arc-xlarge index: -1 block-armored-conveyor-large rotate: false - xy: 393, 682 + xy: 401, 640 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-armored-conveyor-medium rotate: false - xy: 2009, 838 + xy: 385, 117 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-armored-conveyor-small rotate: false - xy: 1275, 588 + xy: 327, 2 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-armored-conveyor-tiny rotate: false - xy: 1027, 295 + xy: 1189, 220 size: 16, 16 orig: 16, 16 offset: 0, 0 @@ -9391,35 +9503,35 @@ block-armored-conveyor-xlarge index: -1 block-battery-large rotate: false - xy: 301, 548 + xy: 443, 682 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-battery-large-large rotate: false - xy: 435, 682 + xy: 301, 490 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-battery-large-medium rotate: false - xy: 2009, 804 + xy: 2009, 872 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-battery-large-small rotate: false - xy: 1493, 234 + xy: 353, 2 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-battery-large-tiny rotate: false - xy: 1305, 562 + xy: 854, 157 size: 16, 16 orig: 16, 16 offset: 0, 0 @@ -9433,21 +9545,21 @@ block-battery-large-xlarge index: -1 block-battery-medium rotate: false - xy: 1276, 648 + xy: 385, 83 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-battery-small rotate: false - xy: 1676, 298 + xy: 767, 199 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-battery-tiny rotate: false - xy: 1857, 174 + xy: 880, 194 size: 16, 16 orig: 16, 16 offset: 0, 0 @@ -9461,28 +9573,28 @@ block-battery-xlarge index: -1 block-blast-drill-large rotate: false - xy: 301, 506 + xy: 443, 640 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-blast-drill-medium rotate: false - xy: 1310, 648 + xy: 2009, 838 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-blast-drill-small rotate: false - xy: 1775, 491 + xy: 793, 199 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-blast-drill-tiny rotate: false - xy: 1883, 200 + xy: 19, 1 size: 16, 16 orig: 16, 16 offset: 0, 0 @@ -9496,28 +9608,28 @@ block-blast-drill-xlarge index: -1 block-blast-mixer-large rotate: false - xy: 477, 682 + xy: 485, 682 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-blast-mixer-medium rotate: false - xy: 1344, 648 + xy: 385, 49 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-blast-mixer-small rotate: false - xy: 1702, 298 + xy: 1985, 342 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-blast-mixer-tiny rotate: false - xy: 631, 76 + xy: 1207, 220 size: 16, 16 orig: 16, 16 offset: 0, 0 @@ -9531,28 +9643,28 @@ block-blast-mixer-xlarge index: -1 block-bridge-conduit-large rotate: false - xy: 301, 464 + xy: 301, 448 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-bridge-conduit-medium rotate: false - xy: 1378, 648 + xy: 2009, 804 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-bridge-conduit-small rotate: false - xy: 1728, 298 + xy: 1984, 316 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-bridge-conduit-tiny rotate: false - xy: 657, 113 + xy: 854, 139 size: 16, 16 orig: 16, 16 offset: 0, 0 @@ -9566,28 +9678,28 @@ block-bridge-conduit-xlarge index: -1 block-bridge-conveyor-large rotate: false - xy: 519, 682 + xy: 485, 640 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-bridge-conveyor-medium rotate: false - xy: 1412, 648 + xy: 423, 180 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-bridge-conveyor-small rotate: false - xy: 1525, 258 + xy: 1984, 290 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-bridge-conveyor-tiny rotate: false - xy: 19, 1 + xy: 880, 176 size: 16, 16 orig: 16, 16 offset: 0, 0 @@ -9601,28 +9713,28 @@ block-bridge-conveyor-xlarge index: -1 block-char-large rotate: false - xy: 301, 422 + xy: 527, 682 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-char-medium rotate: false - xy: 1446, 648 + xy: 419, 146 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-char-small rotate: false - xy: 1551, 258 + xy: 2011, 342 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-char-tiny rotate: false - xy: 403, 5 + xy: 898, 194 size: 16, 16 orig: 16, 16 offset: 0, 0 @@ -9636,28 +9748,28 @@ block-char-xlarge index: -1 block-cliffs-large rotate: false - xy: 561, 682 + xy: 301, 406 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-cliffs-medium rotate: false - xy: 1480, 648 + xy: 419, 112 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-cliffs-small rotate: false - xy: 1577, 258 + xy: 2010, 316 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-cliffs-tiny rotate: false - xy: 1901, 200 + xy: 1225, 220 size: 16, 16 orig: 16, 16 offset: 0, 0 @@ -9671,28 +9783,28 @@ block-cliffs-xlarge index: -1 block-coal-centrifuge-large rotate: false - xy: 301, 380 + xy: 527, 640 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-coal-centrifuge-medium rotate: false - xy: 1514, 648 + xy: 419, 78 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-coal-centrifuge-small rotate: false - xy: 1804, 556 + xy: 2010, 290 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-coal-centrifuge-tiny rotate: false - xy: 631, 58 + xy: 898, 176 size: 16, 16 orig: 16, 16 offset: 0, 0 @@ -9706,28 +9818,28 @@ block-coal-centrifuge-xlarge index: -1 block-combustion-generator-large rotate: false - xy: 603, 682 + xy: 569, 682 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-combustion-generator-medium rotate: false - xy: 1548, 648 + xy: 419, 44 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-combustion-generator-small rotate: false - xy: 1804, 530 + xy: 1984, 264 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-combustion-generator-tiny rotate: false - xy: 657, 95 + xy: 916, 194 size: 16, 16 orig: 16, 16 offset: 0, 0 @@ -9741,28 +9853,28 @@ block-combustion-generator-xlarge index: -1 block-command-center-large rotate: false - xy: 301, 338 + xy: 301, 364 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-command-center-medium rotate: false - xy: 1582, 648 + xy: 814, 522 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-command-center-small rotate: false - xy: 1830, 556 + xy: 2010, 264 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-command-center-tiny rotate: false - xy: 1919, 200 + xy: 1243, 220 size: 16, 16 orig: 16, 16 offset: 0, 0 @@ -9776,28 +9888,28 @@ block-command-center-xlarge index: -1 block-conduit-large rotate: false - xy: 645, 682 + xy: 569, 640 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-conduit-medium rotate: false - xy: 1616, 648 + xy: 848, 522 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-conduit-small rotate: false - xy: 1830, 530 + xy: 593, 192 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-conduit-tiny rotate: false - xy: 631, 40 + xy: 916, 176 size: 16, 16 orig: 16, 16 offset: 0, 0 @@ -9811,28 +9923,28 @@ block-conduit-xlarge index: -1 block-container-large rotate: false - xy: 301, 296 + xy: 611, 682 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-container-medium rotate: false - xy: 1650, 648 + xy: 882, 522 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-container-small rotate: false - xy: 1856, 556 + xy: 619, 195 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-container-tiny rotate: false - xy: 1937, 200 + xy: 934, 194 size: 16, 16 orig: 16, 16 offset: 0, 0 @@ -9846,28 +9958,28 @@ block-container-xlarge index: -1 block-conveyor-large rotate: false - xy: 687, 682 + xy: 301, 322 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-conveyor-medium rotate: false - xy: 1684, 648 + xy: 916, 522 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-conveyor-small rotate: false - xy: 1856, 530 + xy: 645, 195 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-conveyor-tiny rotate: false - xy: 631, 22 + xy: 1261, 220 size: 16, 16 orig: 16, 16 offset: 0, 0 @@ -9881,35 +9993,35 @@ block-conveyor-xlarge index: -1 block-copper-wall-large rotate: false - xy: 301, 254 + xy: 611, 640 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-copper-wall-large-large rotate: false - xy: 729, 682 + xy: 653, 682 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-copper-wall-large-medium rotate: false - xy: 1718, 648 + xy: 950, 522 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-copper-wall-large-small rotate: false - xy: 1882, 556 + xy: 671, 195 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-copper-wall-large-tiny rotate: false - xy: 1955, 200 + xy: 934, 176 size: 16, 16 orig: 16, 16 offset: 0, 0 @@ -9923,21 +10035,21 @@ block-copper-wall-large-xlarge index: -1 block-copper-wall-medium rotate: false - xy: 1752, 648 + xy: 984, 522 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-copper-wall-small rotate: false - xy: 1882, 530 + xy: 697, 195 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-copper-wall-tiny rotate: false - xy: 1973, 200 + xy: 952, 194 size: 16, 16 orig: 16, 16 offset: 0, 0 @@ -9951,28 +10063,28 @@ block-copper-wall-xlarge index: -1 block-core-foundation-large rotate: false - xy: 301, 212 + xy: 301, 280 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-core-foundation-medium rotate: false - xy: 1786, 648 + xy: 1018, 522 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-core-foundation-small rotate: false - xy: 1908, 556 + xy: 723, 195 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-core-foundation-tiny rotate: false - xy: 1991, 200 + xy: 1279, 220 size: 16, 16 orig: 16, 16 offset: 0, 0 @@ -9986,28 +10098,28 @@ block-core-foundation-xlarge index: -1 block-core-nucleus-large rotate: false - xy: 771, 682 + xy: 653, 640 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-core-nucleus-medium rotate: false - xy: 1820, 648 + xy: 1052, 522 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-core-nucleus-small rotate: false - xy: 1908, 530 + xy: 620, 169 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-core-nucleus-tiny rotate: false - xy: 975, 397 + xy: 952, 176 size: 16, 16 orig: 16, 16 offset: 0, 0 @@ -10021,28 +10133,28 @@ block-core-nucleus-xlarge index: -1 block-core-shard-large rotate: false - xy: 301, 170 + xy: 695, 682 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-core-shard-medium rotate: false - xy: 1854, 648 + xy: 1086, 522 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-core-shard-small rotate: false - xy: 1934, 556 + xy: 646, 169 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-core-shard-tiny rotate: false - xy: 1779, 148 + xy: 970, 194 size: 16, 16 orig: 16, 16 offset: 0, 0 @@ -10056,28 +10168,28 @@ block-core-shard-xlarge index: -1 block-craters-large rotate: false - xy: 813, 682 + xy: 301, 238 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-craters-medium rotate: false - xy: 1888, 648 + xy: 1120, 522 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-craters-small rotate: false - xy: 1934, 530 + xy: 672, 169 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-craters-tiny rotate: false - xy: 1797, 148 + xy: 1297, 220 size: 16, 16 orig: 16, 16 offset: 0, 0 @@ -10091,28 +10203,28 @@ block-craters-xlarge index: -1 block-crawler-factory-large rotate: false - xy: 301, 128 + xy: 695, 640 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-crawler-factory-medium rotate: false - xy: 1922, 648 + xy: 1154, 522 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-crawler-factory-small rotate: false - xy: 1245, 630 + xy: 698, 169 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-crawler-factory-tiny rotate: false - xy: 1815, 148 + xy: 970, 176 size: 16, 16 orig: 16, 16 offset: 0, 0 @@ -10126,28 +10238,28 @@ block-crawler-factory-xlarge index: -1 block-cryofluidmixer-large rotate: false - xy: 855, 682 + xy: 737, 682 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-cryofluidmixer-medium rotate: false - xy: 1956, 648 + xy: 1188, 522 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-cryofluidmixer-small rotate: false - xy: 1519, 232 + xy: 620, 143 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-cryofluidmixer-tiny rotate: false - xy: 1833, 148 + xy: 988, 194 size: 16, 16 orig: 16, 16 offset: 0, 0 @@ -10161,28 +10273,28 @@ block-cryofluidmixer-xlarge index: -1 block-cultivator-large rotate: false - xy: 301, 86 + xy: 301, 196 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-cultivator-medium rotate: false - xy: 1990, 656 + xy: 1222, 522 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-cultivator-small rotate: false - xy: 1545, 232 + xy: 646, 143 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-cultivator-tiny rotate: false - xy: 757, 239 + xy: 1315, 220 size: 16, 16 orig: 16, 16 offset: 0, 0 @@ -10196,28 +10308,28 @@ block-cultivator-xlarge index: -1 block-cyclone-large rotate: false - xy: 897, 682 + xy: 737, 640 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-cyclone-medium rotate: false - xy: 889, 535 + xy: 1256, 522 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-cyclone-small rotate: false - xy: 1571, 232 + xy: 672, 143 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-cyclone-tiny rotate: false - xy: 757, 221 + xy: 988, 176 size: 16, 16 orig: 16, 16 offset: 0, 0 @@ -10231,28 +10343,28 @@ block-cyclone-xlarge index: -1 block-dagger-factory-large rotate: false - xy: 301, 44 + xy: 779, 682 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-dagger-factory-medium rotate: false - xy: 885, 501 + xy: 1290, 522 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-dagger-factory-small rotate: false - xy: 1461, 202 + xy: 698, 143 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-dagger-factory-tiny rotate: false - xy: 757, 203 + xy: 1006, 194 size: 16, 16 orig: 16, 16 offset: 0, 0 @@ -10266,28 +10378,28 @@ block-dagger-factory-xlarge index: -1 block-dark-metal-large rotate: false - xy: 939, 682 + xy: 301, 154 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-dark-metal-medium rotate: false - xy: 931, 577 + xy: 1324, 522 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-dark-metal-small rotate: false - xy: 1603, 258 + xy: 724, 169 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-dark-metal-tiny rotate: false - xy: 757, 185 + xy: 1333, 220 size: 16, 16 orig: 16, 16 offset: 0, 0 @@ -10301,28 +10413,28 @@ block-dark-metal-xlarge index: -1 block-dark-panel-1-large rotate: false - xy: 981, 682 + xy: 779, 640 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-dark-panel-1-medium rotate: false - xy: 427, 31 + xy: 1358, 522 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-dark-panel-1-small rotate: false - xy: 1597, 232 + xy: 724, 143 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-dark-panel-1-tiny rotate: false - xy: 757, 167 + xy: 1006, 176 size: 16, 16 orig: 16, 16 offset: 0, 0 @@ -10336,28 +10448,28 @@ block-dark-panel-1-xlarge index: -1 block-dark-panel-2-large rotate: false - xy: 1023, 682 + xy: 821, 682 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-dark-panel-2-medium rotate: false - xy: 469, 73 + xy: 1392, 522 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-dark-panel-2-small rotate: false - xy: 1629, 260 + xy: 618, 117 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-dark-panel-2-tiny rotate: false - xy: 757, 149 + xy: 1024, 194 size: 16, 16 orig: 16, 16 offset: 0, 0 @@ -10371,28 +10483,28 @@ block-dark-panel-2-xlarge index: -1 block-dark-panel-3-large rotate: false - xy: 1065, 682 + xy: 301, 112 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-dark-panel-3-medium rotate: false - xy: 511, 115 + xy: 1426, 522 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-dark-panel-3-small rotate: false - xy: 1655, 260 + xy: 618, 91 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-dark-panel-3-tiny rotate: false - xy: 757, 131 + xy: 1351, 220 size: 16, 16 orig: 16, 16 offset: 0, 0 @@ -10406,28 +10518,28 @@ block-dark-panel-3-xlarge index: -1 block-dark-panel-4-large rotate: false - xy: 1107, 682 + xy: 821, 640 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-dark-panel-4-medium rotate: false - xy: 553, 157 + xy: 1460, 522 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-dark-panel-4-small rotate: false - xy: 1681, 272 + xy: 644, 117 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-dark-panel-4-tiny rotate: false - xy: 757, 113 + xy: 1024, 176 size: 16, 16 orig: 16, 16 offset: 0, 0 @@ -10441,28 +10553,28 @@ block-dark-panel-4-xlarge index: -1 block-dark-panel-5-large rotate: false - xy: 1149, 682 + xy: 863, 682 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-dark-panel-5-medium rotate: false - xy: 595, 199 + xy: 1494, 522 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-dark-panel-5-small rotate: false - xy: 1707, 272 + xy: 618, 65 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-dark-panel-5-tiny rotate: false - xy: 775, 213 + xy: 1042, 194 size: 16, 16 orig: 16, 16 offset: 0, 0 @@ -10476,28 +10588,28 @@ block-dark-panel-5-xlarge index: -1 block-dark-panel-6-large rotate: false - xy: 1191, 682 + xy: 301, 70 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-dark-panel-6-medium rotate: false - xy: 637, 241 + xy: 1528, 522 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-dark-panel-6-small rotate: false - xy: 1733, 272 + xy: 644, 91 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-dark-panel-6-tiny rotate: false - xy: 793, 213 + xy: 1369, 220 size: 16, 16 orig: 16, 16 offset: 0, 0 @@ -10511,49 +10623,49 @@ block-dark-panel-6-xlarge index: -1 block-darksand-large rotate: false - xy: 1233, 682 + xy: 863, 640 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-darksand-medium rotate: false - xy: 679, 283 + xy: 1562, 522 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-darksand-small rotate: false - xy: 1804, 504 + xy: 670, 117 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-darksand-tainted-water-large rotate: false - xy: 1275, 682 + xy: 905, 682 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-darksand-tainted-water-medium rotate: false - xy: 721, 325 + xy: 1596, 522 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-darksand-tainted-water-small rotate: false - xy: 1830, 504 + xy: 618, 39 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-darksand-tainted-water-tiny rotate: false - xy: 775, 195 + xy: 1042, 176 size: 16, 16 orig: 16, 16 offset: 0, 0 @@ -10567,35 +10679,35 @@ block-darksand-tainted-water-xlarge index: -1 block-darksand-tiny rotate: false - xy: 775, 177 + xy: 1060, 194 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-darksand-water-large rotate: false - xy: 1317, 682 + xy: 301, 28 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-darksand-water-medium rotate: false - xy: 763, 367 + xy: 1630, 522 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-darksand-water-small rotate: false - xy: 1856, 504 + xy: 644, 65 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-darksand-water-tiny rotate: false - xy: 793, 195 + xy: 1387, 220 size: 16, 16 orig: 16, 16 offset: 0, 0 @@ -10616,28 +10728,28 @@ block-darksand-xlarge index: -1 block-dart-ship-pad-large rotate: false - xy: 1359, 682 + xy: 905, 640 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-dart-ship-pad-medium rotate: false - xy: 797, 367 + xy: 1664, 522 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-dart-ship-pad-small rotate: false - xy: 1882, 504 + xy: 670, 91 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-dart-ship-pad-tiny rotate: false - xy: 775, 159 + xy: 1060, 176 size: 16, 16 orig: 16, 16 offset: 0, 0 @@ -10651,28 +10763,28 @@ block-dart-ship-pad-xlarge index: -1 block-deepwater-large rotate: false - xy: 1401, 682 + xy: 947, 682 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-deepwater-medium rotate: false - xy: 973, 619 + xy: 1698, 522 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-deepwater-small rotate: false - xy: 1908, 504 + xy: 696, 117 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-deepwater-tiny rotate: false - xy: 793, 177 + xy: 1078, 194 size: 16, 16 orig: 16, 16 offset: 0, 0 @@ -10686,28 +10798,28 @@ block-deepwater-xlarge index: -1 block-delta-mech-pad-large rotate: false - xy: 1443, 682 + xy: 947, 640 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-delta-mech-pad-medium rotate: false - xy: 1007, 619 + xy: 1732, 522 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-delta-mech-pad-small rotate: false - xy: 1934, 504 + xy: 618, 13 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-delta-mech-pad-tiny rotate: false - xy: 775, 141 + xy: 1405, 220 size: 16, 16 orig: 16, 16 offset: 0, 0 @@ -10721,28 +10833,28 @@ block-delta-mech-pad-xlarge index: -1 block-differential-generator-large rotate: false - xy: 1485, 682 + xy: 989, 682 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-differential-generator-medium rotate: false - xy: 1041, 619 + xy: 1766, 522 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-differential-generator-small rotate: false - xy: 1960, 556 + xy: 644, 39 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-differential-generator-tiny rotate: false - xy: 793, 159 + xy: 1078, 176 size: 16, 16 orig: 16, 16 offset: 0, 0 @@ -10756,28 +10868,28 @@ block-differential-generator-xlarge index: -1 block-distributor-large rotate: false - xy: 1527, 682 + xy: 989, 640 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-distributor-medium rotate: false - xy: 1075, 619 + xy: 1800, 522 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-distributor-small rotate: false - xy: 1960, 530 + xy: 670, 65 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-distributor-tiny rotate: false - xy: 775, 123 + xy: 1096, 194 size: 16, 16 orig: 16, 16 offset: 0, 0 @@ -10791,35 +10903,35 @@ block-distributor-xlarge index: -1 block-door-large rotate: false - xy: 1569, 682 + xy: 1031, 682 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-door-large-large rotate: false - xy: 1611, 682 + xy: 1031, 640 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-door-large-medium rotate: false - xy: 1109, 619 + xy: 1834, 522 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-door-large-small rotate: false - xy: 1960, 504 + xy: 696, 91 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-door-large-tiny rotate: false - xy: 793, 141 + xy: 1423, 220 size: 16, 16 orig: 16, 16 offset: 0, 0 @@ -10833,21 +10945,21 @@ block-door-large-xlarge index: -1 block-door-medium rotate: false - xy: 1143, 619 + xy: 1868, 522 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-door-small rotate: false - xy: 1986, 562 + xy: 722, 117 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-door-tiny rotate: false - xy: 793, 123 + xy: 1096, 176 size: 16, 16 orig: 16, 16 offset: 0, 0 @@ -10861,28 +10973,28 @@ block-door-xlarge index: -1 block-draug-factory-large rotate: false - xy: 1653, 682 + xy: 1073, 682 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-draug-factory-medium rotate: false - xy: 1177, 619 + xy: 1902, 522 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-draug-factory-small rotate: false - xy: 1986, 536 + xy: 644, 13 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-draug-factory-tiny rotate: false - xy: 811, 208 + xy: 1114, 194 size: 16, 16 orig: 16, 16 offset: 0, 0 @@ -10896,28 +11008,28 @@ block-draug-factory-xlarge index: -1 block-dunerocks-large rotate: false - xy: 1695, 682 + xy: 1073, 640 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-dunerocks-medium rotate: false - xy: 1211, 619 + xy: 1936, 522 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-dunerocks-small rotate: false - xy: 1986, 510 + xy: 670, 39 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-dunerocks-tiny rotate: false - xy: 829, 208 + xy: 1441, 220 size: 16, 16 orig: 16, 16 offset: 0, 0 @@ -10931,28 +11043,28 @@ block-dunerocks-xlarge index: -1 block-duo-large rotate: false - xy: 1737, 682 + xy: 1115, 682 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-duo-medium rotate: false - xy: 847, 464 + xy: 385, 15 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-duo-small rotate: false - xy: 2012, 544 + xy: 696, 65 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-duo-tiny rotate: false - xy: 811, 190 + xy: 1114, 176 size: 16, 16 orig: 16, 16 offset: 0, 0 @@ -10966,28 +11078,28 @@ block-duo-xlarge index: -1 block-force-projector-large rotate: false - xy: 1779, 682 + xy: 1115, 640 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-force-projector-medium rotate: false - xy: 843, 430 + xy: 419, 10 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-force-projector-small rotate: false - xy: 2012, 518 + xy: 722, 91 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-force-projector-tiny rotate: false - xy: 847, 208 + xy: 1132, 194 size: 16, 16 orig: 16, 16 offset: 0, 0 @@ -11001,28 +11113,28 @@ block-force-projector-xlarge index: -1 block-fortress-factory-large rotate: false - xy: 1821, 682 + xy: 1157, 682 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-fortress-factory-medium rotate: false - xy: 839, 396 + xy: 1970, 522 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-fortress-factory-small rotate: false - xy: 1681, 246 + xy: 670, 13 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-fortress-factory-tiny rotate: false - xy: 811, 172 + xy: 1459, 220 size: 16, 16 orig: 16, 16 offset: 0, 0 @@ -11036,28 +11148,28 @@ block-fortress-factory-xlarge index: -1 block-fuse-large rotate: false - xy: 1863, 682 + xy: 1157, 640 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-fuse-medium rotate: false - xy: 831, 362 + xy: 511, 493 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-fuse-small rotate: false - xy: 1707, 246 + xy: 696, 39 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-fuse-tiny rotate: false - xy: 829, 190 + xy: 1132, 176 size: 16, 16 orig: 16, 16 offset: 0, 0 @@ -11071,28 +11183,28 @@ block-fuse-xlarge index: -1 block-ghoul-factory-large rotate: false - xy: 1905, 682 + xy: 1199, 682 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-ghoul-factory-medium rotate: false - xy: 1990, 622 + xy: 545, 493 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-ghoul-factory-small rotate: false - xy: 1733, 246 + xy: 722, 65 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-ghoul-factory-tiny rotate: false - xy: 865, 208 + xy: 1150, 194 size: 16, 16 orig: 16, 16 offset: 0, 0 @@ -11106,28 +11218,28 @@ block-ghoul-factory-xlarge index: -1 block-glaive-ship-pad-large rotate: false - xy: 1947, 682 + xy: 1199, 640 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-glaive-ship-pad-medium rotate: false - xy: 865, 362 + xy: 579, 493 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-glaive-ship-pad-small rotate: false - xy: 1761, 394 + xy: 696, 13 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-glaive-ship-pad-tiny rotate: false - xy: 811, 154 + xy: 1477, 220 size: 16, 16 orig: 16, 16 offset: 0, 0 @@ -11141,28 +11253,28 @@ block-glaive-ship-pad-xlarge index: -1 block-graphite-press-large rotate: false - xy: 301, 2 + xy: 1241, 682 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-graphite-press-medium rotate: false - xy: 873, 396 + xy: 613, 493 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-graphite-press-small rotate: false - xy: 1801, 478 + xy: 722, 39 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-graphite-press-tiny rotate: false - xy: 811, 136 + xy: 1150, 176 size: 16, 16 orig: 16, 16 offset: 0, 0 @@ -11176,28 +11288,28 @@ block-graphite-press-xlarge index: -1 block-grass-large rotate: false - xy: 1987, 732 + xy: 1241, 640 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-grass-medium rotate: false - xy: 877, 430 + xy: 647, 493 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-grass-small rotate: false - xy: 1827, 478 + xy: 722, 13 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-grass-tiny rotate: false - xy: 829, 172 + xy: 1168, 194 size: 16, 16 orig: 16, 16 offset: 0, 0 @@ -11211,28 +11323,28 @@ block-grass-xlarge index: -1 block-hail-large rotate: false - xy: 1989, 690 + xy: 1283, 682 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-hail-medium rotate: false - xy: 881, 464 + xy: 681, 493 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-hail-small rotate: false - xy: 1853, 478 + xy: 750, 173 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-hail-tiny rotate: false - xy: 847, 190 + xy: 1495, 220 size: 16, 16 orig: 16, 16 offset: 0, 0 @@ -11246,28 +11358,28 @@ block-hail-xlarge index: -1 block-holostone-large rotate: false - xy: 343, 632 + xy: 1283, 640 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-holostone-medium rotate: false - xy: 899, 362 + xy: 715, 493 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-holostone-small rotate: false - xy: 1879, 478 + xy: 750, 147 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-holostone-tiny rotate: false - xy: 883, 208 + xy: 1168, 176 size: 16, 16 orig: 16, 16 offset: 0, 0 @@ -11281,28 +11393,28 @@ block-holostone-xlarge index: -1 block-hotrock-large rotate: false - xy: 343, 590 + xy: 1325, 682 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-hotrock-medium rotate: false - xy: 907, 396 + xy: 507, 459 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-hotrock-small rotate: false - xy: 1905, 478 + xy: 776, 173 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-hotrock-tiny rotate: false - xy: 829, 154 + xy: 1513, 220 size: 16, 16 orig: 16, 16 offset: 0, 0 @@ -11316,49 +11428,49 @@ block-hotrock-xlarge index: -1 block-ice-large rotate: false - xy: 343, 548 + xy: 1325, 640 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-ice-medium rotate: false - xy: 911, 430 + xy: 541, 459 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-ice-small rotate: false - xy: 1931, 478 + xy: 776, 147 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-ice-snow-large rotate: false - xy: 343, 506 + xy: 1367, 682 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-ice-snow-medium rotate: false - xy: 933, 362 + xy: 575, 459 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-ice-snow-small rotate: false - xy: 1957, 478 + xy: 802, 173 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-ice-snow-tiny rotate: false - xy: 829, 136 + xy: 1531, 220 size: 16, 16 orig: 16, 16 offset: 0, 0 @@ -11372,7 +11484,7 @@ block-ice-snow-xlarge index: -1 block-ice-tiny rotate: false - xy: 847, 172 + xy: 1549, 220 size: 16, 16 orig: 16, 16 offset: 0, 0 @@ -11386,28 +11498,28 @@ block-ice-xlarge index: -1 block-icerocks-large rotate: false - xy: 343, 464 + xy: 1367, 640 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-icerocks-medium rotate: false - xy: 941, 396 + xy: 609, 459 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-icerocks-small rotate: false - xy: 1775, 465 + xy: 802, 147 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-icerocks-tiny rotate: false - xy: 865, 190 + xy: 1567, 220 size: 16, 16 orig: 16, 16 offset: 0, 0 @@ -11421,28 +11533,28 @@ block-icerocks-xlarge index: -1 block-ignarock-large rotate: false - xy: 343, 422 + xy: 1409, 682 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-ignarock-medium rotate: false - xy: 967, 362 + xy: 643, 459 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-ignarock-small rotate: false - xy: 1801, 452 + xy: 750, 121 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-ignarock-tiny rotate: false - xy: 901, 208 + xy: 1585, 220 size: 16, 16 orig: 16, 16 offset: 0, 0 @@ -11456,28 +11568,28 @@ block-ignarock-xlarge index: -1 block-impact-reactor-large rotate: false - xy: 343, 380 + xy: 1409, 640 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-impact-reactor-medium rotate: false - xy: 461, 31 + xy: 677, 459 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-impact-reactor-small rotate: false - xy: 1827, 452 + xy: 776, 121 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-impact-reactor-tiny rotate: false - xy: 847, 154 + xy: 1603, 220 size: 16, 16 orig: 16, 16 offset: 0, 0 @@ -11491,28 +11603,28 @@ block-impact-reactor-xlarge index: -1 block-incinerator-large rotate: false - xy: 343, 338 + xy: 1451, 682 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-incinerator-medium rotate: false - xy: 503, 73 + xy: 711, 459 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-incinerator-small rotate: false - xy: 1853, 452 + xy: 802, 121 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-incinerator-tiny rotate: false - xy: 847, 136 + xy: 1621, 220 size: 16, 16 orig: 16, 16 offset: 0, 0 @@ -11526,28 +11638,28 @@ block-incinerator-xlarge index: -1 block-inverted-sorter-large rotate: false - xy: 343, 296 + xy: 1451, 640 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-inverted-sorter-medium rotate: false - xy: 495, 39 + xy: 749, 493 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-inverted-sorter-small rotate: false - xy: 1879, 452 + xy: 748, 95 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-inverted-sorter-tiny rotate: false - xy: 865, 172 + xy: 1639, 220 size: 16, 16 orig: 16, 16 offset: 0, 0 @@ -11561,28 +11673,28 @@ block-inverted-sorter-xlarge index: -1 block-item-source-large rotate: false - xy: 343, 254 + xy: 1493, 682 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-item-source-medium rotate: false - xy: 495, 5 + xy: 745, 459 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-item-source-small rotate: false - xy: 1905, 452 + xy: 748, 69 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-item-source-tiny rotate: false - xy: 883, 190 + xy: 1657, 220 size: 16, 16 orig: 16, 16 offset: 0, 0 @@ -11596,28 +11708,28 @@ block-item-source-xlarge index: -1 block-item-void-large rotate: false - xy: 343, 212 + xy: 1493, 640 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-item-void-medium rotate: false - xy: 529, 39 + xy: 469, 422 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-item-void-small rotate: false - xy: 1931, 452 + xy: 774, 95 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-item-void-tiny rotate: false - xy: 919, 208 + xy: 1675, 220 size: 16, 16 orig: 16, 16 offset: 0, 0 @@ -11631,28 +11743,28 @@ block-item-void-xlarge index: -1 block-javelin-ship-pad-large rotate: false - xy: 343, 170 + xy: 1535, 682 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-javelin-ship-pad-medium rotate: false - xy: 529, 5 + xy: 465, 388 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-javelin-ship-pad-small rotate: false - xy: 1957, 452 + xy: 748, 43 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-javelin-ship-pad-tiny rotate: false - xy: 865, 154 + xy: 1693, 220 size: 16, 16 orig: 16, 16 offset: 0, 0 @@ -11666,28 +11778,28 @@ block-javelin-ship-pad-xlarge index: -1 block-junction-large rotate: false - xy: 343, 128 + xy: 1535, 640 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-junction-medium rotate: false - xy: 587, 157 + xy: 461, 354 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-junction-small rotate: false - xy: 1773, 439 + xy: 774, 69 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-junction-tiny rotate: false - xy: 865, 136 + xy: 1711, 220 size: 16, 16 orig: 16, 16 offset: 0, 0 @@ -11701,28 +11813,28 @@ block-junction-xlarge index: -1 block-kiln-large rotate: false - xy: 343, 86 + xy: 1577, 682 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-kiln-medium rotate: false - xy: 629, 199 + xy: 461, 320 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-kiln-small rotate: false - xy: 1799, 426 + xy: 800, 95 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-kiln-tiny rotate: false - xy: 883, 172 + xy: 1729, 220 size: 16, 16 orig: 16, 16 offset: 0, 0 @@ -11736,28 +11848,28 @@ block-kiln-xlarge index: -1 block-lancer-large rotate: false - xy: 343, 44 + xy: 1577, 640 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-lancer-medium rotate: false - xy: 621, 165 + xy: 461, 286 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-lancer-small rotate: false - xy: 1825, 426 + xy: 748, 17 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-lancer-tiny rotate: false - xy: 901, 190 + xy: 1747, 220 size: 16, 16 orig: 16, 16 offset: 0, 0 @@ -11771,28 +11883,28 @@ block-lancer-xlarge index: -1 block-laser-drill-large rotate: false - xy: 343, 2 + xy: 1619, 682 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-laser-drill-medium rotate: false - xy: 621, 131 + xy: 461, 252 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-laser-drill-small rotate: false - xy: 1851, 426 + xy: 774, 43 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-laser-drill-tiny rotate: false - xy: 937, 208 + xy: 1765, 220 size: 16, 16 orig: 16, 16 offset: 0, 0 @@ -11806,35 +11918,35 @@ block-laser-drill-xlarge index: -1 block-launch-pad-large rotate: false - xy: 385, 640 + xy: 1619, 640 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-launch-pad-large-large rotate: false - xy: 385, 598 + xy: 1661, 682 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-launch-pad-large-medium rotate: false - xy: 655, 165 + xy: 461, 218 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-launch-pad-large-small rotate: false - xy: 1877, 426 + xy: 800, 69 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-launch-pad-large-tiny rotate: false - xy: 883, 154 + xy: 1783, 220 size: 16, 16 orig: 16, 16 offset: 0, 0 @@ -11848,21 +11960,21 @@ block-launch-pad-large-xlarge index: -1 block-launch-pad-medium rotate: false - xy: 655, 131 + xy: 1997, 572 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-launch-pad-small rotate: false - xy: 1903, 426 + xy: 774, 17 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-launch-pad-tiny rotate: false - xy: 883, 136 + xy: 1801, 220 size: 16, 16 orig: 16, 16 offset: 0, 0 @@ -11876,28 +11988,28 @@ block-launch-pad-xlarge index: -1 block-liquid-junction-large rotate: false - xy: 427, 640 + xy: 1661, 640 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-liquid-junction-medium rotate: false - xy: 713, 283 + xy: 2004, 538 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-liquid-junction-small rotate: false - xy: 1929, 426 + xy: 800, 43 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-liquid-junction-tiny rotate: false - xy: 901, 172 + xy: 1819, 220 size: 16, 16 orig: 16, 16 offset: 0, 0 @@ -11911,28 +12023,28 @@ block-liquid-junction-xlarge index: -1 block-liquid-router-large rotate: false - xy: 385, 556 + xy: 1703, 682 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-liquid-router-medium rotate: false - xy: 755, 325 + xy: 2004, 504 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-liquid-router-small rotate: false - xy: 1955, 426 + xy: 800, 17 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-liquid-router-tiny rotate: false - xy: 919, 190 + xy: 1837, 220 size: 16, 16 orig: 16, 16 offset: 0, 0 @@ -11946,28 +12058,28 @@ block-liquid-router-xlarge index: -1 block-liquid-source-large rotate: false - xy: 427, 598 + xy: 1703, 640 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-liquid-source-medium rotate: false - xy: 747, 291 + xy: 457, 180 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-liquid-source-small rotate: false - xy: 1493, 208 + xy: 799, 263 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-liquid-source-tiny rotate: false - xy: 955, 208 + xy: 1855, 220 size: 16, 16 orig: 16, 16 offset: 0, 0 @@ -11981,28 +12093,28 @@ block-liquid-source-xlarge index: -1 block-liquid-tank-large rotate: false - xy: 469, 640 + xy: 1745, 682 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-liquid-tank-medium rotate: false - xy: 789, 333 + xy: 453, 146 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-liquid-tank-small rotate: false - xy: 1519, 206 + xy: 799, 237 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-liquid-tank-tiny rotate: false - xy: 901, 154 + xy: 1873, 220 size: 16, 16 orig: 16, 16 offset: 0, 0 @@ -12016,28 +12128,28 @@ block-liquid-tank-xlarge index: -1 block-magmarock-large rotate: false - xy: 385, 514 + xy: 1745, 640 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-magmarock-medium rotate: false - xy: 823, 328 + xy: 453, 112 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-magmarock-small rotate: false - xy: 1545, 206 + xy: 825, 264 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-magmarock-tiny rotate: false - xy: 901, 136 + xy: 1891, 220 size: 16, 16 orig: 16, 16 offset: 0, 0 @@ -12051,28 +12163,28 @@ block-magmarock-xlarge index: -1 block-mass-driver-large rotate: false - xy: 427, 556 + xy: 1787, 682 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-mass-driver-medium rotate: false - xy: 857, 328 + xy: 453, 78 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-mass-driver-small rotate: false - xy: 1571, 206 + xy: 825, 238 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-mass-driver-tiny rotate: false - xy: 919, 172 + xy: 1909, 220 size: 16, 16 orig: 16, 16 offset: 0, 0 @@ -12086,28 +12198,28 @@ block-mass-driver-xlarge index: -1 block-mechanical-drill-large rotate: false - xy: 469, 598 + xy: 1787, 640 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-mechanical-drill-medium rotate: false - xy: 891, 328 + xy: 453, 44 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-mechanical-drill-small rotate: false - xy: 1597, 206 + xy: 851, 264 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-mechanical-drill-tiny rotate: false - xy: 937, 190 + xy: 854, 121 size: 16, 16 orig: 16, 16 offset: 0, 0 @@ -12121,28 +12233,28 @@ block-mechanical-drill-xlarge index: -1 block-mechanical-pump-large rotate: false - xy: 511, 640 + xy: 1829, 682 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-mechanical-pump-medium rotate: false - xy: 925, 328 + xy: 453, 10 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-mechanical-pump-small rotate: false - xy: 2012, 492 + xy: 851, 238 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-mechanical-pump-tiny rotate: false - xy: 973, 208 + xy: 852, 103 size: 16, 16 orig: 16, 16 offset: 0, 0 @@ -12156,28 +12268,28 @@ block-mechanical-pump-xlarge index: -1 block-meltdown-large rotate: false - xy: 385, 472 + xy: 1829, 640 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-meltdown-medium rotate: false - xy: 959, 328 + xy: 779, 459 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-meltdown-small rotate: false - xy: 1986, 484 + xy: 877, 264 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-meltdown-tiny rotate: false - xy: 919, 154 + xy: 852, 85 size: 16, 16 orig: 16, 16 offset: 0, 0 @@ -12191,28 +12303,28 @@ block-meltdown-xlarge index: -1 block-melter-large rotate: false - xy: 427, 514 + xy: 1871, 682 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-melter-medium rotate: false - xy: 789, 299 + xy: 503, 422 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-melter-small rotate: false - xy: 1983, 458 + xy: 877, 238 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-melter-tiny rotate: false - xy: 919, 136 + xy: 852, 67 size: 16, 16 orig: 16, 16 offset: 0, 0 @@ -12226,28 +12338,28 @@ block-melter-xlarge index: -1 block-mend-projector-large rotate: false - xy: 469, 556 + xy: 1871, 640 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-mend-projector-medium rotate: false - xy: 823, 294 + xy: 499, 388 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-mend-projector-small rotate: false - xy: 1787, 400 + xy: 903, 264 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-mend-projector-tiny rotate: false - xy: 937, 172 + xy: 852, 49 size: 16, 16 orig: 16, 16 offset: 0, 0 @@ -12261,28 +12373,28 @@ block-mend-projector-xlarge index: -1 block-mender-large rotate: false - xy: 511, 598 + xy: 1913, 682 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-mender-medium rotate: false - xy: 857, 294 + xy: 495, 354 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-mender-small rotate: false - xy: 1813, 400 + xy: 903, 238 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-mender-tiny rotate: false - xy: 955, 190 + xy: 852, 31 size: 16, 16 orig: 16, 16 offset: 0, 0 @@ -12296,28 +12408,28 @@ block-mender-xlarge index: -1 block-message-large rotate: false - xy: 553, 640 + xy: 1913, 640 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-message-medium rotate: false - xy: 891, 294 + xy: 495, 320 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-message-small rotate: false - xy: 1839, 400 + xy: 929, 264 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-message-tiny rotate: false - xy: 991, 208 + xy: 852, 13 size: 16, 16 orig: 16, 16 offset: 0, 0 @@ -12331,28 +12443,28 @@ block-message-xlarge index: -1 block-metal-floor-2-large rotate: false - xy: 385, 430 + xy: 1955, 682 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-metal-floor-2-medium rotate: false - xy: 925, 294 + xy: 495, 286 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-metal-floor-2-small rotate: false - xy: 1865, 400 + xy: 929, 238 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-metal-floor-2-tiny rotate: false - xy: 937, 154 + xy: 1189, 202 size: 16, 16 orig: 16, 16 offset: 0, 0 @@ -12366,28 +12478,28 @@ block-metal-floor-2-xlarge index: -1 block-metal-floor-3-large rotate: false - xy: 427, 472 + xy: 1955, 640 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-metal-floor-3-medium rotate: false - xy: 959, 294 + xy: 495, 252 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-metal-floor-3-small rotate: false - xy: 1891, 400 + xy: 955, 264 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-metal-floor-3-tiny rotate: false - xy: 937, 136 + xy: 1207, 202 size: 16, 16 orig: 16, 16 offset: 0, 0 @@ -12401,28 +12513,28 @@ block-metal-floor-3-xlarge index: -1 block-metal-floor-5-large rotate: false - xy: 469, 514 + xy: 1987, 732 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-metal-floor-5-medium rotate: false - xy: 747, 257 + xy: 495, 218 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-metal-floor-5-small rotate: false - xy: 1917, 400 + xy: 955, 238 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-metal-floor-5-tiny rotate: false - xy: 955, 172 + xy: 1225, 202 size: 16, 16 orig: 16, 16 offset: 0, 0 @@ -12436,28 +12548,28 @@ block-metal-floor-5-xlarge index: -1 block-metal-floor-damaged-large rotate: false - xy: 511, 556 + xy: 1997, 690 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-metal-floor-damaged-medium rotate: false - xy: 781, 265 + xy: 537, 425 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-metal-floor-damaged-small rotate: false - xy: 1943, 400 + xy: 981, 264 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-metal-floor-damaged-tiny rotate: false - xy: 973, 190 + xy: 1243, 202 size: 16, 16 orig: 16, 16 offset: 0, 0 @@ -12471,28 +12583,28 @@ block-metal-floor-damaged-xlarge index: -1 block-metal-floor-large rotate: false - xy: 553, 598 + xy: 1997, 648 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-metal-floor-medium rotate: false - xy: 815, 260 + xy: 571, 425 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-metal-floor-small rotate: false - xy: 1969, 400 + xy: 981, 238 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-metal-floor-tiny rotate: false - xy: 1009, 208 + xy: 1261, 202 size: 16, 16 orig: 16, 16 offset: 0, 0 @@ -12506,28 +12618,28 @@ block-metal-floor-xlarge index: -1 block-moss-large rotate: false - xy: 595, 640 + xy: 401, 598 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-moss-medium rotate: false - xy: 849, 260 + xy: 605, 425 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-moss-small rotate: false - xy: 1981, 426 + xy: 1007, 264 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-moss-tiny rotate: false - xy: 955, 154 + xy: 1279, 202 size: 16, 16 orig: 16, 16 offset: 0, 0 @@ -12541,28 +12653,28 @@ block-moss-xlarge index: -1 block-multi-press-large rotate: false - xy: 385, 388 + xy: 443, 598 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-multi-press-medium rotate: false - xy: 883, 260 + xy: 639, 425 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-multi-press-small rotate: false - xy: 1995, 400 + xy: 1007, 238 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-multi-press-tiny rotate: false - xy: 955, 136 + xy: 1297, 202 size: 16, 16 orig: 16, 16 offset: 0, 0 @@ -12576,28 +12688,28 @@ block-multi-press-xlarge index: -1 block-oil-extractor-large rotate: false - xy: 427, 430 + xy: 485, 598 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-oil-extractor-medium rotate: false - xy: 917, 260 + xy: 673, 425 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-oil-extractor-small rotate: false - xy: 2012, 466 + xy: 1033, 264 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-oil-extractor-tiny rotate: false - xy: 973, 172 + xy: 1315, 202 size: 16, 16 orig: 16, 16 offset: 0, 0 @@ -12611,28 +12723,28 @@ block-oil-extractor-xlarge index: -1 block-omega-mech-pad-large rotate: false - xy: 469, 472 + xy: 527, 598 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-omega-mech-pad-medium rotate: false - xy: 951, 260 + xy: 707, 425 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-omega-mech-pad-small rotate: false - xy: 1755, 362 + xy: 1033, 238 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-omega-mech-pad-tiny rotate: false - xy: 991, 190 + xy: 1333, 202 size: 16, 16 orig: 16, 16 offset: 0, 0 @@ -12646,28 +12758,28 @@ block-omega-mech-pad-xlarge index: -1 block-overdrive-projector-large rotate: false - xy: 511, 514 + xy: 569, 598 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-overdrive-projector-medium rotate: false - xy: 781, 231 + xy: 741, 425 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-overdrive-projector-small rotate: false - xy: 1755, 336 + xy: 1059, 264 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-overdrive-projector-tiny rotate: false - xy: 1027, 208 + xy: 1351, 202 size: 16, 16 orig: 16, 16 offset: 0, 0 @@ -12681,28 +12793,28 @@ block-overdrive-projector-xlarge index: -1 block-overflow-gate-large rotate: false - xy: 553, 556 + xy: 611, 598 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-overflow-gate-medium rotate: false - xy: 815, 226 + xy: 775, 425 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-overflow-gate-small rotate: false - xy: 1755, 310 + xy: 1059, 238 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-overflow-gate-tiny rotate: false - xy: 973, 154 + xy: 1369, 202 size: 16, 16 orig: 16, 16 offset: 0, 0 @@ -12716,28 +12828,28 @@ block-overflow-gate-xlarge index: -1 block-pebbles-large rotate: false - xy: 595, 598 + xy: 653, 598 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-pebbles-medium rotate: false - xy: 849, 226 + xy: 491, 184 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-pebbles-small rotate: false - xy: 1759, 284 + xy: 1085, 264 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-pebbles-tiny rotate: false - xy: 973, 136 + xy: 1387, 202 size: 16, 16 orig: 16, 16 offset: 0, 0 @@ -12751,28 +12863,28 @@ block-pebbles-xlarge index: -1 block-phantom-factory-large rotate: false - xy: 637, 640 + xy: 695, 598 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-phantom-factory-medium rotate: false - xy: 883, 226 + xy: 487, 146 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-phantom-factory-small rotate: false - xy: 1759, 258 + xy: 1085, 238 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-phantom-factory-tiny rotate: false - xy: 991, 172 + xy: 1405, 202 size: 16, 16 orig: 16, 16 offset: 0, 0 @@ -12786,28 +12898,28 @@ block-phantom-factory-xlarge index: -1 block-phase-conduit-large rotate: false - xy: 385, 346 + xy: 737, 598 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-phase-conduit-medium rotate: false - xy: 917, 226 + xy: 487, 112 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-phase-conduit-small rotate: false - xy: 1759, 232 + xy: 1111, 264 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-phase-conduit-tiny rotate: false - xy: 1009, 190 + xy: 1423, 202 size: 16, 16 orig: 16, 16 offset: 0, 0 @@ -12821,28 +12933,28 @@ block-phase-conduit-xlarge index: -1 block-phase-conveyor-large rotate: false - xy: 427, 388 + xy: 779, 598 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-phase-conveyor-medium rotate: false - xy: 951, 226 + xy: 487, 78 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-phase-conveyor-small rotate: false - xy: 1623, 232 + xy: 1111, 238 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-phase-conveyor-tiny rotate: false - xy: 991, 154 + xy: 1441, 202 size: 16, 16 orig: 16, 16 offset: 0, 0 @@ -12856,35 +12968,35 @@ block-phase-conveyor-xlarge index: -1 block-phase-wall-large rotate: false - xy: 469, 430 + xy: 821, 598 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-phase-wall-large-large rotate: false - xy: 511, 472 + xy: 863, 598 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-phase-wall-large-medium rotate: false - xy: 993, 328 + xy: 487, 44 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-phase-wall-large-small rotate: false - xy: 1623, 206 + xy: 1137, 264 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-phase-wall-large-tiny rotate: false - xy: 991, 136 + xy: 1459, 202 size: 16, 16 orig: 16, 16 offset: 0, 0 @@ -12898,21 +13010,21 @@ block-phase-wall-large-xlarge index: -1 block-phase-wall-medium rotate: false - xy: 993, 294 + xy: 487, 10 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-phase-wall-small rotate: false - xy: 1649, 234 + xy: 1137, 238 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-phase-wall-tiny rotate: false - xy: 1009, 172 + xy: 1477, 202 size: 16, 16 orig: 16, 16 offset: 0, 0 @@ -12926,28 +13038,28 @@ block-phase-wall-xlarge index: -1 block-phase-weaver-large rotate: false - xy: 553, 514 + xy: 905, 598 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-phase-weaver-medium rotate: false - xy: 985, 260 + xy: 813, 488 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-phase-weaver-small rotate: false - xy: 1649, 208 + xy: 1163, 264 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-phase-weaver-tiny rotate: false - xy: 1027, 190 + xy: 1495, 202 size: 16, 16 orig: 16, 16 offset: 0, 0 @@ -12961,28 +13073,28 @@ block-phase-weaver-xlarge index: -1 block-pine-large rotate: false - xy: 595, 556 + xy: 947, 598 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-pine-medium rotate: false - xy: 985, 226 + xy: 847, 488 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-pine-small rotate: false - xy: 1675, 220 + xy: 1163, 238 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-pine-tiny rotate: false - xy: 1009, 154 + xy: 1513, 202 size: 16, 16 orig: 16, 16 offset: 0, 0 @@ -12996,28 +13108,28 @@ block-pine-xlarge index: -1 block-plastanium-compressor-large rotate: false - xy: 637, 598 + xy: 989, 598 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-plastanium-compressor-medium rotate: false - xy: 1019, 260 + xy: 881, 488 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-plastanium-compressor-small rotate: false - xy: 1701, 220 + xy: 1189, 264 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-plastanium-compressor-tiny rotate: false - xy: 1009, 136 + xy: 1531, 202 size: 16, 16 orig: 16, 16 offset: 0, 0 @@ -13029,2809 +13141,2879 @@ block-plastanium-compressor-xlarge orig: 48, 48 offset: 0, 0 index: -1 -block-pneumatic-drill-large +block-plastanium-wall-large rotate: false - xy: 679, 640 + xy: 1031, 598 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-pneumatic-drill-medium +block-plastanium-wall-large-large rotate: false - xy: 1019, 226 + xy: 1073, 598 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-plastanium-wall-large-medium + rotate: false + xy: 915, 488 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-pneumatic-drill-small +block-plastanium-wall-large-small rotate: false - xy: 1727, 220 + xy: 1189, 238 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-pneumatic-drill-tiny +block-plastanium-wall-large-tiny rotate: false - xy: 1027, 172 + xy: 1549, 202 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-pneumatic-drill-xlarge +block-plastanium-wall-large-xlarge rotate: false xy: 51, 16 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-power-node-large +block-plastanium-wall-medium rotate: false - xy: 385, 304 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-power-node-large-large - rotate: false - xy: 427, 346 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-power-node-large-medium - rotate: false - xy: 923, 535 + xy: 949, 488 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-power-node-large-small +block-plastanium-wall-small rotate: false - xy: 1675, 194 + xy: 1215, 264 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-power-node-large-tiny +block-plastanium-wall-tiny rotate: false - xy: 1027, 154 + xy: 1567, 202 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-power-node-large-xlarge +block-plastanium-wall-xlarge rotate: false xy: 101, 16 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-power-node-medium +block-pneumatic-drill-large rotate: false - xy: 919, 501 + xy: 1115, 598 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-pneumatic-drill-medium + rotate: false + xy: 983, 488 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-power-node-small +block-pneumatic-drill-small rotate: false - xy: 1701, 194 + xy: 1215, 238 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-power-node-tiny +block-pneumatic-drill-tiny rotate: false - xy: 1027, 136 + xy: 1585, 202 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-power-node-xlarge +block-pneumatic-drill-xlarge rotate: false xy: 151, 16 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-power-source-large +block-power-node-large rotate: false - xy: 469, 388 + xy: 1157, 598 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-power-source-medium +block-power-node-large-large rotate: false - xy: 915, 467 + xy: 1199, 598 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-power-node-large-medium + rotate: false + xy: 1017, 488 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-power-source-small +block-power-node-large-small rotate: false - xy: 1727, 194 + xy: 1241, 264 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-power-source-tiny +block-power-node-large-tiny rotate: false - xy: 811, 118 + xy: 1603, 202 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-power-source-xlarge +block-power-node-large-xlarge rotate: false xy: 201, 16 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-power-void-large +block-power-node-medium rotate: false - xy: 511, 430 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-power-void-medium - rotate: false - xy: 969, 585 + xy: 1051, 488 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-power-void-small +block-power-node-small rotate: false - xy: 1753, 206 + xy: 1241, 238 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-power-void-tiny +block-power-node-tiny rotate: false - xy: 829, 118 + xy: 1621, 202 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-power-void-xlarge +block-power-node-xlarge rotate: false xy: 251, 666 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-pulse-conduit-large +block-power-source-large rotate: false - xy: 553, 472 + xy: 1241, 598 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-pulse-conduit-medium +block-power-source-medium rotate: false - xy: 1003, 585 + xy: 1085, 488 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-pulse-conduit-small +block-power-source-small rotate: false - xy: 1649, 182 + xy: 1267, 264 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-pulse-conduit-tiny +block-power-source-tiny rotate: false - xy: 847, 118 + xy: 1639, 202 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-pulse-conduit-xlarge +block-power-source-xlarge rotate: false xy: 251, 616 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-pulverizer-large +block-power-void-large rotate: false - xy: 595, 514 + xy: 1283, 598 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-pulverizer-medium +block-power-void-medium rotate: false - xy: 1037, 585 + xy: 1119, 488 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-pulverizer-small +block-power-void-small rotate: false - xy: 1753, 180 + xy: 1267, 238 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-pulverizer-tiny +block-power-void-tiny rotate: false - xy: 865, 118 + xy: 1657, 202 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-pulverizer-xlarge +block-power-void-xlarge rotate: false xy: 251, 566 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-pyratite-mixer-large +block-pulse-conduit-large rotate: false - xy: 637, 556 + xy: 1325, 598 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-pyratite-mixer-medium +block-pulse-conduit-medium rotate: false - xy: 1071, 585 + xy: 1153, 488 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-pyratite-mixer-small +block-pulse-conduit-small rotate: false - xy: 1675, 168 + xy: 1293, 264 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-pyratite-mixer-tiny +block-pulse-conduit-tiny rotate: false - xy: 883, 118 + xy: 1675, 202 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-pyratite-mixer-xlarge +block-pulse-conduit-xlarge rotate: false xy: 251, 516 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-repair-point-large +block-pulverizer-large rotate: false - xy: 679, 598 + xy: 1367, 598 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-repair-point-medium +block-pulverizer-medium rotate: false - xy: 1105, 585 + xy: 1187, 488 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-repair-point-small +block-pulverizer-small rotate: false - xy: 1701, 168 + xy: 1293, 238 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-repair-point-tiny +block-pulverizer-tiny rotate: false - xy: 901, 118 + xy: 1693, 202 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-repair-point-xlarge +block-pulverizer-xlarge rotate: false xy: 251, 466 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-revenant-factory-large +block-pyratite-mixer-large rotate: false - xy: 721, 640 + xy: 1409, 598 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-revenant-factory-medium +block-pyratite-mixer-medium rotate: false - xy: 1139, 585 + xy: 1221, 488 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-revenant-factory-small +block-pyratite-mixer-small rotate: false - xy: 1727, 168 + xy: 1319, 264 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-revenant-factory-tiny +block-pyratite-mixer-tiny rotate: false - xy: 919, 118 + xy: 1711, 202 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-revenant-factory-xlarge +block-pyratite-mixer-xlarge rotate: false xy: 251, 416 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-ripple-large +block-repair-point-large rotate: false - xy: 385, 262 + xy: 1451, 598 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-ripple-medium +block-repair-point-medium rotate: false - xy: 1173, 585 + xy: 1255, 488 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-ripple-small +block-repair-point-small rotate: false - xy: 1753, 154 + xy: 1319, 238 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-ripple-tiny +block-repair-point-tiny rotate: false - xy: 937, 118 + xy: 1729, 202 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-ripple-xlarge +block-repair-point-xlarge rotate: false xy: 251, 366 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-rock-large +block-revenant-factory-large rotate: false - xy: 427, 304 + xy: 1493, 598 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-rock-medium +block-revenant-factory-medium rotate: false - xy: 1207, 585 + xy: 1289, 488 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-rock-small +block-revenant-factory-small rotate: false - xy: 1787, 374 + xy: 1345, 264 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-rock-tiny +block-revenant-factory-tiny rotate: false - xy: 955, 118 + xy: 1747, 202 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-rock-xlarge +block-revenant-factory-xlarge rotate: false xy: 251, 316 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-rocks-large +block-ripple-large rotate: false - xy: 469, 346 + xy: 1535, 598 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-rocks-medium +block-ripple-medium rotate: false - xy: 545, 115 + xy: 1323, 488 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-rocks-small +block-ripple-small rotate: false - xy: 1813, 374 + xy: 1345, 238 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-rocks-tiny +block-ripple-tiny rotate: false - xy: 973, 118 + xy: 1765, 202 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-rocks-xlarge +block-ripple-xlarge rotate: false xy: 251, 266 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-rotary-pump-large +block-rock-large rotate: false - xy: 511, 388 + xy: 1577, 598 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-rotary-pump-medium +block-rock-medium rotate: false - xy: 537, 81 + xy: 1357, 488 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-rotary-pump-small +block-rock-small rotate: false - xy: 1839, 374 + xy: 1371, 264 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-rotary-pump-tiny +block-rock-tiny rotate: false - xy: 991, 118 + xy: 1783, 202 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-rotary-pump-xlarge +block-rock-xlarge rotate: false xy: 251, 216 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-router-large +block-rocks-large rotate: false - xy: 553, 430 + xy: 1619, 598 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-router-medium +block-rocks-medium rotate: false - xy: 579, 123 + xy: 1391, 488 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-router-small +block-rocks-small rotate: false - xy: 1865, 374 + xy: 1371, 238 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-router-tiny +block-rocks-tiny rotate: false - xy: 1009, 118 + xy: 1801, 202 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-router-xlarge +block-rocks-xlarge rotate: false xy: 251, 166 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-rtg-generator-large +block-rotary-pump-large rotate: false - xy: 595, 472 + xy: 1661, 598 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-rtg-generator-medium +block-rotary-pump-medium rotate: false - xy: 571, 81 + xy: 1425, 488 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-rtg-generator-small +block-rotary-pump-small rotate: false - xy: 1891, 374 + xy: 1397, 264 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-rtg-generator-tiny +block-rotary-pump-tiny rotate: false - xy: 1027, 118 + xy: 1819, 202 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-rtg-generator-xlarge +block-rotary-pump-xlarge rotate: false xy: 251, 116 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-salt-large +block-router-large rotate: false - xy: 637, 514 + xy: 1703, 598 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-salt-medium +block-router-medium rotate: false - xy: 563, 47 + xy: 1459, 488 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-salt-small +block-router-small rotate: false - xy: 1917, 374 + xy: 1397, 238 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-salt-tiny +block-router-tiny rotate: false - xy: 2009, 200 + xy: 1837, 202 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-salt-xlarge +block-router-xlarge rotate: false xy: 251, 66 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-saltrocks-large +block-rtg-generator-large rotate: false - xy: 679, 556 + xy: 1745, 598 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-saltrocks-medium +block-rtg-generator-medium rotate: false - xy: 563, 13 + xy: 1493, 488 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-saltrocks-small +block-rtg-generator-small rotate: false - xy: 1943, 374 + xy: 1423, 264 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-saltrocks-tiny +block-rtg-generator-tiny rotate: false - xy: 1045, 193 + xy: 1855, 202 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-saltrocks-xlarge +block-rtg-generator-xlarge rotate: false xy: 251, 16 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-salvo-large +block-salt-large rotate: false - xy: 721, 598 + xy: 1787, 598 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-salvo-medium +block-salt-medium rotate: false - xy: 597, 47 + xy: 1527, 488 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-salvo-small +block-salt-small rotate: false - xy: 1969, 374 + xy: 1423, 238 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-salvo-tiny +block-salt-tiny rotate: false - xy: 1063, 193 + xy: 1873, 202 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-salvo-xlarge +block-salt-xlarge rotate: false xy: 309, 924 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-sand-boulder-large +block-saltrocks-large rotate: false - xy: 763, 640 + xy: 1829, 598 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-sand-boulder-medium +block-saltrocks-medium rotate: false - xy: 597, 13 + xy: 1561, 488 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-sand-boulder-small +block-saltrocks-small rotate: false - xy: 1995, 374 + xy: 1449, 264 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-sand-boulder-tiny +block-saltrocks-tiny rotate: false - xy: 1045, 175 + xy: 1891, 202 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-sand-boulder-xlarge +block-saltrocks-xlarge rotate: false xy: 309, 874 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-sand-large +block-salvo-large rotate: false - xy: 385, 220 + xy: 1871, 598 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-sand-medium +block-salvo-medium rotate: false - xy: 671, 241 + xy: 1595, 488 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-sand-small +block-salvo-small rotate: false - xy: 1781, 348 + xy: 1449, 238 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-sand-tiny +block-salvo-tiny rotate: false - xy: 1081, 193 + xy: 1909, 202 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-sand-water-large - rotate: false - xy: 427, 262 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-sand-water-medium - rotate: false - xy: 663, 207 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-sand-water-small - rotate: false - xy: 1781, 322 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-sand-water-tiny - rotate: false - xy: 1045, 157 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-sand-water-xlarge +block-salvo-xlarge rotate: false xy: 359, 924 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-sand-xlarge +block-sand-boulder-large + rotate: false + xy: 1913, 598 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-sand-boulder-medium + rotate: false + xy: 1629, 488 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-sand-boulder-small + rotate: false + xy: 1475, 264 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-sand-boulder-tiny + rotate: false + xy: 1186, 184 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-sand-boulder-xlarge rotate: false xy: 309, 824 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-sandrocks-large +block-sand-large rotate: false - xy: 469, 304 + xy: 1955, 598 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-sandrocks-medium +block-sand-medium rotate: false - xy: 705, 249 + xy: 1663, 488 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-sandrocks-small +block-sand-small rotate: false - xy: 1807, 348 + xy: 1475, 238 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-sandrocks-tiny +block-sand-tiny rotate: false - xy: 1063, 175 + xy: 1204, 184 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-sandrocks-xlarge +block-sand-water-large + rotate: false + xy: 1997, 606 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-sand-water-medium + rotate: false + xy: 1697, 488 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-sand-water-small + rotate: false + xy: 1501, 264 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-sand-water-tiny + rotate: false + xy: 1222, 184 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-sand-water-xlarge rotate: false xy: 359, 874 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-scatter-large - rotate: false - xy: 511, 346 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-scatter-medium - rotate: false - xy: 697, 207 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-scatter-small - rotate: false - xy: 1807, 322 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-scatter-tiny - rotate: false - xy: 1099, 193 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-scatter-xlarge +block-sand-xlarge rotate: false xy: 409, 924 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-scorch-large +block-sandrocks-large rotate: false - xy: 553, 388 + xy: 343, 532 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-scorch-medium +block-sandrocks-medium rotate: false - xy: 689, 173 + xy: 1731, 488 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-scorch-small +block-sandrocks-small rotate: false - xy: 1833, 348 + xy: 1501, 238 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-scorch-tiny +block-sandrocks-tiny rotate: false - xy: 1045, 139 + xy: 1240, 184 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-scorch-xlarge +block-sandrocks-xlarge rotate: false xy: 359, 824 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-scrap-wall-gigantic-large +block-scatter-large rotate: false - xy: 595, 430 + xy: 343, 490 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-scrap-wall-gigantic-medium +block-scatter-medium rotate: false - xy: 689, 139 + xy: 1765, 488 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-scrap-wall-gigantic-small +block-scatter-small rotate: false - xy: 1833, 322 + xy: 1527, 264 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-scrap-wall-gigantic-tiny +block-scatter-tiny rotate: false - xy: 1063, 157 + xy: 1258, 184 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-scrap-wall-gigantic-xlarge +block-scatter-xlarge rotate: false xy: 409, 874 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-scrap-wall-huge-large +block-scorch-large rotate: false - xy: 637, 472 + xy: 343, 448 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-scrap-wall-huge-medium +block-scorch-medium rotate: false - xy: 723, 173 + xy: 1799, 488 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-scrap-wall-huge-small +block-scorch-small rotate: false - xy: 1859, 348 + xy: 1527, 238 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-scrap-wall-huge-tiny +block-scorch-tiny rotate: false - xy: 1081, 175 + xy: 1276, 184 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-scrap-wall-huge-xlarge +block-scorch-xlarge rotate: false xy: 459, 924 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-scrap-wall-large +block-scrap-wall-gigantic-large rotate: false - xy: 679, 514 + xy: 343, 406 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-scrap-wall-large-large +block-scrap-wall-gigantic-medium rotate: false - xy: 721, 556 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-scrap-wall-large-medium - rotate: false - xy: 723, 139 + xy: 1833, 488 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-scrap-wall-large-small +block-scrap-wall-gigantic-small rotate: false - xy: 1859, 322 + xy: 1553, 264 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-scrap-wall-large-tiny +block-scrap-wall-gigantic-tiny rotate: false - xy: 1117, 193 + xy: 1294, 184 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-scrap-wall-large-xlarge +block-scrap-wall-gigantic-xlarge rotate: false xy: 409, 824 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-scrap-wall-medium +block-scrap-wall-huge-large rotate: false - xy: 689, 105 + xy: 343, 364 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-scrap-wall-huge-medium + rotate: false + xy: 1867, 488 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-scrap-wall-small +block-scrap-wall-huge-small rotate: false - xy: 1885, 348 + xy: 1553, 238 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-scrap-wall-tiny +block-scrap-wall-huge-tiny rotate: false - xy: 1045, 121 + xy: 1312, 184 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-scrap-wall-xlarge +block-scrap-wall-huge-xlarge rotate: false xy: 459, 874 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-separator-large +block-scrap-wall-large rotate: false - xy: 763, 598 + xy: 343, 322 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-separator-medium +block-scrap-wall-large-large rotate: false - xy: 723, 105 + xy: 343, 280 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-scrap-wall-large-medium + rotate: false + xy: 1901, 488 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-separator-small +block-scrap-wall-large-small rotate: false - xy: 1885, 322 + xy: 1579, 264 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-separator-tiny +block-scrap-wall-large-tiny rotate: false - xy: 1063, 139 + xy: 1330, 184 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-separator-xlarge +block-scrap-wall-large-xlarge rotate: false xy: 509, 924 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-shale-boulder-large +block-scrap-wall-medium rotate: false - xy: 805, 640 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-shale-boulder-medium - rotate: false - xy: 953, 501 + xy: 1935, 488 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-shale-boulder-small +block-scrap-wall-small rotate: false - xy: 1911, 348 + xy: 1579, 238 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-shale-boulder-tiny +block-scrap-wall-tiny rotate: false - xy: 1081, 157 + xy: 1348, 184 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-shale-boulder-xlarge +block-scrap-wall-xlarge rotate: false xy: 459, 824 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-shale-large +block-separator-large rotate: false - xy: 385, 178 + xy: 343, 238 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-shale-medium +block-separator-medium rotate: false - xy: 949, 467 + xy: 1969, 488 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-shale-small +block-separator-small rotate: false - xy: 1911, 322 + xy: 1605, 264 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-shale-tiny +block-separator-tiny rotate: false - xy: 1099, 175 + xy: 1366, 184 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-shale-xlarge +block-separator-xlarge rotate: false xy: 509, 874 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-shalerocks-large +block-shale-boulder-large rotate: false - xy: 427, 220 + xy: 343, 196 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-shalerocks-medium +block-shale-boulder-medium rotate: false - xy: 945, 433 + xy: 813, 454 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-shalerocks-small +block-shale-boulder-small rotate: false - xy: 1937, 348 + xy: 1605, 238 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-shalerocks-tiny +block-shale-boulder-tiny rotate: false - xy: 1135, 193 + xy: 1384, 184 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-shalerocks-xlarge +block-shale-boulder-xlarge rotate: false xy: 559, 924 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-shock-mine-large +block-shale-large rotate: false - xy: 469, 262 + xy: 343, 154 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-shock-mine-medium +block-shale-medium rotate: false - xy: 1241, 585 + xy: 847, 454 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-shock-mine-small +block-shale-small rotate: false - xy: 1937, 322 + xy: 1631, 264 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-shock-mine-tiny +block-shale-tiny rotate: false - xy: 1063, 121 + xy: 1402, 184 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-shock-mine-xlarge +block-shale-xlarge rotate: false xy: 509, 824 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-shrubs-large +block-shalerocks-large rotate: false - xy: 511, 304 + xy: 343, 112 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-shrubs-medium +block-shalerocks-medium rotate: false - xy: 965, 551 + xy: 881, 454 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-shrubs-small +block-shalerocks-small rotate: false - xy: 1963, 348 + xy: 1631, 238 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-shrubs-tiny +block-shalerocks-tiny rotate: false - xy: 1081, 139 + xy: 1420, 184 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-shrubs-xlarge +block-shalerocks-xlarge rotate: false xy: 559, 874 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-silicon-smelter-large +block-shock-mine-large rotate: false - xy: 553, 346 + xy: 343, 70 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-silicon-smelter-medium +block-shock-mine-medium rotate: false - xy: 999, 551 + xy: 915, 454 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-silicon-smelter-small +block-shock-mine-small rotate: false - xy: 1963, 322 + xy: 1657, 264 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-silicon-smelter-tiny +block-shock-mine-tiny rotate: false - xy: 1099, 157 + xy: 1438, 184 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-silicon-smelter-xlarge +block-shock-mine-xlarge rotate: false xy: 609, 924 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-snow-large +block-shrubs-large rotate: false - xy: 595, 388 + xy: 343, 28 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-snow-medium +block-shrubs-medium rotate: false - xy: 1033, 551 + xy: 949, 454 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-snow-pine-large +block-shrubs-small rotate: false - xy: 637, 430 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-snow-pine-medium - rotate: false - xy: 1067, 551 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-snow-pine-small - rotate: false - xy: 1989, 348 + xy: 1657, 238 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-snow-pine-tiny +block-shrubs-tiny rotate: false - xy: 1117, 175 + xy: 1456, 184 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-snow-pine-xlarge +block-shrubs-xlarge rotate: false xy: 559, 824 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-snow-small +block-silicon-smelter-large rotate: false - xy: 1989, 322 + xy: 393, 556 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-silicon-smelter-medium + rotate: false + xy: 983, 454 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-silicon-smelter-small + rotate: false + xy: 1683, 264 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-snow-tiny +block-silicon-smelter-tiny rotate: false - xy: 1153, 193 + xy: 1474, 184 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-snow-xlarge +block-silicon-smelter-xlarge rotate: false xy: 609, 874 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-snowrock-large +block-snow-large rotate: false - xy: 679, 472 + xy: 435, 556 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-snowrock-medium +block-snow-medium rotate: false - xy: 1101, 551 + xy: 1017, 454 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-snowrock-small +block-snow-pine-large rotate: false - xy: 1785, 296 + xy: 477, 556 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-snow-pine-medium + rotate: false + xy: 1051, 454 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-snow-pine-small + rotate: false + xy: 1683, 238 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-snowrock-tiny +block-snow-pine-tiny rotate: false - xy: 1081, 121 + xy: 1492, 184 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-snowrock-xlarge +block-snow-pine-xlarge rotate: false xy: 659, 924 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-snowrocks-large +block-snow-small rotate: false - xy: 721, 514 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-snowrocks-medium - rotate: false - xy: 1135, 551 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-snowrocks-small - rotate: false - xy: 1785, 270 + xy: 1709, 264 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-snowrocks-tiny +block-snow-tiny rotate: false - xy: 1099, 139 + xy: 1510, 184 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-snowrocks-xlarge +block-snow-xlarge rotate: false xy: 609, 824 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-solar-panel-large +block-snowrock-large rotate: false - xy: 763, 556 + xy: 519, 556 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-solar-panel-large-large +block-snowrock-medium rotate: false - xy: 805, 598 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-solar-panel-large-medium - rotate: false - xy: 1169, 551 + xy: 1085, 454 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-solar-panel-large-small +block-snowrock-small rotate: false - xy: 1811, 296 + xy: 1709, 238 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-solar-panel-large-tiny +block-snowrock-tiny rotate: false - xy: 1117, 157 + xy: 1528, 184 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-solar-panel-large-xlarge +block-snowrock-xlarge rotate: false xy: 659, 874 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-solar-panel-medium +block-snowrocks-large rotate: false - xy: 1203, 551 + xy: 561, 556 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-snowrocks-medium + rotate: false + xy: 1119, 454 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-solar-panel-small +block-snowrocks-small rotate: false - xy: 1785, 244 + xy: 1735, 264 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-solar-panel-tiny +block-snowrocks-tiny rotate: false - xy: 1135, 175 + xy: 1546, 184 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-solar-panel-xlarge +block-snowrocks-xlarge rotate: false xy: 709, 924 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-sorter-large +block-solar-panel-large rotate: false - xy: 847, 640 + xy: 603, 556 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-sorter-medium +block-solar-panel-large-large rotate: false - xy: 1237, 551 + xy: 645, 556 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-solar-panel-large-medium + rotate: false + xy: 1153, 454 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-sorter-small +block-solar-panel-large-small rotate: false - xy: 1811, 270 + xy: 1735, 238 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-sorter-tiny +block-solar-panel-large-tiny rotate: false - xy: 1171, 193 + xy: 1564, 184 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-sorter-xlarge +block-solar-panel-large-xlarge rotate: false xy: 659, 824 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-spawn-large +block-solar-panel-medium rotate: false - xy: 385, 136 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-spawn-medium - rotate: false - xy: 987, 517 + xy: 1187, 454 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-spawn-small +block-solar-panel-small rotate: false - xy: 1837, 296 + xy: 1761, 264 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-spawn-tiny +block-solar-panel-tiny rotate: false - xy: 1099, 121 + xy: 1582, 184 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-spawn-xlarge +block-solar-panel-xlarge rotate: false xy: 709, 874 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-spectre-large +block-sorter-large rotate: false - xy: 427, 178 + xy: 687, 556 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-spectre-medium +block-sorter-medium rotate: false - xy: 1021, 517 + xy: 1221, 454 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-spectre-small +block-sorter-small rotate: false - xy: 1811, 244 + xy: 1761, 238 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-spectre-tiny +block-sorter-tiny rotate: false - xy: 1117, 139 + xy: 1600, 184 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-spectre-xlarge +block-sorter-xlarge rotate: false xy: 759, 924 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-spirit-factory-large +block-spawn-large rotate: false - xy: 469, 220 + xy: 729, 556 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-spirit-factory-medium +block-spawn-medium rotate: false - xy: 1055, 517 + xy: 1255, 454 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-spirit-factory-small +block-spawn-small rotate: false - xy: 1837, 270 + xy: 1787, 264 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-spirit-factory-tiny +block-spawn-tiny rotate: false - xy: 1135, 157 + xy: 1618, 184 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-spirit-factory-xlarge +block-spawn-xlarge rotate: false xy: 709, 824 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-spore-cluster-large +block-spectre-large rotate: false - xy: 511, 262 + xy: 771, 556 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-spore-cluster-medium +block-spectre-medium rotate: false - xy: 1089, 517 + xy: 1289, 454 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-spore-cluster-small +block-spectre-small rotate: false - xy: 1863, 296 + xy: 1787, 238 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-spore-cluster-tiny +block-spectre-tiny rotate: false - xy: 1153, 175 + xy: 1636, 184 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-spore-cluster-xlarge +block-spectre-xlarge rotate: false xy: 759, 874 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-spore-moss-large +block-spirit-factory-large rotate: false - xy: 553, 304 + xy: 813, 556 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-spore-moss-medium +block-spirit-factory-medium rotate: false - xy: 1123, 517 + xy: 1323, 454 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-spore-moss-small +block-spirit-factory-small rotate: false - xy: 1837, 244 + xy: 1813, 264 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-spore-moss-tiny +block-spirit-factory-tiny rotate: false - xy: 1189, 193 + xy: 1654, 184 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-spore-moss-xlarge +block-spirit-factory-xlarge rotate: false xy: 809, 924 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-spore-pine-large +block-spore-cluster-large rotate: false - xy: 595, 346 + xy: 855, 556 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-spore-pine-medium +block-spore-cluster-medium rotate: false - xy: 1157, 517 + xy: 1357, 454 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-spore-pine-small +block-spore-cluster-small rotate: false - xy: 1863, 270 + xy: 1813, 238 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-spore-pine-tiny +block-spore-cluster-tiny rotate: false - xy: 1117, 121 + xy: 1672, 184 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-spore-pine-xlarge +block-spore-cluster-xlarge rotate: false xy: 759, 824 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-spore-press-large +block-spore-moss-large rotate: false - xy: 637, 388 + xy: 897, 556 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-spore-press-medium +block-spore-moss-medium rotate: false - xy: 1191, 517 + xy: 1391, 454 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-spore-press-small +block-spore-moss-small rotate: false - xy: 1889, 296 + xy: 1839, 264 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-spore-press-tiny +block-spore-moss-tiny rotate: false - xy: 1135, 139 + xy: 1690, 184 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-spore-press-xlarge +block-spore-moss-xlarge rotate: false xy: 809, 874 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-sporerocks-large +block-spore-pine-large rotate: false - xy: 679, 430 + xy: 939, 556 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-sporerocks-medium +block-spore-pine-medium rotate: false - xy: 1225, 517 + xy: 1425, 454 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-sporerocks-small +block-spore-pine-small rotate: false - xy: 1863, 244 + xy: 1839, 238 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-sporerocks-tiny +block-spore-pine-tiny rotate: false - xy: 1153, 157 + xy: 1708, 184 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-sporerocks-xlarge +block-spore-pine-xlarge rotate: false xy: 859, 924 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-stone-large +block-spore-press-large rotate: false - xy: 721, 472 + xy: 981, 556 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-stone-medium +block-spore-press-medium rotate: false - xy: 987, 483 + xy: 1459, 454 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-stone-small +block-spore-press-small rotate: false - xy: 1889, 270 + xy: 1865, 264 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-stone-tiny +block-spore-press-tiny rotate: false - xy: 1171, 175 + xy: 1726, 184 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-stone-xlarge +block-spore-press-xlarge rotate: false xy: 809, 824 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-surge-tower-large +block-sporerocks-large rotate: false - xy: 763, 514 + xy: 1023, 556 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-surge-tower-medium +block-sporerocks-medium rotate: false - xy: 1021, 483 + xy: 1493, 454 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-surge-tower-small +block-sporerocks-small rotate: false - xy: 1915, 296 + xy: 1865, 238 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-surge-tower-tiny +block-sporerocks-tiny rotate: false - xy: 1207, 193 + xy: 1744, 184 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-surge-tower-xlarge +block-sporerocks-xlarge rotate: false xy: 859, 874 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-surge-wall-large +block-stone-large rotate: false - xy: 805, 556 + xy: 1065, 556 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-surge-wall-large-large +block-stone-medium rotate: false - xy: 847, 598 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-surge-wall-large-medium - rotate: false - xy: 1055, 483 + xy: 1527, 454 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-surge-wall-large-small +block-stone-small rotate: false - xy: 1889, 244 + xy: 1891, 264 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-surge-wall-large-tiny +block-stone-tiny rotate: false - xy: 1135, 121 + xy: 1762, 184 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-surge-wall-large-xlarge +block-stone-xlarge rotate: false xy: 909, 924 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-surge-wall-medium +block-surge-tower-large rotate: false - xy: 1089, 483 + xy: 1107, 556 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-surge-tower-medium + rotate: false + xy: 1561, 454 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-surge-wall-small +block-surge-tower-small rotate: false - xy: 1915, 270 + xy: 1891, 238 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-surge-wall-tiny +block-surge-tower-tiny rotate: false - xy: 1153, 139 + xy: 1780, 184 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-surge-wall-xlarge +block-surge-tower-xlarge rotate: false xy: 859, 824 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-swarmer-large +block-surge-wall-large rotate: false - xy: 889, 640 + xy: 1149, 556 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-swarmer-medium +block-surge-wall-large-large rotate: false - xy: 1123, 483 + xy: 1191, 556 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-surge-wall-large-medium + rotate: false + xy: 1595, 454 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-swarmer-small +block-surge-wall-large-small rotate: false - xy: 1941, 296 + xy: 1917, 264 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-swarmer-tiny +block-surge-wall-large-tiny rotate: false - xy: 1171, 157 + xy: 1798, 184 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-swarmer-xlarge +block-surge-wall-large-xlarge rotate: false xy: 909, 874 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-tainted-water-large +block-surge-wall-medium rotate: false - xy: 385, 94 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-tainted-water-medium - rotate: false - xy: 1157, 483 + xy: 1629, 454 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-tainted-water-small +block-surge-wall-small rotate: false - xy: 1915, 244 + xy: 1917, 238 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-tainted-water-tiny +block-surge-wall-tiny rotate: false - xy: 1189, 175 + xy: 1816, 184 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-tainted-water-xlarge +block-surge-wall-xlarge rotate: false xy: 959, 924 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-tar-large +block-swarmer-large rotate: false - xy: 427, 136 + xy: 1233, 556 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-tar-medium +block-swarmer-medium rotate: false - xy: 1191, 483 + xy: 1663, 454 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-tar-small +block-swarmer-small rotate: false - xy: 1941, 270 + xy: 1943, 248 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-tar-tiny +block-swarmer-tiny rotate: false - xy: 1225, 193 + xy: 1834, 184 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-tar-xlarge +block-swarmer-xlarge rotate: false xy: 909, 824 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-tau-mech-pad-large +block-tainted-water-large rotate: false - xy: 469, 178 + xy: 1275, 556 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-tau-mech-pad-medium +block-tainted-water-medium rotate: false - xy: 1225, 483 + xy: 1697, 454 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-tau-mech-pad-small +block-tainted-water-small rotate: false - xy: 1967, 296 + xy: 1943, 222 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-tau-mech-pad-tiny +block-tainted-water-tiny rotate: false - xy: 1153, 121 + xy: 1852, 184 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-tau-mech-pad-xlarge +block-tainted-water-xlarge rotate: false xy: 959, 874 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-tendrils-large +block-tar-large rotate: false - xy: 511, 220 + xy: 1317, 556 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-tendrils-medium +block-tar-medium rotate: false - xy: 1259, 517 + xy: 1731, 454 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-tendrils-small +block-tar-small rotate: false - xy: 1941, 244 + xy: 1969, 238 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-tendrils-tiny +block-tar-tiny rotate: false - xy: 1171, 139 + xy: 1870, 184 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-tendrils-xlarge +block-tar-xlarge rotate: false xy: 1009, 924 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-thermal-generator-large +block-tau-mech-pad-large rotate: false - xy: 553, 262 + xy: 1359, 556 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-thermal-generator-medium +block-tau-mech-pad-medium rotate: false - xy: 1259, 483 + xy: 1765, 454 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-thermal-generator-small +block-tau-mech-pad-small rotate: false - xy: 1967, 270 + xy: 1995, 238 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-thermal-generator-tiny +block-tau-mech-pad-tiny rotate: false - xy: 1189, 157 + xy: 1888, 184 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-thermal-generator-xlarge +block-tau-mech-pad-xlarge rotate: false xy: 959, 824 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-thermal-pump-large +block-tendrils-large rotate: false - xy: 595, 304 + xy: 1401, 556 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-thermal-pump-medium +block-tendrils-medium rotate: false - xy: 1271, 551 + xy: 1799, 454 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-thermal-pump-small +block-tendrils-small rotate: false - xy: 1967, 244 + xy: 1969, 212 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-thermal-pump-tiny +block-tendrils-tiny rotate: false - xy: 1207, 175 + xy: 1906, 184 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-thermal-pump-xlarge +block-tendrils-xlarge rotate: false xy: 1009, 874 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-thorium-reactor-large +block-thermal-generator-large rotate: false - xy: 637, 346 + xy: 1443, 556 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-thorium-reactor-medium +block-thermal-generator-medium rotate: false - xy: 983, 449 + xy: 1833, 454 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-thorium-reactor-small +block-thermal-generator-small rotate: false - xy: 1993, 296 + xy: 1995, 212 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-thorium-reactor-tiny +block-thermal-generator-tiny rotate: false - xy: 1243, 193 + xy: 872, 157 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-thorium-reactor-xlarge +block-thermal-generator-xlarge rotate: false xy: 1059, 924 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-thorium-wall-large +block-thermal-pump-large rotate: false - xy: 679, 388 + xy: 1485, 556 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-thorium-wall-large-large +block-thermal-pump-medium rotate: false - xy: 721, 430 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-thorium-wall-large-medium - rotate: false - xy: 1017, 449 + xy: 1867, 454 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-thorium-wall-large-small +block-thermal-pump-small rotate: false - xy: 1993, 270 + xy: 2021, 238 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-thorium-wall-large-tiny +block-thermal-pump-tiny rotate: false - xy: 1171, 121 + xy: 872, 139 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-thorium-wall-large-xlarge +block-thermal-pump-xlarge rotate: false xy: 1009, 824 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-thorium-wall-medium +block-thorium-reactor-large rotate: false - xy: 1051, 449 + xy: 1527, 556 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-thorium-reactor-medium + rotate: false + xy: 1901, 454 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-thorium-wall-small +block-thorium-reactor-small rotate: false - xy: 1993, 244 + xy: 2021, 212 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-thorium-wall-tiny +block-thorium-reactor-tiny rotate: false - xy: 1189, 139 + xy: 872, 121 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-thorium-wall-xlarge +block-thorium-reactor-xlarge rotate: false xy: 1059, 874 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-thruster-large +block-thorium-wall-large rotate: false - xy: 763, 472 + xy: 1569, 556 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-thruster-medium +block-thorium-wall-large-large rotate: false - xy: 1085, 449 + xy: 1611, 556 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-thorium-wall-large-medium + rotate: false + xy: 1935, 454 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-thruster-small +block-thorium-wall-large-small rotate: false - xy: 1785, 218 + xy: 826, 95 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-thruster-tiny +block-thorium-wall-large-tiny rotate: false - xy: 1207, 157 + xy: 870, 103 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-thruster-xlarge +block-thorium-wall-large-xlarge rotate: false xy: 1109, 924 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-titan-factory-large +block-thorium-wall-medium rotate: false - xy: 805, 514 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-titan-factory-medium - rotate: false - xy: 1119, 449 + xy: 1969, 454 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-titan-factory-small +block-thorium-wall-small rotate: false - xy: 1811, 218 + xy: 826, 69 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-titan-factory-tiny +block-thorium-wall-tiny rotate: false - xy: 1225, 175 + xy: 870, 85 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-titan-factory-xlarge +block-thorium-wall-xlarge rotate: false xy: 1059, 824 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-titanium-conveyor-large +block-thruster-large rotate: false - xy: 847, 556 + xy: 1653, 556 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-titanium-conveyor-medium +block-thruster-medium rotate: false - xy: 1153, 449 + xy: 2003, 470 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-titanium-conveyor-small +block-thruster-small rotate: false - xy: 1837, 218 + xy: 826, 43 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-titanium-conveyor-tiny +block-thruster-tiny rotate: false - xy: 1261, 193 + xy: 870, 67 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-titanium-conveyor-xlarge +block-thruster-xlarge rotate: false xy: 1109, 874 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-titanium-wall-large +block-titan-factory-large rotate: false - xy: 889, 598 + xy: 1695, 556 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-titanium-wall-large-large +block-titan-factory-medium rotate: false - xy: 931, 640 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-titanium-wall-large-medium - rotate: false - xy: 1187, 449 + xy: 809, 420 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-titanium-wall-large-small +block-titan-factory-small rotate: false - xy: 1863, 218 + xy: 826, 17 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-titanium-wall-large-tiny +block-titan-factory-tiny rotate: false - xy: 1189, 121 + xy: 870, 49 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-titanium-wall-large-xlarge +block-titan-factory-xlarge rotate: false xy: 1159, 924 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-titanium-wall-medium +block-titanium-conveyor-large rotate: false - xy: 1221, 449 + xy: 1737, 556 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-titanium-conveyor-medium + rotate: false + xy: 843, 420 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-titanium-wall-small +block-titanium-conveyor-small rotate: false - xy: 1889, 218 + xy: 825, 212 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-titanium-wall-tiny +block-titanium-conveyor-tiny rotate: false - xy: 1207, 139 + xy: 870, 31 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-titanium-wall-xlarge +block-titanium-conveyor-xlarge rotate: false xy: 1109, 824 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-trident-ship-pad-large +block-titanium-wall-large rotate: false - xy: 385, 52 + xy: 1779, 556 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-trident-ship-pad-medium +block-titanium-wall-large-large rotate: false - xy: 1255, 449 + xy: 1821, 556 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-titanium-wall-large-medium + rotate: false + xy: 877, 420 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-trident-ship-pad-small +block-titanium-wall-large-small rotate: false - xy: 1915, 218 + xy: 851, 212 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-trident-ship-pad-tiny +block-titanium-wall-large-tiny rotate: false - xy: 1225, 157 + xy: 870, 13 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-trident-ship-pad-xlarge +block-titanium-wall-large-xlarge rotate: false xy: 1159, 874 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-turbine-generator-large +block-titanium-wall-medium rotate: false - xy: 427, 94 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-turbine-generator-medium - rotate: false - xy: 1293, 517 + xy: 911, 420 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-turbine-generator-small +block-titanium-wall-small rotate: false - xy: 1941, 218 + xy: 877, 212 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-turbine-generator-tiny +block-titanium-wall-tiny rotate: false - xy: 1243, 175 + xy: 890, 158 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-turbine-generator-xlarge +block-titanium-wall-xlarge rotate: false xy: 1209, 924 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-unloader-large +block-trident-ship-pad-large rotate: false - xy: 469, 136 + xy: 1863, 556 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-unloader-medium +block-trident-ship-pad-medium rotate: false - xy: 1293, 483 + xy: 945, 420 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-unloader-small +block-trident-ship-pad-small rotate: false - xy: 1967, 218 + xy: 903, 212 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-unloader-tiny +block-trident-ship-pad-tiny rotate: false - xy: 1279, 193 + xy: 890, 140 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-unloader-xlarge +block-trident-ship-pad-xlarge rotate: false xy: 1159, 824 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-vault-large +block-turbine-generator-large rotate: false - xy: 511, 178 + xy: 1905, 556 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-vault-medium +block-turbine-generator-medium rotate: false - xy: 1289, 449 + xy: 979, 420 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-vault-small +block-turbine-generator-small rotate: false - xy: 1993, 218 + xy: 929, 212 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-vault-tiny +block-turbine-generator-tiny rotate: false - xy: 1207, 121 + xy: 908, 158 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-vault-xlarge +block-turbine-generator-xlarge rotate: false xy: 1209, 874 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-water-extractor-large +block-unloader-large rotate: false - xy: 553, 220 + xy: 1947, 556 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-water-extractor-medium +block-unloader-medium rotate: false - xy: 979, 415 + xy: 1013, 420 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-water-extractor-small +block-unloader-small rotate: false - xy: 1779, 192 + xy: 955, 212 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-water-extractor-tiny +block-unloader-tiny rotate: false - xy: 1225, 139 + xy: 890, 122 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-water-extractor-xlarge +block-unloader-xlarge rotate: false xy: 1259, 924 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-water-large +block-vault-large rotate: false - xy: 595, 262 + xy: 385, 514 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-water-medium +block-vault-medium rotate: false - xy: 1013, 415 + xy: 1047, 420 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-water-small +block-vault-small rotate: false - xy: 1779, 166 + xy: 981, 212 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-water-tiny +block-vault-tiny rotate: false - xy: 1243, 157 + xy: 908, 140 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-water-xlarge +block-vault-xlarge rotate: false xy: 1209, 824 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-wave-large +block-water-extractor-large rotate: false - xy: 637, 304 + xy: 385, 472 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-wave-medium +block-water-extractor-medium rotate: false - xy: 1047, 415 + xy: 1081, 420 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-wave-small +block-water-extractor-small rotate: false - xy: 1805, 192 + xy: 1007, 212 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-wave-tiny +block-water-extractor-tiny rotate: false - xy: 1261, 175 + xy: 926, 158 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-wave-xlarge +block-water-extractor-xlarge rotate: false xy: 1259, 874 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-white-tree-dead-large +block-water-large rotate: false - xy: 679, 346 + xy: 427, 514 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-white-tree-dead-medium +block-water-medium rotate: false - xy: 1081, 415 + xy: 1115, 420 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-white-tree-dead-small +block-water-small rotate: false - xy: 1805, 166 + xy: 1033, 212 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-white-tree-dead-tiny +block-water-tiny rotate: false - xy: 1297, 193 + xy: 908, 122 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-white-tree-dead-xlarge +block-water-xlarge rotate: false xy: 1309, 924 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-white-tree-large +block-wave-large rotate: false - xy: 721, 388 + xy: 385, 430 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-white-tree-medium +block-wave-medium rotate: false - xy: 1115, 415 + xy: 1149, 420 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-white-tree-small +block-wave-small rotate: false - xy: 1831, 192 + xy: 1059, 212 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-white-tree-tiny +block-wave-tiny rotate: false - xy: 1225, 121 + xy: 926, 140 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-white-tree-xlarge +block-wave-xlarge rotate: false xy: 1259, 824 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-wraith-factory-large +block-white-tree-dead-large rotate: false - xy: 763, 430 + xy: 427, 472 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-wraith-factory-medium +block-white-tree-dead-medium rotate: false - xy: 1149, 415 + xy: 1183, 420 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-wraith-factory-small +block-white-tree-dead-small rotate: false - xy: 1831, 166 + xy: 1085, 212 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-wraith-factory-tiny +block-white-tree-dead-tiny rotate: false - xy: 1243, 139 + xy: 944, 158 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-wraith-factory-xlarge +block-white-tree-dead-xlarge rotate: false xy: 1309, 874 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 +block-white-tree-large + rotate: false + xy: 469, 514 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-white-tree-medium + rotate: false + xy: 1217, 420 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-white-tree-small + rotate: false + xy: 1111, 212 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-white-tree-tiny + rotate: false + xy: 926, 122 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-white-tree-xlarge + rotate: false + xy: 1359, 924 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-wraith-factory-large + rotate: false + xy: 385, 388 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-wraith-factory-medium + rotate: false + xy: 1251, 420 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-wraith-factory-small + rotate: false + xy: 1137, 212 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-wraith-factory-tiny + rotate: false + xy: 944, 140 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-wraith-factory-xlarge + rotate: false + xy: 1309, 824 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 button rotate: false - xy: 1011, 653 + xy: 385, 243 size: 36, 27 split: 12, 12, 12, 12 orig: 36, 27 @@ -15839,7 +16021,7 @@ button index: -1 button-disabled rotate: false - xy: 847, 527 + xy: 469, 485 size: 36, 27 split: 12, 12, 12, 12 orig: 36, 27 @@ -15847,7 +16029,7 @@ button-disabled index: -1 button-down rotate: false - xy: 889, 569 + xy: 511, 527 size: 36, 27 split: 12, 12, 12, 12 orig: 36, 27 @@ -15855,7 +16037,7 @@ button-down index: -1 button-edge-1 rotate: false - xy: 931, 611 + xy: 385, 359 size: 36, 27 split: 12, 12, 12, 12 orig: 36, 27 @@ -15863,7 +16045,7 @@ button-edge-1 index: -1 button-edge-2 rotate: false - xy: 973, 653 + xy: 427, 417 size: 36, 27 split: 12, 12, 12, 12 orig: 36, 27 @@ -15871,7 +16053,7 @@ button-edge-2 index: -1 button-edge-3 rotate: false - xy: 385, 23 + xy: 469, 456 size: 36, 27 split: 12, 12, 12, 12 orig: 36, 27 @@ -15879,7 +16061,7 @@ button-edge-3 index: -1 button-edge-4 rotate: false - xy: 427, 65 + xy: 549, 527 size: 36, 27 split: 12, 12, 12, 12 orig: 36, 27 @@ -15887,7 +16069,7 @@ button-edge-4 index: -1 button-edge-over-4 rotate: false - xy: 469, 107 + xy: 385, 330 size: 36, 27 split: 12, 12, 12, 12 orig: 36, 27 @@ -15895,7 +16077,7 @@ button-edge-over-4 index: -1 button-over rotate: false - xy: 511, 149 + xy: 427, 388 size: 36, 27 split: 12, 12, 12, 12 orig: 36, 27 @@ -15903,7 +16085,7 @@ button-over index: -1 button-red rotate: false - xy: 553, 191 + xy: 423, 359 size: 36, 27 split: 12, 12, 12, 12 orig: 36, 27 @@ -15911,7 +16093,7 @@ button-red index: -1 button-right rotate: false - xy: 679, 317 + xy: 423, 330 size: 36, 27 split: 12, 12, 12, 12 orig: 36, 27 @@ -15919,7 +16101,7 @@ button-right index: -1 button-right-down rotate: false - xy: 595, 233 + xy: 587, 527 size: 36, 27 split: 12, 12, 12, 12 orig: 36, 27 @@ -15927,7 +16109,7 @@ button-right-down index: -1 button-right-over rotate: false - xy: 637, 275 + xy: 385, 301 size: 36, 27 split: 12, 12, 12, 12 orig: 36, 27 @@ -15935,7 +16117,7 @@ button-right-over index: -1 button-select rotate: false - xy: 1857, 192 + xy: 1163, 212 size: 24, 24 split: 4, 4, 4, 4 orig: 24, 24 @@ -15943,7 +16125,7 @@ button-select index: -1 button-square rotate: false - xy: 805, 459 + xy: 423, 301 size: 36, 27 split: 12, 12, 12, 12 orig: 36, 27 @@ -15951,7 +16133,7 @@ button-square index: -1 button-square-down rotate: false - xy: 721, 359 + xy: 625, 527 size: 36, 27 split: 12, 12, 12, 12 orig: 36, 27 @@ -15959,7 +16141,7 @@ button-square-down index: -1 button-square-over rotate: false - xy: 763, 401 + xy: 385, 272 size: 36, 27 split: 12, 12, 12, 12 orig: 36, 27 @@ -15967,7 +16149,7 @@ button-square-over index: -1 button-trans rotate: false - xy: 847, 498 + xy: 663, 527 size: 36, 27 split: 12, 12, 12, 12 orig: 36, 27 @@ -15975,56 +16157,56 @@ button-trans index: -1 check-disabled rotate: false - xy: 1183, 415 + xy: 1285, 420 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 check-off rotate: false - xy: 1217, 415 + xy: 1319, 420 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 check-on rotate: false - xy: 1251, 415 + xy: 1353, 420 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 check-on-disabled rotate: false - xy: 1285, 415 + xy: 1387, 420 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 check-on-over rotate: false - xy: 1001, 381 + xy: 1421, 420 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 check-over rotate: false - xy: 1035, 381 + xy: 1455, 420 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 clear rotate: false - xy: 1973, 602 + xy: 799, 225 size: 10, 10 orig: 10, 10 offset: 0, 0 index: -1 cursor rotate: false - xy: 1983, 452 + xy: 379, 22 size: 4, 4 orig: 4, 4 offset: 0, 0 @@ -16038,7 +16220,7 @@ discord-banner index: -1 flat-down-base rotate: false - xy: 805, 430 + xy: 423, 272 size: 36, 27 split: 12, 12, 12, 12 orig: 36, 27 @@ -16046,3080 +16228,3136 @@ flat-down-base index: -1 icon-about rotate: false - xy: 1359, 924 + xy: 1359, 874 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 icon-about-small rotate: false - xy: 1069, 381 + xy: 1489, 420 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 icon-about-smaller rotate: false - xy: 1781, 582 + xy: 767, 257 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 icon-about-tiny rotate: false - xy: 1261, 157 + xy: 962, 158 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 icon-add rotate: false - xy: 1309, 824 + xy: 1409, 924 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 icon-add-small rotate: false - xy: 1103, 381 + xy: 1523, 420 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 icon-add-smaller rotate: false - xy: 1813, 582 + xy: 767, 225 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 icon-add-tiny rotate: false - xy: 1279, 175 + xy: 944, 122 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 icon-admin rotate: false - xy: 1359, 874 + xy: 1359, 824 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 icon-admin-badge rotate: false - xy: 1409, 924 + xy: 1409, 874 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 icon-admin-badge-small rotate: false - xy: 1137, 381 + xy: 1557, 420 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 icon-admin-badge-smaller rotate: false - xy: 1845, 582 + xy: 801, 354 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 icon-admin-badge-tiny rotate: false - xy: 1315, 193 + xy: 962, 140 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 icon-admin-small rotate: false - xy: 1171, 381 + xy: 1591, 420 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 icon-admin-smaller rotate: false - xy: 1877, 582 + xy: 801, 322 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 icon-admin-tiny rotate: false - xy: 1243, 121 + xy: 980, 158 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 icon-arrow rotate: false - xy: 1359, 824 + xy: 1459, 924 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 icon-arrow-16 rotate: false - xy: 1359, 824 + xy: 1459, 924 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 icon-arrow-16-small rotate: false - xy: 1205, 381 + xy: 1625, 420 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 icon-arrow-small rotate: false - xy: 1205, 381 + xy: 1625, 420 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 icon-arrow-16-smaller rotate: false - xy: 1909, 582 + xy: 833, 354 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 icon-arrow-smaller rotate: false - xy: 1909, 582 + xy: 833, 354 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 icon-arrow-16-tiny rotate: false - xy: 1261, 139 + xy: 962, 122 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 icon-arrow-tiny rotate: false - xy: 1261, 139 + xy: 962, 122 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 icon-arrow-down rotate: false - xy: 1409, 874 + xy: 1409, 824 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 icon-arrow-down-small rotate: false - xy: 1239, 381 + xy: 1659, 420 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 icon-arrow-down-smaller rotate: false - xy: 1941, 582 + xy: 801, 290 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 icon-arrow-down-tiny rotate: false - xy: 1279, 157 + xy: 980, 140 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 icon-arrow-left rotate: false - xy: 1459, 924 + xy: 1459, 874 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 icon-arrow-left-small rotate: false - xy: 1273, 381 + xy: 1693, 420 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 icon-arrow-left-smaller rotate: false - xy: 1327, 548 + xy: 833, 322 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 icon-arrow-left-tiny rotate: false - xy: 1297, 175 + xy: 998, 158 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 icon-arrow-right rotate: false - xy: 1409, 824 + xy: 1509, 924 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 icon-arrow-right-small rotate: false - xy: 1027, 347 + xy: 1727, 420 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 icon-arrow-right-smaller rotate: false - xy: 1327, 516 + xy: 865, 354 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 icon-arrow-right-tiny rotate: false - xy: 1333, 193 + xy: 980, 122 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 icon-arrow-up rotate: false - xy: 1459, 874 + xy: 1459, 824 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 icon-arrow-up-small rotate: false - xy: 1027, 313 + xy: 1761, 420 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 icon-arrow-up-smaller rotate: false - xy: 1359, 548 + xy: 833, 290 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 icon-arrow-up-tiny rotate: false - xy: 1261, 121 + xy: 998, 140 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 icon-back rotate: false - xy: 1509, 924 + xy: 1509, 874 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 icon-back-small rotate: false - xy: 1061, 347 + xy: 1795, 420 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 icon-back-smaller rotate: false - xy: 1327, 484 + xy: 865, 322 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 icon-back-tiny rotate: false - xy: 1279, 139 + xy: 1016, 158 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 icon-ban rotate: false - xy: 1459, 824 + xy: 1559, 924 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 icon-ban-small rotate: false - xy: 1061, 313 + xy: 1829, 420 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 icon-ban-smaller rotate: false - xy: 1391, 548 + xy: 897, 354 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 icon-ban-tiny rotate: false - xy: 1297, 157 + xy: 998, 122 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 icon-break rotate: false - xy: 1509, 874 + xy: 1509, 824 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 icon-break-small rotate: false - xy: 1095, 347 + xy: 1863, 420 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 icon-break-smaller rotate: false - xy: 1359, 516 + xy: 865, 290 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 icon-break-tiny rotate: false - xy: 1315, 175 + xy: 1016, 140 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 icon-cancel rotate: false - xy: 1559, 924 + xy: 1559, 874 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 icon-cancel-small rotate: false - xy: 1095, 313 + xy: 1897, 420 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 icon-cancel-smaller rotate: false - xy: 1423, 548 + xy: 897, 322 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 icon-cancel-tiny rotate: false - xy: 1351, 193 + xy: 1034, 158 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 icon-quit-tiny rotate: false - xy: 1351, 193 + xy: 1034, 158 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 icon-changelog rotate: false - xy: 1509, 824 + xy: 1609, 924 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 icon-changelog-small rotate: false - xy: 1129, 347 + xy: 1931, 420 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 icon-changelog-smaller rotate: false - xy: 1391, 516 + xy: 929, 354 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 icon-changelog-tiny rotate: false - xy: 1279, 121 + xy: 1016, 122 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 icon-chat rotate: false - xy: 1559, 874 + xy: 1559, 824 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 icon-chat-small rotate: false - xy: 1129, 313 + xy: 1965, 420 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 icon-chat-smaller rotate: false - xy: 1359, 484 + xy: 897, 290 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 icon-chat-tiny rotate: false - xy: 1297, 139 + xy: 1034, 140 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 icon-check rotate: false - xy: 1609, 924 + xy: 1609, 874 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 icon-check-small rotate: false - xy: 1163, 347 + xy: 2003, 436 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 icon-check-smaller rotate: false - xy: 1455, 548 + xy: 929, 322 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 icon-check-tiny rotate: false - xy: 1315, 157 + xy: 1052, 158 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 icon-command-attack rotate: false - xy: 1559, 824 + xy: 1659, 924 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 icon-command-attack-small rotate: false - xy: 1163, 313 + xy: 1999, 402 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 icon-command-attack-smaller rotate: false - xy: 1423, 516 + xy: 961, 354 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 icon-command-attack-tiny rotate: false - xy: 1333, 175 + xy: 1034, 122 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 icon-command-patrol rotate: false - xy: 1609, 874 + xy: 1609, 824 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 icon-command-patrol-small rotate: false - xy: 1197, 347 + xy: 529, 354 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 icon-command-patrol-smaller rotate: false - xy: 1391, 484 + xy: 929, 290 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 icon-command-patrol-tiny rotate: false - xy: 1369, 193 + xy: 1052, 140 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 icon-command-rally rotate: false - xy: 1659, 924 + xy: 1659, 874 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 icon-command-rally-small rotate: false - xy: 1197, 313 + xy: 529, 320 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 icon-command-rally-smaller rotate: false - xy: 1487, 548 + xy: 961, 322 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 icon-command-rally-tiny rotate: false - xy: 1297, 121 + xy: 1070, 158 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 icon-command-retreat rotate: false - xy: 1609, 824 + xy: 1709, 924 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 icon-command-retreat-small rotate: false - xy: 1231, 347 + xy: 533, 388 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 icon-command-retreat-smaller rotate: false - xy: 1455, 516 + xy: 993, 354 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 icon-command-retreat-tiny rotate: false - xy: 1315, 139 + xy: 1052, 122 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 icon-copy rotate: false - xy: 1659, 874 + xy: 1659, 824 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 icon-copy-small rotate: false - xy: 1231, 313 + xy: 529, 286 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 icon-copy-smaller rotate: false - xy: 1423, 484 + xy: 961, 290 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 icon-copy-tiny rotate: false - xy: 1333, 157 + xy: 1070, 140 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 icon-crafting rotate: false - xy: 1709, 924 + xy: 1709, 874 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 icon-crafting-small rotate: false - xy: 1265, 347 + xy: 529, 252 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 icon-crafting-smaller rotate: false - xy: 1519, 548 + xy: 993, 322 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 icon-crafting-tiny rotate: false - xy: 1351, 175 + xy: 1088, 158 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 icon-cursor rotate: false - xy: 1659, 824 + xy: 1759, 924 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 icon-cursor-small rotate: false - xy: 1265, 313 + xy: 529, 218 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 icon-cursor-smaller rotate: false - xy: 1487, 516 + xy: 1025, 354 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 icon-cursor-tiny rotate: false - xy: 1387, 193 + xy: 1070, 122 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 icon-database rotate: false - xy: 1709, 874 + xy: 1709, 824 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 icon-database-small rotate: false - xy: 1053, 279 + xy: 525, 184 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 icon-database-smaller rotate: false - xy: 1455, 484 + xy: 993, 290 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 icon-database-tiny rotate: false - xy: 1315, 121 + xy: 1088, 140 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 icon-defense rotate: false - xy: 1759, 924 + xy: 1759, 874 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 icon-defense-small rotate: false - xy: 1053, 245 + xy: 567, 391 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 icon-defense-smaller rotate: false - xy: 1551, 548 + xy: 1025, 322 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 icon-defense-tiny rotate: false - xy: 1333, 139 + xy: 1106, 158 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 icon-dev-builds rotate: false - xy: 1709, 824 + xy: 1809, 924 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 icon-dev-builds-small rotate: false - xy: 1087, 279 + xy: 601, 391 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 icon-dev-builds-smaller rotate: false - xy: 1519, 516 + xy: 1057, 354 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 icon-dev-builds-tiny rotate: false - xy: 1351, 157 + xy: 1088, 122 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 icon-diagonal rotate: false - xy: 1759, 874 + xy: 1759, 824 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 icon-diagonal-small rotate: false - xy: 1087, 245 + xy: 635, 391 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 icon-diagonal-smaller rotate: false - xy: 1487, 484 + xy: 1025, 290 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 icon-diagonal-tiny rotate: false - xy: 1369, 175 + xy: 1106, 140 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 icon-discord rotate: false - xy: 1809, 924 + xy: 1809, 874 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 icon-discord-small rotate: false - xy: 1121, 279 + xy: 669, 391 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 icon-discord-smaller rotate: false - xy: 1583, 548 + xy: 1057, 322 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 icon-discord-tiny rotate: false - xy: 1405, 193 + xy: 1124, 158 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 icon-distribution rotate: false - xy: 1759, 824 + xy: 1859, 924 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 icon-distribution-small rotate: false - xy: 1121, 245 + xy: 703, 391 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 icon-distribution-smaller rotate: false - xy: 1551, 516 + xy: 1089, 354 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 icon-distribution-tiny rotate: false - xy: 1333, 121 + xy: 1106, 122 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 icon-donate rotate: false - xy: 1809, 874 + xy: 1809, 824 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 icon-donate-small rotate: false - xy: 1155, 279 + xy: 737, 391 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 icon-donate-smaller rotate: false - xy: 1519, 484 + xy: 1057, 290 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 icon-donate-tiny rotate: false - xy: 1351, 139 + xy: 1124, 140 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 icon-dots rotate: false - xy: 1859, 924 + xy: 1859, 874 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 icon-dots-small rotate: false - xy: 1155, 245 + xy: 771, 391 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 icon-dots-smaller rotate: false - xy: 1615, 548 + xy: 1089, 322 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 icon-dots-tiny rotate: false - xy: 1369, 157 + xy: 1142, 158 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 icon-editor rotate: false - xy: 1809, 824 + xy: 1909, 924 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 icon-editor-small rotate: false - xy: 1189, 279 + xy: 521, 150 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 icon-editor-smaller rotate: false - xy: 1583, 516 + xy: 1121, 354 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 icon-editor-tiny rotate: false - xy: 1387, 175 + xy: 1124, 122 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 icon-effect rotate: false - xy: 1859, 874 + xy: 1859, 824 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 icon-effect-small rotate: false - xy: 1189, 245 + xy: 521, 116 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 icon-effect-smaller rotate: false - xy: 1551, 484 + xy: 1089, 290 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 icon-effect-tiny rotate: false - xy: 1423, 193 + xy: 1142, 140 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 icon-elevation rotate: false - xy: 1909, 924 + xy: 1909, 874 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 icon-elevation-small rotate: false - xy: 1223, 279 + xy: 521, 82 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 icon-elevation-smaller rotate: false - xy: 1647, 548 + xy: 1121, 322 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 icon-elevation-tiny rotate: false - xy: 1351, 121 + xy: 1160, 158 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 icon-eraser rotate: false - xy: 1859, 824 + xy: 1959, 924 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 icon-eraser-small rotate: false - xy: 1223, 245 + xy: 521, 48 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 icon-eraser-smaller rotate: false - xy: 1615, 516 + xy: 1153, 354 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 icon-eraser-tiny rotate: false - xy: 1369, 139 + xy: 1142, 122 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 icon-exit rotate: false - xy: 1909, 874 + xy: 1909, 824 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 icon-exit-small rotate: false - xy: 1257, 279 + xy: 521, 14 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 icon-exit-smaller rotate: false - xy: 1583, 484 + xy: 1121, 290 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 icon-exit-tiny rotate: false - xy: 1387, 157 + xy: 1160, 140 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 icon-fdroid rotate: false - xy: 1959, 924 + xy: 1959, 874 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 icon-fdroid-small rotate: false - xy: 1257, 245 + xy: 805, 386 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 icon-fdroid-smaller rotate: false - xy: 1679, 548 + xy: 1153, 322 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 icon-fdroid-tiny rotate: false - xy: 1405, 175 + xy: 1160, 122 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 icon-file rotate: false - xy: 1909, 824 + xy: 1959, 824 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 icon-file-image rotate: false - xy: 1959, 874 + xy: 309, 774 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 icon-file-image-small rotate: false - xy: 1053, 211 + xy: 839, 386 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 icon-file-image-smaller rotate: false - xy: 1647, 516 + xy: 1185, 354 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 icon-file-image-tiny rotate: false - xy: 1441, 193 + xy: 1186, 166 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 icon-file-small rotate: false - xy: 1087, 211 + xy: 873, 386 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 icon-file-smaller rotate: false - xy: 1615, 484 + xy: 1153, 290 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 icon-file-text rotate: false - xy: 1959, 824 + xy: 359, 774 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 icon-file-text-small rotate: false - xy: 1121, 211 + xy: 907, 386 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 icon-file-text-smaller rotate: false - xy: 1711, 548 + xy: 1185, 322 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 icon-file-text-tiny rotate: false - xy: 1369, 121 + xy: 1204, 166 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 icon-file-tiny rotate: false - xy: 1387, 139 + xy: 1222, 166 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 icon-fill rotate: false - xy: 309, 774 + xy: 409, 774 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 icon-fill-small rotate: false - xy: 1155, 211 + xy: 941, 386 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 icon-fill-smaller rotate: false - xy: 1679, 516 + xy: 1217, 354 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 icon-fill-tiny rotate: false - xy: 1405, 157 + xy: 1240, 166 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -icon-floppy - rotate: false - xy: 359, 774 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-floppy-16 - rotate: false - xy: 409, 774 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-floppy-16-small - rotate: false - xy: 1189, 211 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-floppy-16-smaller - rotate: false - xy: 1647, 484 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-floppy-16-tiny - rotate: false - xy: 1423, 175 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-floppy-small - rotate: false - xy: 1223, 211 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-floppy-smaller - rotate: false - xy: 1743, 548 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-floppy-tiny - rotate: false - xy: 1387, 121 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-folder +icon-flip rotate: false xy: 459, 774 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -icon-folder-parent +icon-flip-small + rotate: false + xy: 975, 386 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +icon-flip-smaller + rotate: false + xy: 1185, 290 + size: 30, 30 + orig: 30, 30 + offset: 0, 0 + index: -1 +icon-flip-tiny + rotate: false + xy: 1258, 166 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +icon-floppy rotate: false xy: 509, 774 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -icon-folder-parent-small - rotate: false - xy: 1257, 211 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-folder-parent-smaller - rotate: false - xy: 1711, 516 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-folder-parent-tiny - rotate: false - xy: 1405, 139 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-folder-small - rotate: false - xy: 1307, 381 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-folder-smaller - rotate: false - xy: 1679, 484 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-folder-tiny - rotate: false - xy: 1423, 157 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-github +icon-floppy-16 rotate: false xy: 559, 774 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -icon-github-small +icon-floppy-16-small rotate: false - xy: 1299, 347 + xy: 1009, 386 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -icon-github-smaller +icon-floppy-16-smaller rotate: false - xy: 1743, 516 + xy: 1217, 322 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 -icon-github-tiny +icon-floppy-16-tiny rotate: false - xy: 1441, 175 + xy: 1276, 166 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -icon-google-play +icon-floppy-small + rotate: false + xy: 1043, 386 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +icon-floppy-smaller + rotate: false + xy: 1249, 354 + size: 30, 30 + orig: 30, 30 + offset: 0, 0 + index: -1 +icon-floppy-tiny + rotate: false + xy: 1294, 166 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +icon-folder rotate: false xy: 609, 774 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -icon-google-play-small - rotate: false - xy: 1299, 313 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-google-play-smaller - rotate: false - xy: 1711, 484 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-google-play-tiny - rotate: false - xy: 1405, 121 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-grid +icon-folder-parent rotate: false xy: 659, 774 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -icon-grid-small +icon-folder-parent-small rotate: false - xy: 1291, 279 + xy: 1077, 386 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -icon-grid-smaller +icon-folder-parent-smaller rotate: false - xy: 1743, 484 + xy: 1217, 290 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 -icon-grid-tiny +icon-folder-parent-tiny rotate: false - xy: 1423, 139 + xy: 1312, 166 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -icon-home +icon-folder-small + rotate: false + xy: 1111, 386 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +icon-folder-smaller + rotate: false + xy: 1249, 322 + size: 30, 30 + orig: 30, 30 + offset: 0, 0 + index: -1 +icon-folder-tiny + rotate: false + xy: 1330, 166 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +icon-github rotate: false xy: 709, 774 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -icon-home-small +icon-github-small rotate: false - xy: 1291, 245 + xy: 1145, 386 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -icon-home-smaller +icon-github-smaller rotate: false - xy: 1357, 452 + xy: 1281, 354 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 -icon-home-tiny +icon-github-tiny rotate: false - xy: 1441, 157 + xy: 1348, 166 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -icon-host +icon-google-play rotate: false xy: 759, 774 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -icon-host-small +icon-google-play-small rotate: false - xy: 1291, 211 + xy: 1179, 386 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -icon-host-smaller +icon-google-play-smaller rotate: false - xy: 1389, 452 + xy: 1249, 290 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 -icon-host-tiny +icon-google-play-tiny rotate: false - xy: 1423, 121 + xy: 1366, 166 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -icon-info +icon-grid rotate: false xy: 809, 774 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -icon-info-small +icon-grid-small rotate: false - xy: 1319, 415 + xy: 1213, 386 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -icon-info-smaller +icon-grid-smaller rotate: false - xy: 1421, 452 + xy: 1281, 322 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 -icon-info-tiny +icon-grid-tiny rotate: false - xy: 1441, 139 + xy: 1384, 166 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -icon-itch.io +icon-home rotate: false xy: 859, 774 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -icon-itch.io-small +icon-home-small rotate: false - xy: 1323, 449 + xy: 1247, 386 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -icon-itch.io-smaller +icon-home-smaller rotate: false - xy: 1453, 452 + xy: 1313, 354 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 -icon-itch.io-tiny +icon-home-tiny rotate: false - xy: 1441, 121 + xy: 1402, 166 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -icon-item +icon-host rotate: false xy: 909, 774 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -icon-item-small +icon-host-small rotate: false - xy: 1341, 381 + xy: 1281, 386 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -icon-item-smaller +icon-host-smaller rotate: false - xy: 1485, 452 + xy: 1281, 290 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 -icon-item-tiny +icon-host-tiny rotate: false - xy: 1459, 184 + xy: 1420, 166 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -icon-line +icon-info rotate: false xy: 959, 774 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -icon-line-small +icon-info-small rotate: false - xy: 1333, 347 + xy: 1315, 386 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -icon-line-smaller +icon-info-smaller rotate: false - xy: 1517, 452 + xy: 1313, 322 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 -icon-line-tiny +icon-info-tiny rotate: false - xy: 1459, 166 + xy: 1438, 166 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -icon-link +icon-itch.io rotate: false xy: 1009, 774 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -icon-link-small +icon-itch.io-small rotate: false - xy: 1333, 313 + xy: 1349, 386 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -icon-link-smaller +icon-itch.io-smaller rotate: false - xy: 1549, 452 + xy: 1345, 354 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 -icon-link-tiny +icon-itch.io-tiny rotate: false - xy: 1459, 148 + xy: 1456, 166 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -icon-liquid +icon-item rotate: false xy: 1059, 774 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -icon-liquid-consume +icon-item-small + rotate: false + xy: 1383, 386 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +icon-item-smaller + rotate: false + xy: 1313, 290 + size: 30, 30 + orig: 30, 30 + offset: 0, 0 + index: -1 +icon-item-tiny + rotate: false + xy: 1474, 166 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +icon-line rotate: false xy: 1109, 774 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -icon-liquid-consume-small +icon-line-small rotate: false - xy: 1325, 279 + xy: 1417, 386 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -icon-liquid-consume-smaller +icon-line-smaller rotate: false - xy: 1581, 452 + xy: 1345, 322 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 -icon-liquid-consume-tiny +icon-line-tiny rotate: false - xy: 1459, 130 + xy: 1492, 166 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -icon-liquid-small - rotate: false - xy: 1325, 245 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-liquid-smaller - rotate: false - xy: 1613, 452 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-liquid-tiny - rotate: false - xy: 775, 105 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-load +icon-link rotate: false xy: 1159, 774 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -icon-load-image +icon-link-small + rotate: false + xy: 1451, 386 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +icon-link-smaller + rotate: false + xy: 1377, 354 + size: 30, 30 + orig: 30, 30 + offset: 0, 0 + index: -1 +icon-link-tiny + rotate: false + xy: 1510, 166 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +icon-liquid rotate: false xy: 1209, 774 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -icon-load-image-small - rotate: false - xy: 1325, 211 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-load-image-smaller - rotate: false - xy: 1645, 452 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-load-image-tiny - rotate: false - xy: 793, 105 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-load-map +icon-liquid-consume rotate: false xy: 1259, 774 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -icon-load-map-small +icon-liquid-consume-small rotate: false - xy: 1353, 415 + xy: 1485, 386 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -icon-load-map-smaller +icon-liquid-consume-smaller rotate: false - xy: 1677, 452 + xy: 1345, 290 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 -icon-load-map-tiny +icon-liquid-consume-tiny rotate: false - xy: 757, 95 + xy: 1528, 166 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -icon-load-small +icon-liquid-small rotate: false - xy: 1375, 381 + xy: 1519, 386 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -icon-load-smaller +icon-liquid-smaller rotate: false - xy: 1709, 452 + xy: 1377, 322 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 -icon-load-tiny +icon-liquid-tiny rotate: false - xy: 811, 100 + xy: 1546, 166 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -icon-loading +icon-load rotate: false xy: 1309, 774 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -icon-loading-small - rotate: false - xy: 1367, 347 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-loading-smaller - rotate: false - xy: 1741, 452 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-loading-tiny - rotate: false - xy: 829, 100 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-locked +icon-load-image rotate: false xy: 1359, 774 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -icon-locked-small +icon-load-image-small rotate: false - xy: 1367, 313 + xy: 1553, 386 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -icon-locked-smaller +icon-load-image-smaller rotate: false - xy: 1387, 420 + xy: 1409, 354 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 -icon-locked-tiny +icon-load-image-tiny rotate: false - xy: 847, 100 + xy: 1564, 166 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -icon-map +icon-load-map rotate: false xy: 1409, 774 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -icon-map-small +icon-load-map-small rotate: false - xy: 1359, 279 + xy: 1587, 386 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -icon-map-smaller +icon-load-map-smaller rotate: false - xy: 1419, 420 + xy: 1377, 290 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 -icon-map-tiny +icon-load-map-tiny rotate: false - xy: 865, 100 + xy: 1582, 166 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -icon-menu +icon-load-small + rotate: false + xy: 1621, 386 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +icon-load-smaller + rotate: false + xy: 1409, 322 + size: 30, 30 + orig: 30, 30 + offset: 0, 0 + index: -1 +icon-load-tiny + rotate: false + xy: 1600, 166 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +icon-loading rotate: false xy: 1459, 774 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -icon-menu-large +icon-loading-small + rotate: false + xy: 1655, 386 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +icon-loading-smaller + rotate: false + xy: 1441, 354 + size: 30, 30 + orig: 30, 30 + offset: 0, 0 + index: -1 +icon-loading-tiny + rotate: false + xy: 1618, 166 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +icon-locked rotate: false xy: 1509, 774 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -icon-menu-large-small +icon-locked-small rotate: false - xy: 1359, 245 + xy: 1689, 386 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -icon-menu-large-smaller +icon-locked-smaller rotate: false - xy: 1451, 420 + xy: 1409, 290 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 -icon-menu-large-tiny +icon-locked-tiny rotate: false - xy: 883, 100 + xy: 1636, 166 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -icon-menu-small - rotate: false - xy: 1359, 211 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-menu-smaller - rotate: false - xy: 1483, 420 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-menu-tiny - rotate: false - xy: 901, 100 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-missing +icon-map rotate: false xy: 1559, 774 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -icon-missing-small +icon-map-small rotate: false - xy: 1401, 347 + xy: 1723, 386 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -icon-missing-smaller +icon-map-smaller rotate: false - xy: 1515, 420 + xy: 1441, 322 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 -icon-missing-tiny +icon-map-tiny rotate: false - xy: 919, 100 + xy: 1654, 166 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -icon-mode-attack +icon-menu rotate: false xy: 1609, 774 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -icon-mode-attack-small - rotate: false - xy: 1401, 313 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-mode-attack-smaller - rotate: false - xy: 1547, 420 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-mode-attack-tiny - rotate: false - xy: 937, 100 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-mode-pvp +icon-menu-large rotate: false xy: 1659, 774 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -icon-mode-pvp-small +icon-menu-large-small rotate: false - xy: 1393, 279 + xy: 1757, 386 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -icon-mode-pvp-smaller +icon-menu-large-smaller rotate: false - xy: 1579, 420 + xy: 1473, 354 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 -icon-mode-pvp-tiny +icon-menu-large-tiny rotate: false - xy: 955, 100 + xy: 1672, 166 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -icon-mode-survival +icon-menu-small + rotate: false + xy: 1791, 386 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +icon-menu-smaller + rotate: false + xy: 1441, 290 + size: 30, 30 + orig: 30, 30 + offset: 0, 0 + index: -1 +icon-menu-tiny + rotate: false + xy: 1690, 166 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +icon-missing rotate: false xy: 1709, 774 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -icon-mode-survival-small +icon-missing-small rotate: false - xy: 1393, 245 + xy: 1825, 386 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -icon-mode-survival-smaller +icon-missing-smaller rotate: false - xy: 1611, 420 + xy: 1473, 322 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 -icon-mode-survival-tiny +icon-missing-tiny rotate: false - xy: 973, 100 + xy: 1708, 166 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -icon-none +icon-mode-attack rotate: false xy: 1759, 774 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -icon-none-small +icon-mode-attack-small rotate: false - xy: 1393, 211 + xy: 1859, 386 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -icon-none-smaller +icon-mode-attack-smaller rotate: false - xy: 1643, 420 + xy: 1505, 354 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 -icon-none-tiny +icon-mode-attack-tiny rotate: false - xy: 991, 100 + xy: 1726, 166 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -icon-paste +icon-mode-pvp rotate: false xy: 1809, 774 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -icon-paste-small +icon-mode-pvp-small rotate: false - xy: 1427, 279 + xy: 1893, 386 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -icon-paste-smaller +icon-mode-pvp-smaller rotate: false - xy: 1675, 420 + xy: 1473, 290 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 -icon-paste-tiny +icon-mode-pvp-tiny rotate: false - xy: 1009, 100 + xy: 1744, 166 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -icon-pause +icon-mode-survival rotate: false xy: 1859, 774 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -icon-pause-small +icon-mode-survival-small rotate: false - xy: 1427, 245 + xy: 1927, 386 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -icon-pause-smaller +icon-mode-survival-smaller rotate: false - xy: 1707, 420 + xy: 1505, 322 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 -icon-pause-tiny +icon-mode-survival-tiny rotate: false - xy: 1027, 100 + xy: 1762, 166 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -icon-pencil +icon-none rotate: false xy: 1909, 774 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -icon-pencil-small +icon-none-small rotate: false - xy: 1427, 211 + xy: 1961, 386 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -icon-pencil-smaller +icon-none-smaller rotate: false - xy: 1739, 420 + xy: 1537, 354 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 -icon-pencil-tiny +icon-none-tiny rotate: false - xy: 1045, 103 + xy: 1780, 166 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -icon-pick +icon-paste rotate: false xy: 1959, 774 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -icon-pick-small +icon-paste-small rotate: false - xy: 1275, 614 + xy: 1995, 368 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -icon-pick-smaller +icon-paste-smaller rotate: false - xy: 1409, 388 + xy: 1505, 290 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 -icon-pick-tiny +icon-paste-tiny rotate: false - xy: 1063, 103 + xy: 1798, 166 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -icon-play +icon-pause rotate: false xy: 287, 724 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -icon-play-2 +icon-pause-small + rotate: false + xy: 559, 184 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +icon-pause-smaller + rotate: false + xy: 1537, 322 + size: 30, 30 + orig: 30, 30 + offset: 0, 0 + index: -1 +icon-pause-tiny + rotate: false + xy: 1816, 166 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +icon-pencil rotate: false xy: 337, 724 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -icon-play-2-small +icon-pencil-small rotate: false - xy: 1309, 614 + xy: 555, 150 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -icon-play-2-smaller +icon-pencil-smaller rotate: false - xy: 1441, 388 + xy: 1569, 354 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 -icon-play-2-tiny +icon-pencil-tiny rotate: false - xy: 1081, 103 + xy: 1834, 166 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -icon-play-tiny - rotate: false - xy: 1081, 103 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-play-custom +icon-pick rotate: false xy: 387, 724 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -icon-play-custom-small +icon-pick-small rotate: false - xy: 1343, 614 + xy: 555, 116 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -icon-play-custom-smaller +icon-pick-smaller rotate: false - xy: 1473, 388 + xy: 1537, 290 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 -icon-play-custom-tiny +icon-pick-tiny rotate: false - xy: 1099, 103 + xy: 1852, 166 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -icon-play-small - rotate: false - xy: 1377, 614 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-play-smaller - rotate: false - xy: 1505, 388 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-players +icon-play rotate: false xy: 437, 724 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -icon-players-small - rotate: false - xy: 1411, 614 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-players-smaller - rotate: false - xy: 1537, 388 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-players-tiny - rotate: false - xy: 1117, 103 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-power +icon-play-2 rotate: false xy: 487, 724 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -icon-power-small +icon-play-2-small rotate: false - xy: 1445, 614 + xy: 555, 82 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -icon-power-smaller +icon-play-2-smaller rotate: false - xy: 1569, 388 + xy: 1569, 322 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 -icon-power-tiny +icon-play-2-tiny rotate: false - xy: 1135, 103 + xy: 1870, 166 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -icon-production +icon-play-tiny + rotate: false + xy: 1870, 166 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +icon-play-custom rotate: false xy: 537, 724 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -icon-production-small +icon-play-custom-small rotate: false - xy: 1479, 614 + xy: 555, 48 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -icon-production-smaller +icon-play-custom-smaller rotate: false - xy: 1601, 388 + xy: 1601, 354 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 -icon-production-tiny +icon-play-custom-tiny rotate: false - xy: 1153, 103 + xy: 1888, 166 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -icon-quit +icon-play-small + rotate: false + xy: 555, 14 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +icon-play-smaller + rotate: false + xy: 1569, 290 + size: 30, 30 + orig: 30, 30 + offset: 0, 0 + index: -1 +icon-players rotate: false xy: 587, 724 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -icon-quit-small +icon-players-small rotate: false - xy: 1513, 614 + xy: 563, 354 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -icon-quit-smaller +icon-players-smaller rotate: false - xy: 1633, 388 + xy: 1601, 322 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 -icon-redo +icon-players-tiny + rotate: false + xy: 1906, 166 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +icon-power rotate: false xy: 637, 724 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -icon-redo-small +icon-power-small rotate: false - xy: 1547, 614 + xy: 563, 320 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -icon-redo-smaller +icon-power-smaller rotate: false - xy: 1665, 388 + xy: 1633, 354 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 -icon-redo-tiny +icon-power-tiny rotate: false - xy: 1171, 103 + xy: 1178, 148 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -icon-refresh +icon-production rotate: false xy: 687, 724 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -icon-refresh-small +icon-production-small rotate: false - xy: 1581, 614 + xy: 563, 286 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -icon-refresh-smaller +icon-production-smaller rotate: false - xy: 1697, 388 + xy: 1601, 290 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 -icon-refresh-tiny +icon-production-tiny rotate: false - xy: 1189, 103 + xy: 1178, 130 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -icon-rename +icon-quit rotate: false xy: 737, 724 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -icon-rename-small +icon-quit-small rotate: false - xy: 1615, 614 + xy: 563, 252 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -icon-rename-smaller +icon-quit-smaller rotate: false - xy: 1729, 388 + xy: 1633, 322 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 -icon-rename-tiny - rotate: false - xy: 1207, 103 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-resize +icon-reddit rotate: false xy: 787, 724 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -icon-resize-small +icon-reddit-small rotate: false - xy: 1649, 614 + xy: 563, 218 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -icon-resize-smaller +icon-reddit-smaller rotate: false - xy: 1435, 356 + xy: 1665, 354 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 -icon-resize-tiny +icon-reddit-tiny rotate: false - xy: 1225, 103 + xy: 1196, 148 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -icon-rotate +icon-redo rotate: false xy: 837, 724 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -icon-rotate-arrow +icon-redo-small + rotate: false + xy: 597, 357 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +icon-redo-smaller + rotate: false + xy: 1633, 290 + size: 30, 30 + orig: 30, 30 + offset: 0, 0 + index: -1 +icon-redo-tiny + rotate: false + xy: 1196, 130 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +icon-refresh rotate: false xy: 887, 724 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -icon-rotate-arrow-small +icon-refresh-small rotate: false - xy: 1683, 614 + xy: 631, 357 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -icon-rotate-arrow-smaller +icon-refresh-smaller rotate: false - xy: 1435, 324 + xy: 1665, 322 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 -icon-rotate-arrow-tiny +icon-refresh-tiny rotate: false - xy: 1243, 103 + xy: 1214, 148 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -icon-rotate-left +icon-rename rotate: false xy: 937, 724 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -icon-rotate-left-small +icon-rename-small rotate: false - xy: 1717, 614 + xy: 597, 323 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -icon-rotate-left-smaller +icon-rename-smaller rotate: false - xy: 1467, 356 + xy: 1697, 354 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 -icon-rotate-left-tiny +icon-rename-tiny rotate: false - xy: 1261, 103 + xy: 1214, 130 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -icon-rotate-right +icon-resize rotate: false xy: 987, 724 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -icon-rotate-right-small +icon-resize-small rotate: false - xy: 1751, 614 + xy: 665, 357 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -icon-rotate-right-smaller +icon-resize-smaller rotate: false - xy: 1467, 324 + xy: 1665, 290 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 -icon-rotate-right-tiny +icon-resize-tiny rotate: false - xy: 1279, 103 + xy: 1232, 148 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -icon-rotate-small - rotate: false - xy: 1785, 614 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-rotate-smaller - rotate: false - xy: 1499, 356 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-rotate-tiny - rotate: false - xy: 1297, 103 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-save +icon-rotate rotate: false xy: 1037, 724 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -icon-save-image +icon-rotate-arrow rotate: false xy: 1087, 724 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -icon-save-image-small +icon-rotate-arrow-small rotate: false - xy: 1819, 614 + xy: 597, 289 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -icon-save-image-smaller +icon-rotate-arrow-smaller rotate: false - xy: 1499, 324 + xy: 1697, 322 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 -icon-save-image-tiny +icon-rotate-arrow-tiny rotate: false - xy: 1315, 103 + xy: 1232, 130 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -icon-save-map +icon-rotate-left rotate: false xy: 1137, 724 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -icon-save-map-small +icon-rotate-left-small rotate: false - xy: 1853, 614 + xy: 631, 323 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -icon-save-map-smaller +icon-rotate-left-smaller rotate: false - xy: 1531, 356 + xy: 1729, 354 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 -icon-save-map-tiny +icon-rotate-left-tiny rotate: false - xy: 1333, 103 + xy: 1250, 148 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -icon-save-small - rotate: false - xy: 1887, 614 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-save-smaller - rotate: false - xy: 1531, 324 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-save-tiny - rotate: false - xy: 1351, 103 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-settings +icon-rotate-right rotate: false xy: 1187, 724 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -icon-settings-small +icon-rotate-right-small rotate: false - xy: 1921, 614 + xy: 699, 357 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -icon-settings-smaller +icon-rotate-right-smaller rotate: false - xy: 1563, 356 + xy: 1697, 290 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 -icon-settings-tiny +icon-rotate-right-tiny rotate: false - xy: 1369, 103 + xy: 1250, 130 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -icon-spray +icon-rotate-small + rotate: false + xy: 597, 255 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +icon-rotate-smaller + rotate: false + xy: 1729, 322 + size: 30, 30 + orig: 30, 30 + offset: 0, 0 + index: -1 +icon-rotate-tiny + rotate: false + xy: 1268, 148 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +icon-save rotate: false xy: 1237, 724 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -icon-spray-small - rotate: false - xy: 1955, 614 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-spray-smaller - rotate: false - xy: 1563, 324 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-spray-tiny - rotate: false - xy: 1387, 103 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-terrain +icon-save-image rotate: false xy: 1287, 724 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -icon-terrain-small +icon-save-image-small rotate: false - xy: 1989, 588 + xy: 631, 289 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -icon-terrain-smaller +icon-save-image-smaller rotate: false - xy: 1595, 356 + xy: 1761, 354 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 -icon-terrain-tiny +icon-save-image-tiny rotate: false - xy: 1405, 103 + xy: 1268, 130 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -icon-tools +icon-save-map rotate: false xy: 1337, 724 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -icon-tools-small +icon-save-map-small rotate: false - xy: 1305, 580 + xy: 665, 323 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -icon-tools-smaller +icon-save-map-smaller rotate: false - xy: 1595, 324 + xy: 1729, 290 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 -icon-tools-tiny +icon-save-map-tiny rotate: false - xy: 1423, 103 + xy: 1286, 148 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -icon-trash +icon-save-small + rotate: false + xy: 733, 357 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +icon-save-smaller + rotate: false + xy: 1761, 322 + size: 30, 30 + orig: 30, 30 + offset: 0, 0 + index: -1 +icon-save-tiny + rotate: false + xy: 1286, 130 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +icon-settings rotate: false xy: 1387, 724 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -icon-trash-16 +icon-settings-small + rotate: false + xy: 597, 221 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +icon-settings-smaller + rotate: false + xy: 1793, 354 + size: 30, 30 + orig: 30, 30 + offset: 0, 0 + index: -1 +icon-settings-tiny + rotate: false + xy: 1304, 148 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +icon-spray rotate: false xy: 1437, 724 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -icon-trash-16-small +icon-spray-small rotate: false - xy: 1339, 580 + xy: 631, 255 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -icon-trash-16-smaller +icon-spray-smaller rotate: false - xy: 1627, 356 + xy: 1761, 290 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 -icon-trash-16-tiny +icon-spray-tiny rotate: false - xy: 1441, 103 + xy: 1304, 130 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -icon-trash-small - rotate: false - xy: 1373, 580 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-trash-smaller - rotate: false - xy: 1627, 324 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-trash-tiny - rotate: false - xy: 1459, 112 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-tree +icon-terrain rotate: false xy: 1487, 724 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -icon-tree-small +icon-terrain-small rotate: false - xy: 1407, 580 + xy: 665, 289 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -icon-tree-smaller +icon-terrain-smaller rotate: false - xy: 1659, 356 + xy: 1793, 322 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 -icon-tree-tiny +icon-terrain-tiny rotate: false - xy: 1477, 184 + xy: 1322, 148 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -icon-trello +icon-tools rotate: false xy: 1537, 724 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -icon-trello-small +icon-tools-small rotate: false - xy: 1441, 580 + xy: 699, 323 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -icon-trello-smaller +icon-tools-smaller rotate: false - xy: 1659, 324 + xy: 1825, 354 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 -icon-trello-tiny +icon-tools-tiny rotate: false - xy: 1477, 166 + xy: 1322, 130 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -icon-turret +icon-trash rotate: false xy: 1587, 724 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -icon-turret-small - rotate: false - xy: 1475, 580 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-turret-smaller - rotate: false - xy: 1691, 356 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-turret-tiny - rotate: false - xy: 1477, 148 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -icon-tutorial +icon-trash-16 rotate: false xy: 1637, 724 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -icon-tutorial-small +icon-trash-16-small rotate: false - xy: 1509, 580 + xy: 767, 357 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -icon-tutorial-smaller +icon-trash-16-smaller rotate: false - xy: 1691, 324 + xy: 1793, 290 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 -icon-tutorial-tiny +icon-trash-16-tiny rotate: false - xy: 1477, 130 + xy: 1340, 148 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -icon-undo +icon-trash-small + rotate: false + xy: 631, 221 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +icon-trash-smaller + rotate: false + xy: 1825, 322 + size: 30, 30 + orig: 30, 30 + offset: 0, 0 + index: -1 +icon-trash-tiny + rotate: false + xy: 1340, 130 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +icon-tree rotate: false xy: 1687, 724 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -icon-undo-small +icon-tree-small rotate: false - xy: 1543, 580 + xy: 665, 255 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -icon-undo-smaller +icon-tree-smaller rotate: false - xy: 1723, 356 + xy: 1857, 354 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 -icon-undo-tiny +icon-tree-tiny rotate: false - xy: 1477, 112 + xy: 1358, 148 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -icon-units +icon-trello rotate: false xy: 1737, 724 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -icon-units-small +icon-trello-small rotate: false - xy: 1577, 580 + xy: 699, 289 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -icon-units-smaller +icon-trello-smaller rotate: false - xy: 1723, 324 + xy: 1825, 290 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 -icon-units-tiny +icon-trello-tiny rotate: false - xy: 1495, 190 + xy: 1358, 130 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -icon-unlocks +icon-turret rotate: false xy: 1787, 724 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -icon-unlocks-small +icon-turret-small rotate: false - xy: 1611, 580 + xy: 733, 323 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -icon-unlocks-smaller +icon-turret-smaller rotate: false - xy: 1461, 292 + xy: 1857, 322 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 -icon-unlocks-tiny +icon-turret-tiny rotate: false - xy: 1495, 172 + xy: 1376, 148 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -icon-upgrade +icon-tutorial rotate: false xy: 1837, 724 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -icon-upgrade-small +icon-tutorial-small rotate: false - xy: 1645, 580 + xy: 665, 221 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -icon-upgrade-smaller +icon-tutorial-smaller rotate: false - xy: 1461, 260 + xy: 1889, 354 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 -icon-upgrade-tiny +icon-tutorial-tiny rotate: false - xy: 1495, 154 + xy: 1376, 130 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -icon-wiki +icon-undo rotate: false xy: 1887, 724 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -icon-wiki-small +icon-undo-small rotate: false - xy: 1679, 580 + xy: 699, 255 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -icon-wiki-smaller +icon-undo-smaller rotate: false - xy: 1493, 292 + xy: 1857, 290 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 -icon-wiki-tiny +icon-undo-tiny rotate: false - xy: 1495, 136 + xy: 1394, 148 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -icon-workshop +icon-units rotate: false xy: 1937, 724 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -icon-workshop-small +icon-units-small rotate: false - xy: 1713, 580 + xy: 733, 289 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -icon-workshop-smaller +icon-units-smaller rotate: false - xy: 1461, 228 + xy: 1889, 322 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 -icon-workshop-tiny +icon-units-tiny rotate: false - xy: 1495, 118 + xy: 1394, 130 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -icon-zoom +icon-unlocks rotate: false xy: 301, 674 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 +icon-unlocks-small + rotate: false + xy: 767, 323 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +icon-unlocks-smaller + rotate: false + xy: 1921, 354 + size: 30, 30 + orig: 30, 30 + offset: 0, 0 + index: -1 +icon-unlocks-tiny + rotate: false + xy: 1412, 148 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +icon-upgrade + rotate: false + xy: 301, 624 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +icon-upgrade-small + rotate: false + xy: 699, 221 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +icon-upgrade-smaller + rotate: false + xy: 1889, 290 + size: 30, 30 + orig: 30, 30 + offset: 0, 0 + index: -1 +icon-upgrade-tiny + rotate: false + xy: 1412, 130 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +icon-wiki + rotate: false + xy: 351, 674 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +icon-wiki-small + rotate: false + xy: 733, 255 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +icon-wiki-smaller + rotate: false + xy: 1921, 322 + size: 30, 30 + orig: 30, 30 + offset: 0, 0 + index: -1 +icon-wiki-tiny + rotate: false + xy: 1430, 148 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +icon-workshop + rotate: false + xy: 301, 574 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +icon-workshop-small + rotate: false + xy: 767, 289 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +icon-workshop-smaller + rotate: false + xy: 1953, 354 + size: 30, 30 + orig: 30, 30 + offset: 0, 0 + index: -1 +icon-workshop-tiny + rotate: false + xy: 1430, 130 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +icon-zoom + rotate: false + xy: 351, 624 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 icon-zoom-small rotate: false - xy: 1747, 580 + xy: 733, 221 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 icon-zoom-smaller rotate: false - xy: 1493, 260 + xy: 1921, 290 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 icon-zoom-tiny rotate: false - xy: 1513, 188 + xy: 1448, 148 size: 16, 16 orig: 16, 16 offset: 0, 0 @@ -19133,7 +19371,7 @@ info-banner index: -1 inventory rotate: false - xy: 731, 207 + xy: 828, 170 size: 24, 40 split: 10, 10, 10, 14 orig: 24, 40 @@ -19148,7 +19386,7 @@ nomap index: -1 pane rotate: false - xy: 1049, 653 + xy: 385, 214 size: 36, 27 split: 12, 12, 12, 12 orig: 36, 27 @@ -19156,7 +19394,7 @@ pane index: -1 pane-2 rotate: false - xy: 801, 401 + xy: 701, 527 size: 36, 27 split: 12, 12, 12, 12 orig: 36, 27 @@ -19164,7 +19402,7 @@ pane-2 index: -1 scroll rotate: false - xy: 631, 94 + xy: 854, 175 size: 24, 35 split: 10, 10, 6, 5 orig: 24, 35 @@ -19172,7 +19410,7 @@ scroll index: -1 scroll-horizontal rotate: false - xy: 1239, 656 + xy: 777, 530 size: 35, 24 split: 6, 5, 10, 10 orig: 35, 24 @@ -19180,18 +19418,25 @@ scroll-horizontal index: -1 scroll-knob-horizontal-black rotate: false - xy: 805, 488 + xy: 427, 446 size: 40, 24 orig: 40, 24 offset: 0, 0 index: -1 scroll-knob-vertical-black rotate: false - xy: 605, 81 + xy: 828, 128 size: 24, 40 orig: 24, 40 offset: 0, 0 index: -1 +scroll-knob-vertical-thin + rotate: false + xy: 2035, 762 + size: 12, 40 + orig: 12, 40 + offset: 0, 0 + index: -1 selection rotate: false xy: 309, 974 @@ -19201,28 +19446,28 @@ selection index: -1 slider rotate: false - xy: 1801, 507 + xy: 1186, 202 size: 1, 8 orig: 1, 8 offset: 0, 0 index: -1 slider-knob rotate: false - xy: 1525, 284 + xy: 1953, 314 size: 29, 38 orig: 29, 38 offset: 0, 0 index: -1 slider-knob-down rotate: false - xy: 1556, 284 + xy: 1953, 274 size: 29, 38 orig: 29, 38 offset: 0, 0 index: -1 slider-knob-over rotate: false - xy: 1587, 284 + xy: 589, 144 size: 29, 38 orig: 29, 38 offset: 0, 0 @@ -19236,7 +19481,7 @@ slider-vertical index: -1 underline rotate: false - xy: 1201, 653 + xy: 423, 214 size: 36, 27 split: 12, 12, 12, 12 orig: 36, 27 @@ -19244,7 +19489,7 @@ underline index: -1 underline-2 rotate: false - xy: 1087, 653 + xy: 423, 243 size: 36, 27 split: 12, 12, 12, 12 orig: 36, 27 @@ -19252,7 +19497,7 @@ underline-2 index: -1 underline-disabled rotate: false - xy: 1125, 653 + xy: 739, 527 size: 36, 27 split: 12, 12, 12, 12 orig: 36, 27 @@ -19260,7 +19505,7 @@ underline-disabled index: -1 underline-red rotate: false - xy: 1163, 653 + xy: 385, 185 size: 36, 27 split: 12, 12, 12, 12 orig: 36, 27 @@ -19268,14 +19513,14 @@ underline-red index: -1 whiteui rotate: false - xy: 831, 396 + xy: 809, 525 size: 3, 3 orig: 3, 3 offset: 0, 0 index: -1 window-empty rotate: false - xy: 1775, 517 + xy: 589, 5 size: 27, 61 split: 4, 4, 2, 2 orig: 27, 61 diff --git a/core/assets/sprites/sprites.png b/core/assets/sprites/sprites.png index 6fad68943b..5f1d3d9270 100644 Binary files a/core/assets/sprites/sprites.png and b/core/assets/sprites/sprites.png differ diff --git a/core/assets/sprites/sprites3.png b/core/assets/sprites/sprites3.png index 29773e003b..52ae2755a5 100644 Binary files a/core/assets/sprites/sprites3.png and b/core/assets/sprites/sprites3.png differ diff --git a/core/assets/sprites/sprites5.png b/core/assets/sprites/sprites5.png index f23593b861..43d62c2218 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 e337ac1602..9c6248562c 100644 --- a/core/src/io/anuke/mindustry/ClientLauncher.java +++ b/core/src/io/anuke/mindustry/ClientLauncher.java @@ -11,7 +11,7 @@ import io.anuke.arc.scene.ui.layout.*; import io.anuke.arc.util.*; import io.anuke.arc.util.async.*; import io.anuke.mindustry.core.*; -import io.anuke.mindustry.game.*; +import io.anuke.mindustry.ctype.Content; import io.anuke.mindustry.game.EventType.*; import io.anuke.mindustry.gen.*; import io.anuke.mindustry.graphics.*; diff --git a/core/src/io/anuke/mindustry/Vars.java b/core/src/io/anuke/mindustry/Vars.java index d5c4a980f5..efae707bf8 100644 --- a/core/src/io/anuke/mindustry/Vars.java +++ b/core/src/io/anuke/mindustry/Vars.java @@ -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 824fd11251..a3a776c878 100644 --- a/core/src/io/anuke/mindustry/content/Blocks.java +++ b/core/src/io/anuke/mindustry/content/Blocks.java @@ -7,10 +7,10 @@ import io.anuke.arc.graphics.g2d.*; import io.anuke.arc.math.*; import io.anuke.arc.util.*; import io.anuke.mindustry.*; +import io.anuke.mindustry.ctype.ContentList; import io.anuke.mindustry.entities.*; import io.anuke.mindustry.entities.bullet.*; import io.anuke.mindustry.entities.type.*; -import io.anuke.mindustry.game.*; import io.anuke.mindustry.gen.*; import io.anuke.mindustry.graphics.*; import io.anuke.mindustry.type.*; @@ -52,7 +52,7 @@ public class Blocks implements ContentList{ //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, thoriumWall, thoriumWallLarge, door, doorLarge, + copperWall, copperWallLarge, titaniumWall, titaniumWallLarge, plastaniumWall, plastaniumWallLarge, thoriumWall, thoriumWallLarge, door, doorLarge, phaseWall, phaseWallLarge, surgeWall, surgeWallLarge, mender, mendProjector, overdriveProjector, forceProjector, shockMine, //transport @@ -795,6 +795,19 @@ public class Blocks implements ContentList{ size = 2; }}; + plastaniumWall = new Wall("plastanium-wall"){{ + requirements(Category.defense, ItemStack.with(Items.plastanium, 5, Items.metaglass, 2)); + health = 190 * wallHealthMultiplier; + insulated = true; + }}; + + plastaniumWallLarge = new Wall("plastanium-wall-large"){{ + requirements(Category.defense, ItemStack.mult(plastaniumWall.requirements, 4)); + health = 190 * wallHealthMultiplier * 4; + size = 2; + insulated = true; + }}; + thoriumWall = new Wall("thorium-wall"){{ requirements(Category.defense, ItemStack.with(Items.thorium, 6)); health = 200 * wallHealthMultiplier; @@ -1616,7 +1629,7 @@ public class Blocks implements ContentList{ size = 4; shootShake = 2f; range = 190f; - reload = 50f; + reload = 80f; firingMoveFract = 0.5f; shootDuration = 220f; powerUse = 14f; @@ -1633,7 +1646,7 @@ public class Blocks implements ContentList{ draugFactory = new UnitFactory("draug-factory"){{ requirements(Category.units, ItemStack.with(Items.copper, 30, Items.lead, 70)); - type = UnitTypes.draug; + unitType = UnitTypes.draug; produceTime = 2500; size = 2; maxSpawn = 1; @@ -1643,7 +1656,7 @@ public class Blocks implements ContentList{ spiritFactory = new UnitFactory("spirit-factory"){{ requirements(Category.units, ItemStack.with(Items.metaglass, 45, Items.lead, 55, Items.silicon, 45)); - type = UnitTypes.spirit; + unitType = UnitTypes.spirit; produceTime = 4000; size = 2; maxSpawn = 1; @@ -1653,7 +1666,7 @@ public class Blocks implements ContentList{ phantomFactory = new UnitFactory("phantom-factory"){{ requirements(Category.units, ItemStack.with(Items.titanium, 50, Items.thorium, 60, Items.lead, 65, Items.silicon, 105)); - type = UnitTypes.phantom; + unitType = UnitTypes.phantom; produceTime = 4400; size = 2; maxSpawn = 1; @@ -1670,7 +1683,7 @@ public class Blocks implements ContentList{ wraithFactory = new UnitFactory("wraith-factory"){{ requirements(Category.units, ItemStack.with(Items.titanium, 30, Items.lead, 40, Items.silicon, 45)); - type = UnitTypes.wraith; + unitType = UnitTypes.wraith; produceTime = 700; size = 2; consumes.power(0.5f); @@ -1679,7 +1692,7 @@ public class Blocks implements ContentList{ ghoulFactory = new UnitFactory("ghoul-factory"){{ requirements(Category.units, ItemStack.with(Items.titanium, 75, Items.lead, 65, Items.silicon, 110)); - type = UnitTypes.ghoul; + unitType = UnitTypes.ghoul; produceTime = 1150; size = 3; maxSpawn = 2; @@ -1689,7 +1702,7 @@ public class Blocks implements ContentList{ revenantFactory = new UnitFactory("revenant-factory"){{ requirements(Category.units, ItemStack.with(Items.plastanium, 50, Items.titanium, 150, Items.lead, 150, Items.silicon, 200)); - type = UnitTypes.revenant; + unitType = UnitTypes.revenant; produceTime = 2000; size = 4; maxSpawn = 2; @@ -1699,7 +1712,7 @@ public class Blocks implements ContentList{ daggerFactory = new UnitFactory("dagger-factory"){{ requirements(Category.units, ItemStack.with(Items.lead, 55, Items.silicon, 35)); - type = UnitTypes.dagger; + unitType = UnitTypes.dagger; produceTime = 850; size = 2; consumes.power(0.5f); @@ -1708,7 +1721,7 @@ public class Blocks implements ContentList{ crawlerFactory = new UnitFactory("crawler-factory"){{ requirements(Category.units, ItemStack.with(Items.lead, 45, Items.silicon, 30)); - type = UnitTypes.crawler; + unitType = UnitTypes.crawler; produceTime = 300; size = 2; maxSpawn = 6; @@ -1718,7 +1731,7 @@ public class Blocks implements ContentList{ titanFactory = new UnitFactory("titan-factory"){{ requirements(Category.units, ItemStack.with(Items.graphite, 50, Items.lead, 50, Items.silicon, 45)); - type = UnitTypes.titan; + unitType = UnitTypes.titan; produceTime = 1050; size = 3; consumes.power(0.60f); @@ -1727,7 +1740,7 @@ public class Blocks implements ContentList{ fortressFactory = new UnitFactory("fortress-factory"){{ requirements(Category.units, ItemStack.with(Items.thorium, 40, Items.lead, 110, Items.silicon, 75)); - type = UnitTypes.fortress; + unitType = UnitTypes.fortress; produceTime = 2000; size = 3; maxSpawn = 3; diff --git a/core/src/io/anuke/mindustry/content/Bullets.java b/core/src/io/anuke/mindustry/content/Bullets.java index 31afc7e5b1..b90de2d1b8 100644 --- a/core/src/io/anuke/mindustry/content/Bullets.java +++ b/core/src/io/anuke/mindustry/content/Bullets.java @@ -4,11 +4,11 @@ import io.anuke.arc.graphics.*; import io.anuke.arc.graphics.g2d.*; import io.anuke.arc.math.*; import io.anuke.arc.util.*; +import io.anuke.mindustry.ctype.ContentList; import io.anuke.mindustry.entities.*; import io.anuke.mindustry.entities.bullet.*; import io.anuke.mindustry.entities.effect.*; import io.anuke.mindustry.entities.type.*; -import io.anuke.mindustry.game.*; import io.anuke.mindustry.graphics.*; import io.anuke.mindustry.world.*; diff --git a/core/src/io/anuke/mindustry/content/Fx.java b/core/src/io/anuke/mindustry/content/Fx.java index 95206e1204..262773e9e9 100644 --- a/core/src/io/anuke/mindustry/content/Fx.java +++ b/core/src/io/anuke/mindustry/content/Fx.java @@ -5,12 +5,13 @@ import io.anuke.arc.graphics.*; import io.anuke.arc.graphics.g2d.*; import io.anuke.arc.math.*; import io.anuke.arc.util.*; +import io.anuke.mindustry.ctype.ContentList; import io.anuke.mindustry.entities.Effects.*; import io.anuke.mindustry.entities.effect.GroundEffectEntity.*; import io.anuke.mindustry.entities.type.*; -import io.anuke.mindustry.game.*; import io.anuke.mindustry.graphics.*; import io.anuke.mindustry.type.*; +import io.anuke.mindustry.ui.Cicon; import static io.anuke.mindustry.Vars.tilesize; diff --git a/core/src/io/anuke/mindustry/content/Items.java b/core/src/io/anuke/mindustry/content/Items.java index f367c9656c..77c88c651b 100644 --- a/core/src/io/anuke/mindustry/content/Items.java +++ b/core/src/io/anuke/mindustry/content/Items.java @@ -1,7 +1,7 @@ package io.anuke.mindustry.content; import io.anuke.arc.graphics.Color; -import io.anuke.mindustry.game.ContentList; +import io.anuke.mindustry.ctype.ContentList; import io.anuke.mindustry.type.Item; import io.anuke.mindustry.type.ItemType; diff --git a/core/src/io/anuke/mindustry/content/Liquids.java b/core/src/io/anuke/mindustry/content/Liquids.java index 17cc695c0e..3dccc3d7e6 100644 --- a/core/src/io/anuke/mindustry/content/Liquids.java +++ b/core/src/io/anuke/mindustry/content/Liquids.java @@ -1,7 +1,7 @@ package io.anuke.mindustry.content; import io.anuke.arc.graphics.Color; -import io.anuke.mindustry.game.ContentList; +import io.anuke.mindustry.ctype.ContentList; import io.anuke.mindustry.type.Liquid; public class Liquids implements ContentList{ @@ -26,6 +26,7 @@ public class Liquids implements ContentList{ flammability = 1.2f; explosiveness = 1.2f; heatCapacity = 0.7f; + barColor = Color.valueOf("6b675f"); effect = StatusEffects.tarred; }}; diff --git a/core/src/io/anuke/mindustry/content/Loadouts.java b/core/src/io/anuke/mindustry/content/Loadouts.java index a9c7f5bc3f..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.game.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 e58c3ffd5f..5c6909f665 100644 --- a/core/src/io/anuke/mindustry/content/Mechs.java +++ b/core/src/io/anuke/mindustry/content/Mechs.java @@ -6,11 +6,11 @@ import io.anuke.arc.graphics.g2d.*; import io.anuke.arc.math.*; import io.anuke.arc.util.*; import io.anuke.mindustry.*; +import io.anuke.mindustry.ctype.ContentList; import io.anuke.mindustry.entities.*; import io.anuke.mindustry.entities.bullet.*; import io.anuke.mindustry.entities.effect.*; import io.anuke.mindustry.entities.type.*; -import io.anuke.mindustry.game.*; import io.anuke.mindustry.gen.*; import io.anuke.mindustry.graphics.*; import io.anuke.mindustry.type.*; @@ -38,7 +38,7 @@ public class Mechs implements ContentList{ weapon = new Weapon("vanguard-blaster"){{ length = 1.5f; reload = 30f; - roundrobin = true; + alternate = true; inaccuracy = 6f; velocityRnd = 0.1f; ejectEffect = Fx.none; @@ -81,7 +81,7 @@ public class Mechs implements ContentList{ shake = 2f; length = 1f; reload = 70f; - roundrobin = true; + alternate = true; bullet = Bullets.lancerLaser; recoil = 4f; shootSound = Sounds.spark; @@ -120,7 +120,7 @@ public class Mechs implements ContentList{ length = 1.5f; reload = 10f; width = 4f; - roundrobin = true; + alternate = true; bullet = Bullets.basicFlame; }}; } @@ -150,7 +150,7 @@ public class Mechs implements ContentList{ weapon = new Weapon("heal-blaster"){{ length = 1.5f; reload = 24f; - roundrobin = false; + alternate = false; ejectEffect = Fx.none; recoil = 2f; bullet = Bullets.healBullet; @@ -202,7 +202,7 @@ public class Mechs implements ContentList{ shots = 4; spacing = 8f; inaccuracy = 8f; - roundrobin = true; + alternate = true; ejectEffect = Fx.none; shake = 3f; bullet = Bullets.missileSwarm; @@ -228,7 +228,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); } @@ -266,7 +266,7 @@ public class Mechs implements ContentList{ weapon = new Weapon("blaster"){{ length = 1.5f; reload = 15f; - roundrobin = true; + alternate = true; ejectEffect = Fx.shellEjectSmall; bullet = Bullets.standardCopper; }}; @@ -291,7 +291,7 @@ public class Mechs implements ContentList{ reload = 70f; shots = 4; inaccuracy = 2f; - roundrobin = true; + alternate = true; ejectEffect = Fx.none; velocityRnd = 0.2f; spacing = 1f; @@ -356,7 +356,7 @@ public class Mechs implements ContentList{ shots = 2; shotDelay = 1f; shots = 8; - roundrobin = true; + alternate = true; ejectEffect = Fx.none; velocityRnd = 1f; inaccuracy = 20f; @@ -394,7 +394,7 @@ public class Mechs implements ContentList{ weapon = new Weapon("bomber"){{ length = 1.5f; reload = 13f; - roundrobin = true; + alternate = true; ejectEffect = Fx.shellEjectSmall; bullet = Bullets.standardGlaive; shootSound = Sounds.shootSnap; diff --git a/core/src/io/anuke/mindustry/content/StatusEffects.java b/core/src/io/anuke/mindustry/content/StatusEffects.java index e4ed8a921b..c4342ec82c 100644 --- a/core/src/io/anuke/mindustry/content/StatusEffects.java +++ b/core/src/io/anuke/mindustry/content/StatusEffects.java @@ -3,7 +3,7 @@ package io.anuke.mindustry.content; import io.anuke.arc.*; import io.anuke.arc.math.Mathf; import io.anuke.mindustry.entities.Effects; -import io.anuke.mindustry.game.ContentList; +import io.anuke.mindustry.ctype.ContentList; import io.anuke.mindustry.game.EventType.*; import io.anuke.mindustry.type.StatusEffect; diff --git a/core/src/io/anuke/mindustry/content/TechTree.java b/core/src/io/anuke/mindustry/content/TechTree.java index 2ab337bf44..45723688dc 100644 --- a/core/src/io/anuke/mindustry/content/TechTree.java +++ b/core/src/io/anuke/mindustry/content/TechTree.java @@ -1,7 +1,7 @@ package io.anuke.mindustry.content; import io.anuke.arc.collection.Array; -import io.anuke.mindustry.game.ContentList; +import io.anuke.mindustry.ctype.ContentList; import io.anuke.mindustry.type.ItemStack; import io.anuke.mindustry.world.Block; @@ -104,6 +104,11 @@ public class TechTree implements ContentList{ node(door, () -> { node(doorLarge); }); + node(plastaniumWall, () -> { + node(plastaniumWallLarge, () -> { + + }); + }); node(titaniumWallLarge); node(thoriumWall, () -> { node(thoriumWallLarge); diff --git a/core/src/io/anuke/mindustry/content/TypeIDs.java b/core/src/io/anuke/mindustry/content/TypeIDs.java index faf82ed359..2e3f6347b1 100644 --- a/core/src/io/anuke/mindustry/content/TypeIDs.java +++ b/core/src/io/anuke/mindustry/content/TypeIDs.java @@ -3,8 +3,8 @@ package io.anuke.mindustry.content; import io.anuke.mindustry.entities.effect.Fire; import io.anuke.mindustry.entities.effect.Puddle; import io.anuke.mindustry.entities.type.Player; -import io.anuke.mindustry.game.ContentList; -import io.anuke.mindustry.game.TypeID; +import io.anuke.mindustry.ctype.ContentList; +import io.anuke.mindustry.type.TypeID; public class TypeIDs implements ContentList{ public static TypeID fire, puddle, player; diff --git a/core/src/io/anuke/mindustry/content/UnitTypes.java b/core/src/io/anuke/mindustry/content/UnitTypes.java index c472d9de93..35eb9890bd 100644 --- a/core/src/io/anuke/mindustry/content/UnitTypes.java +++ b/core/src/io/anuke/mindustry/content/UnitTypes.java @@ -1,11 +1,11 @@ package io.anuke.mindustry.content; import io.anuke.arc.collection.*; +import io.anuke.mindustry.ctype.ContentList; import io.anuke.mindustry.entities.bullet.*; import io.anuke.mindustry.entities.type.*; import io.anuke.mindustry.entities.type.Bullet; import io.anuke.mindustry.entities.type.base.*; -import io.anuke.mindustry.game.*; import io.anuke.mindustry.gen.*; import io.anuke.mindustry.type.*; @@ -41,11 +41,11 @@ public class UnitTypes implements ContentList{ health = 100; engineSize = 1.8f; engineOffset = 5.7f; - weapon = new Weapon("heal-blaster"){{ + weapon = new Weapon(){{ length = 1.5f; reload = 40f; width = 0.5f; - roundrobin = true; + alternate = true; ejectEffect = Fx.none; recoil = 2f; bullet = Bullets.healBulletBig; @@ -65,11 +65,11 @@ public class UnitTypes implements ContentList{ buildPower = 0.4f; engineOffset = 6.5f; toMine = ObjectSet.with(Items.lead, Items.copper, Items.titanium); - weapon = new Weapon("heal-blaster"){{ + weapon = new Weapon(){{ length = 1.5f; reload = 20f; width = 0.5f; - roundrobin = true; + alternate = true; ejectEffect = Fx.none; recoil = 2f; bullet = Bullets.healBullet; @@ -86,7 +86,7 @@ public class UnitTypes implements ContentList{ weapon = new Weapon("chain-blaster"){{ length = 1.5f; reload = 28f; - roundrobin = true; + alternate = true; ejectEffect = Fx.shellEjectSmall; bullet = Bullets.standardCopper; }}; @@ -99,7 +99,7 @@ public class UnitTypes implements ContentList{ hitsize = 8f; mass = 1.75f; health = 120; - weapon = new Weapon("bomber"){{ + weapon = new Weapon(){{ reload = 12f; ejectEffect = Fx.none; shootSound = Sounds.explosion; @@ -138,7 +138,7 @@ public class UnitTypes implements ContentList{ length = 1f; reload = 14f; range = 30f; - roundrobin = true; + alternate = true; recoil = 1f; ejectEffect = Fx.none; bullet = Bullets.basicFlame; @@ -158,7 +158,7 @@ public class UnitTypes implements ContentList{ length = 1f; reload = 60f; width = 10f; - roundrobin = true; + alternate = true; recoil = 4f; shake = 2f; ejectEffect = Fx.shellEjectMedium; @@ -180,7 +180,7 @@ public class UnitTypes implements ContentList{ weapon = new Weapon("eruption"){{ length = 3f; reload = 10f; - roundrobin = true; + alternate = true; ejectEffect = Fx.none; bullet = Bullets.eruptorShot; recoil = 1f; @@ -201,7 +201,7 @@ public class UnitTypes implements ContentList{ length = 8f; reload = 50f; width = 17f; - roundrobin = true; + alternate = true; recoil = 3f; shake = 2f; shots = 4; @@ -225,7 +225,7 @@ public class UnitTypes implements ContentList{ length = 13f; reload = 30f; width = 22f; - roundrobin = true; + alternate = true; recoil = 3f; shake = 2f; inaccuracy = 3f; @@ -247,10 +247,10 @@ public class UnitTypes implements ContentList{ health = 75; engineOffset = 5.5f; range = 140f; - weapon = new Weapon("chain-blaster"){{ + weapon = new Weapon(){{ length = 1.5f; reload = 28f; - roundrobin = true; + alternate = true; ejectEffect = Fx.shellEjectSmall; bullet = Bullets.standardCopper; shootSound = Sounds.shoot; @@ -267,11 +267,11 @@ public class UnitTypes implements ContentList{ targetAir = false; engineOffset = 7.8f; range = 140f; - weapon = new Weapon("bomber"){{ + weapon = new Weapon(){{ length = 0f; width = 2f; reload = 12f; - roundrobin = true; + alternate = true; ejectEffect = Fx.none; velocityRnd = 1f; inaccuracy = 40f; @@ -303,7 +303,7 @@ public class UnitTypes implements ContentList{ width = 10f; shots = 2; inaccuracy = 2f; - roundrobin = true; + alternate = true; ejectEffect = Fx.none; velocityRnd = 0.2f; spacing = 1f; @@ -336,7 +336,7 @@ public class UnitTypes implements ContentList{ shootCone = 100f; shotDelay = 2; inaccuracy = 10f; - roundrobin = true; + alternate = true; ejectEffect = Fx.none; velocityRnd = 0.2f; spacing = 1f; @@ -369,7 +369,7 @@ public class UnitTypes implements ContentList{ shake = 1f; inaccuracy = 3f; - roundrobin = true; + alternate = true; ejectEffect = Fx.none; bullet = new BasicBulletType(7f, 42, "bullet"){ { diff --git a/core/src/io/anuke/mindustry/content/Zones.java b/core/src/io/anuke/mindustry/content/Zones.java index 90794dd80e..6c4932e814 100644 --- a/core/src/io/anuke/mindustry/content/Zones.java +++ b/core/src/io/anuke/mindustry/content/Zones.java @@ -1,5 +1,6 @@ package io.anuke.mindustry.content; +import io.anuke.mindustry.ctype.ContentList; import io.anuke.mindustry.game.*; import io.anuke.mindustry.game.Objectives.*; import io.anuke.mindustry.maps.generators.*; diff --git a/core/src/io/anuke/mindustry/core/ContentLoader.java b/core/src/io/anuke/mindustry/core/ContentLoader.java index 77ed6f219f..bc4d0dac81 100644 --- a/core/src/io/anuke/mindustry/core/ContentLoader.java +++ b/core/src/io/anuke/mindustry/core/ContentLoader.java @@ -1,12 +1,13 @@ 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.*; +import io.anuke.mindustry.ctype.*; import io.anuke.mindustry.entities.bullet.*; -import io.anuke.mindustry.game.*; +import io.anuke.mindustry.mod.Mods.*; import io.anuke.mindustry.type.*; import io.anuke.mindustry.world.*; @@ -23,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(), @@ -104,13 +105,20 @@ 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()]){ - //TODO catch error and display it per mod - callable.accept(content); + try{ + callable.get(content); + }catch(Throwable e){ + if(content.mod != null){ + mods.handleError(new ModLoadException(content, e), content.mod); + }else{ + throw new RuntimeException(e); + } + } } } 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 d4fe3a4dc6..a3f87727de 100644 --- a/core/src/io/anuke/mindustry/core/Logic.java +++ b/core/src/io/anuke/mindustry/core/Logic.java @@ -5,6 +5,7 @@ import io.anuke.arc.*; import io.anuke.arc.util.*; import io.anuke.mindustry.content.*; import io.anuke.mindustry.core.GameState.*; +import io.anuke.mindustry.ctype.UnlockableContent; import io.anuke.mindustry.entities.*; import io.anuke.mindustry.entities.type.*; import io.anuke.mindustry.game.EventType.*; @@ -17,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.*; /** @@ -78,13 +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); - if(b.x == event.tile.x && b.y == event.tile.y){ - data.brokenBlocks.removeIndex(i); - break; + 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))){ + it.remove(); } } } diff --git a/core/src/io/anuke/mindustry/core/NetClient.java b/core/src/io/anuke/mindustry/core/NetClient.java index 911bb4ada4..a3b85facb0 100644 --- a/core/src/io/anuke/mindustry/core/NetClient.java +++ b/core/src/io/anuke/mindustry/core/NetClient.java @@ -15,14 +15,15 @@ import io.anuke.mindustry.entities.*; 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.game.EventType.*; import io.anuke.mindustry.gen.*; import io.anuke.mindustry.net.Administration.*; import io.anuke.mindustry.net.Net.*; import io.anuke.mindustry.net.*; import io.anuke.mindustry.net.Packets.*; import io.anuke.mindustry.type.*; +import io.anuke.mindustry.type.TypeID; import io.anuke.mindustry.world.*; import io.anuke.mindustry.world.modules.*; @@ -198,6 +199,15 @@ public class NetClient implements ApplicationListener{ return "[#" + player.color.toString().toUpperCase() + "]" + name; } + @Remote(called = Loc.client, variants = Variant.one) + public static void onConnect(String ip, int port){ + netClient.disconnectQuietly(); + state.set(State.menu); + logic.reset(); + + ui.join.connect(ip, port); + } + @Remote(targets = Loc.client) public static void onPing(Player player, long time){ Call.onPingResponse(player.con, time); @@ -245,6 +255,11 @@ public class NetClient implements ApplicationListener{ ui.showText("", message); } + @Remote(variants = Variant.both) + public static void onSetRules(Rules rules){ + state.rules = rules; + } + @Remote(variants = Variant.both) public static void onWorldDataBegin(){ entities.clear(); @@ -456,7 +471,7 @@ public class NetClient implements ApplicationListener{ player.pointerX, player.pointerY, player.rotation, player.baseRotation, player.velocity().x, player.velocity().y, player.getMineTile(), - player.isBoosting, player.isShooting, ui.chatfrag.chatOpen(), + player.isBoosting, player.isShooting, ui.chatfrag.chatOpen(), player.isBuilding, requests, Core.camera.position.x, Core.camera.position.y, Core.camera.width * viewScale, Core.camera.height * viewScale); @@ -479,4 +494,4 @@ public class NetClient implements ApplicationListener{ return result; } } -} \ No newline at end of file +} diff --git a/core/src/io/anuke/mindustry/core/NetServer.java b/core/src/io/anuke/mindustry/core/NetServer.java index 6bae988f24..437cb10d57 100644 --- a/core/src/io/anuke/mindustry/core/NetServer.java +++ b/core/src/io/anuke/mindustry/core/NetServer.java @@ -331,6 +331,8 @@ public class NetServer implements ApplicationListener{ player.sendMessage("[scarlet]Did you really expect to be able to kick an admin?"); }else if(found.isLocal){ player.sendMessage("[scarlet]Local players cannot be kicked."); + }else if(found.getTeam() != player.getTeam()){ + player.sendMessage("[scarlet]Only players on your team can be kicked."); }else{ if(!vtime.get()){ player.sendMessage("[scarlet]You must wait " + voteTime/60 + " minutes between votekicks."); @@ -450,7 +452,7 @@ public class NetServer implements ApplicationListener{ float rotation, float baseRotation, float xVelocity, float yVelocity, Tile mining, - boolean boosting, boolean shooting, boolean chatting, + boolean boosting, boolean shooting, boolean chatting, boolean building, BuildRequest[] requests, float viewX, float viewY, float viewWidth, float viewHeight ){ @@ -477,6 +479,7 @@ public class NetServer implements ApplicationListener{ player.isTyping = chatting; player.isBoosting = boosting; player.isShooting = shooting; + player.isBuilding = building; player.buildQueue().clear(); for(BuildRequest req : requests){ if(req == null) continue; diff --git a/core/src/io/anuke/mindustry/core/Platform.java b/core/src/io/anuke/mindustry/core/Platform.java index c2fad7a15f..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.*; @@ -72,11 +72,6 @@ public interface Platform{ default void updateRPC(){ } - /** Whether donating is supported. */ - default boolean canDonate(){ - return false; - } - /** Must be a base64 string 8 bytes in length. */ default String getUUID(){ String uuid = Core.settings.getString("uuid", ""); @@ -101,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 c358c846a4..0803cab883 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.*; @@ -22,6 +22,7 @@ import io.anuke.mindustry.game.*; import io.anuke.mindustry.game.EventType.*; import io.anuke.mindustry.graphics.*; import io.anuke.mindustry.input.*; +import io.anuke.mindustry.ui.Cicon; import io.anuke.mindustry.world.blocks.defense.ForceProjector.*; import static io.anuke.arc.Core.*; @@ -238,7 +239,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); @@ -332,19 +333,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 107971e414..2e86ba1c33 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.*; @@ -279,7 +279,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 +296,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 +304,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,9 +404,9 @@ 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(500f).wrap().pad(4f).get().setAlignment(Align.center, Align.center); + dialog.cont.add(text).width(mobile ? 400f : 500f).wrap().pad(4f).get().setAlignment(Align.center, Align.center); dialog.buttons.defaults().size(200f, 54f).pad(2f); dialog.setFillParent(false); dialog.buttons.addButton("$cancel", dialog::hide); @@ -429,7 +429,7 @@ public class UI implements ApplicationListener, Loadable{ public void showCustomConfirm(String title, String text, String yes, String no, Runnable confirmed){ FloatingDialog dialog = new FloatingDialog(title); - dialog.cont.add(text).width(500f).wrap().pad(4f).get().setAlignment(Align.center, Align.center); + dialog.cont.add(text).width(mobile ? 400f : 500f).wrap().pad(4f).get().setAlignment(Align.center, Align.center); dialog.buttons.defaults().size(200f, 54f).pad(2f); dialog.setFillParent(false); dialog.buttons.addButton(no, dialog::hide); diff --git a/core/src/io/anuke/mindustry/game/Version.java b/core/src/io/anuke/mindustry/core/Version.java similarity index 98% rename from core/src/io/anuke/mindustry/game/Version.java rename to core/src/io/anuke/mindustry/core/Version.java index 1df671ae06..9d774c47c8 100644 --- a/core/src/io/anuke/mindustry/game/Version.java +++ b/core/src/io/anuke/mindustry/core/Version.java @@ -1,4 +1,4 @@ -package io.anuke.mindustry.game; +package io.anuke.mindustry.core; import io.anuke.arc.*; import io.anuke.arc.Files.*; diff --git a/core/src/io/anuke/mindustry/core/World.java b/core/src/io/anuke/mindustry/core/World.java index 6491a639e4..869338ffc7 100644 --- a/core/src/io/anuke/mindustry/core/World.java +++ b/core/src/io/anuke/mindustry/core/World.java @@ -185,6 +185,10 @@ public class World{ Events.fire(new WorldLoadEvent()); } + public void setGenerating(boolean gen){ + this.generating = gen; + } + public boolean isGenerating(){ return generating; } diff --git a/core/src/io/anuke/mindustry/game/Content.java b/core/src/io/anuke/mindustry/ctype/Content.java similarity index 97% rename from core/src/io/anuke/mindustry/game/Content.java rename to core/src/io/anuke/mindustry/ctype/Content.java index 0c03f47eff..ab6f20d305 100644 --- a/core/src/io/anuke/mindustry/game/Content.java +++ b/core/src/io/anuke/mindustry/ctype/Content.java @@ -1,4 +1,4 @@ -package io.anuke.mindustry.game; +package io.anuke.mindustry.ctype; import io.anuke.arc.files.*; import io.anuke.arc.util.ArcAnnotate.*; diff --git a/core/src/io/anuke/mindustry/game/ContentList.java b/core/src/io/anuke/mindustry/ctype/ContentList.java similarity index 85% rename from core/src/io/anuke/mindustry/game/ContentList.java rename to core/src/io/anuke/mindustry/ctype/ContentList.java index 82406a9880..1f77c37e18 100644 --- a/core/src/io/anuke/mindustry/game/ContentList.java +++ b/core/src/io/anuke/mindustry/ctype/ContentList.java @@ -1,4 +1,4 @@ -package io.anuke.mindustry.game; +package io.anuke.mindustry.ctype; /** Interface for a list of content to be loaded in {@link io.anuke.mindustry.core.ContentLoader}. */ public interface ContentList{ diff --git a/core/src/io/anuke/mindustry/game/MappableContent.java b/core/src/io/anuke/mindustry/ctype/MappableContent.java similarity index 90% rename from core/src/io/anuke/mindustry/game/MappableContent.java rename to core/src/io/anuke/mindustry/ctype/MappableContent.java index 785113d2b8..3063157c13 100644 --- a/core/src/io/anuke/mindustry/game/MappableContent.java +++ b/core/src/io/anuke/mindustry/ctype/MappableContent.java @@ -1,4 +1,4 @@ -package io.anuke.mindustry.game; +package io.anuke.mindustry.ctype; import io.anuke.mindustry.*; diff --git a/core/src/io/anuke/mindustry/game/UnlockableContent.java b/core/src/io/anuke/mindustry/ctype/UnlockableContent.java similarity index 85% rename from core/src/io/anuke/mindustry/game/UnlockableContent.java rename to core/src/io/anuke/mindustry/ctype/UnlockableContent.java index 71e1fbe96c..44178b81ae 100644 --- a/core/src/io/anuke/mindustry/game/UnlockableContent.java +++ b/core/src/io/anuke/mindustry/ctype/UnlockableContent.java @@ -1,10 +1,11 @@ -package io.anuke.mindustry.game; +package io.anuke.mindustry.ctype; import io.anuke.annotations.Annotations.*; import io.anuke.arc.*; import io.anuke.arc.graphics.g2d.*; import io.anuke.arc.scene.ui.layout.*; import io.anuke.mindustry.*; +import io.anuke.mindustry.ui.Cicon; /** Base interface for an unlockable content type. */ public abstract class UnlockableContent extends MappableContent{ @@ -13,7 +14,7 @@ public abstract class UnlockableContent extends MappableContent{ /** Localized description. May be null. */ public String description; /** Icons by Cicon ID.*/ - protected TextureRegion[] cicons = new TextureRegion[Cicon.all.length]; + protected TextureRegion[] cicons = new TextureRegion[io.anuke.mindustry.ui.Cicon.all.length]; public UnlockableContent(String name){ super(name); @@ -61,6 +62,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/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 587ce46120..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.*; @@ -25,6 +25,7 @@ import io.anuke.mindustry.graphics.*; import io.anuke.mindustry.io.*; import io.anuke.mindustry.maps.*; import io.anuke.mindustry.ui.*; +import io.anuke.mindustry.ui.Cicon; import io.anuke.mindustry.ui.dialogs.*; import io.anuke.mindustry.world.*; import io.anuke.mindustry.world.blocks.*; @@ -424,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(() -> { @@ -506,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(); @@ -524,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/MapRenderer.java b/core/src/io/anuke/mindustry/editor/MapRenderer.java index 8c88cba145..27994abcdc 100644 --- a/core/src/io/anuke/mindustry/editor/MapRenderer.java +++ b/core/src/io/anuke/mindustry/editor/MapRenderer.java @@ -1,6 +1,6 @@ package io.anuke.mindustry.editor; -import io.anuke.arc.Core; +import io.anuke.arc.*; import io.anuke.arc.collection.IntSet; import io.anuke.arc.collection.IntSet.IntSetIterator; import io.anuke.arc.graphics.Color; @@ -10,6 +10,7 @@ import io.anuke.arc.graphics.g2d.TextureRegion; import io.anuke.arc.math.Mathf; import io.anuke.arc.util.*; import io.anuke.mindustry.content.Blocks; +import io.anuke.mindustry.game.EventType.*; import io.anuke.mindustry.game.Team; import io.anuke.mindustry.graphics.IndexedRenderer; import io.anuke.mindustry.world.Block; @@ -29,7 +30,11 @@ public class MapRenderer implements Disposable{ public MapRenderer(MapEditor editor){ this.editor = editor; - texture = Core.atlas.find("clear-editor").getTexture(); + this.texture = Core.atlas.find("clear-editor").getTexture(); + + Events.on(ContentReloadEvent.class, e -> { + texture = Core.atlas.find("clear-editor").getTexture(); + }); } public void resize(int width, int height){ 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 aba7fa135d..fa94b6b2f2 100644 --- a/core/src/io/anuke/mindustry/editor/WaveInfoDialog.java +++ b/core/src/io/anuke/mindustry/editor/WaveInfoDialog.java @@ -17,6 +17,7 @@ import io.anuke.mindustry.gen.*; import io.anuke.mindustry.graphics.*; import io.anuke.mindustry.io.*; import io.anuke.mindustry.type.*; +import io.anuke.mindustry.ui.Cicon; import io.anuke.mindustry.ui.dialogs.*; import static io.anuke.mindustry.Vars.*; @@ -140,7 +141,7 @@ public class WaveInfoDialog extends FloatingDialog{ t.margin(0).defaults().pad(3).padLeft(5f).growX().left(); t.addButton(b -> { b.left(); - b.addImage(group.type.icon(Cicon.medium)).size(32f).padRight(3); + b.addImage(group.type.icon(io.anuke.mindustry.ui.Cicon.medium)).size(32f).padRight(3); b.add(group.type.localizedName).color(Pal.accent); }, () -> showUpdate(group)).pad(-6f).padBottom(0f); @@ -221,7 +222,7 @@ public class WaveInfoDialog extends FloatingDialog{ for(UnitType type : content.units()){ dialog.cont.addButton(t -> { t.left(); - t.addImage(type.icon(Cicon.medium)).size(40f).padRight(2f); + t.addImage(type.icon(io.anuke.mindustry.ui.Cicon.medium)).size(40f).padRight(2f); t.add(type.localizedName); }, () -> { lastType = type; diff --git a/core/src/io/anuke/mindustry/entities/Damage.java b/core/src/io/anuke/mindustry/entities/Damage.java index 8d920e214a..149bb9b4d8 100644 --- a/core/src/io/anuke/mindustry/entities/Damage.java +++ b/core/src/io/anuke/mindustry/entities/Damage.java @@ -1,27 +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.GridBits; -import io.anuke.arc.collection.IntQueue; -import io.anuke.arc.function.*; -import io.anuke.arc.graphics.Color; -import io.anuke.arc.math.Mathf; +import io.anuke.arc.collection.*; +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.*; @@ -32,6 +27,7 @@ public class Damage{ private static Vector2 tr = new Vector2(); private static GridBits bits = new GridBits(30, 30); private static IntQueue propagation = new IntQueue(); + private static IntSet collidedBlocks = new IntSet(); /** Creates a dynamic explosion based on specified parameters. */ public static void dynamicExplosion(float x, float y, float flammability, float explosiveness, float power, float radius, Color color){ @@ -88,20 +84,22 @@ public class Damage{ * Only enemies of the specified team are damaged. */ public static void collideLine(Bullet hitter, Team team, Effect effect, float x, float y, float angle, float length, boolean large){ + collidedBlocks.clear(); tr.trns(angle, length); - IntPositionConsumer collider = (cx, cy) -> { + Intc2 collider = (cx, cy) -> { Tile tile = world.ltile(cx, cy); - if(tile != null && tile.entity != null && tile.getTeamID() != team.ordinal() && tile.entity.collide(hitter)){ + if(tile != null && !collidedBlocks.contains(tile.pos()) && tile.entity != null && tile.getTeamID() != team.ordinal() && tile.entity.collide(hitter)){ tile.entity.collision(hitter); + collidedBlocks.add(tile.pos()); hitter.getBulletType().hit(hitter, tile.worldx(), tile.worldy()); } }; 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; @@ -127,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; @@ -148,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); @@ -180,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/BulletType.java b/core/src/io/anuke/mindustry/entities/bullet/BulletType.java index 571be44bb0..807218cd85 100644 --- a/core/src/io/anuke/mindustry/entities/bullet/BulletType.java +++ b/core/src/io/anuke/mindustry/entities/bullet/BulletType.java @@ -3,12 +3,12 @@ package io.anuke.mindustry.entities.bullet; import io.anuke.arc.audio.*; import io.anuke.arc.math.*; import io.anuke.mindustry.content.*; +import io.anuke.mindustry.ctype.Content; import io.anuke.mindustry.entities.*; import io.anuke.mindustry.entities.Effects.*; import io.anuke.mindustry.entities.effect.*; import io.anuke.mindustry.entities.traits.*; import io.anuke.mindustry.entities.type.*; -import io.anuke.mindustry.game.*; import io.anuke.mindustry.gen.*; import io.anuke.mindustry.graphics.*; import io.anuke.mindustry.type.*; 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/Fire.java b/core/src/io/anuke/mindustry/entities/effect/Fire.java index 31cc65ab6a..2c47550426 100644 --- a/core/src/io/anuke/mindustry/entities/effect/Fire.java +++ b/core/src/io/anuke/mindustry/entities/effect/Fire.java @@ -12,8 +12,8 @@ import io.anuke.mindustry.entities.traits.*; import io.anuke.mindustry.entities.type.*; import io.anuke.mindustry.entities.type.TimedEntity; import io.anuke.mindustry.game.EventType.*; -import io.anuke.mindustry.game.*; import io.anuke.mindustry.gen.*; +import io.anuke.mindustry.type.TypeID; import io.anuke.mindustry.world.*; import java.io.*; diff --git a/core/src/io/anuke/mindustry/entities/effect/Lightning.java b/core/src/io/anuke/mindustry/entities/effect/Lightning.java index 83dedb94be..44bc54d1cb 100644 --- a/core/src/io/anuke/mindustry/entities/effect/Lightning.java +++ b/core/src/io/anuke/mindustry/entities/effect/Lightning.java @@ -20,8 +20,9 @@ import io.anuke.mindustry.entities.type.Unit; import io.anuke.mindustry.game.Team; import io.anuke.mindustry.gen.Call; import io.anuke.mindustry.graphics.Pal; +import io.anuke.mindustry.world.Tile; -import static io.anuke.mindustry.Vars.bulletGroup; +import static io.anuke.mindustry.Vars.*; public class Lightning extends TimedEntity implements DrawTrait, TimeTrait{ public static final float lifetime = 10f; @@ -34,7 +35,7 @@ public class Lightning extends TimedEntity implements DrawTrait, TimeTrait{ private static final float hitRange = 30f; private static int lastSeed = 0; - private Array lines = new Array<>(); + private Array lines = new Array<>(); private Color color = Pal.lancerLaser; /** For pooling use only. Do not call directly! */ @@ -61,10 +62,30 @@ public class Lightning extends TimedEntity implements DrawTrait, TimeTrait{ random.setSeed(seed); hit.clear(); + boolean[] bhit = {false}; + for(int i = 0; i < length / 2; i++){ Bullet.create(Bullets.damageLightning, l, team, x, y, 0f, 1f, 1f, dmg); l.lines.add(new Vector2(x + Mathf.range(3f), y + Mathf.range(3f))); + if(l.lines.size > 1){ + bhit[0] = false; + Position from = l.lines.get(l.lines.size - 2); + Position to = l.lines.get(l.lines.size - 1); + world.raycastEach(world.toTile(from.getX()), world.toTile(from.getY()), world.toTile(to.getX()), world.toTile(to.getY()), (wx, wy) -> { + + Tile tile = world.ltile(wx, wy); + if(tile != null && tile.block().insulated){ + bhit[0] = true; + //snap it instead of removing + l.lines.get(l.lines.size -1).set(wx * tilesize, wy * tilesize); + return true; + } + return false; + }); + if(bhit[0]) break; + } + rect.setSize(hitRange).setCenter(x, y); entities.clear(); if(hit.size < maxChain){ @@ -83,6 +104,7 @@ public class Lightning extends TimedEntity implements DrawTrait, TimeTrait{ y = furthest.y; }else{ rotation += random.range(20f); + x += Angles.trnsx(rotation, hitRange / 2f); y += Angles.trnsy(rotation, hitRange / 2f); } diff --git a/core/src/io/anuke/mindustry/entities/effect/Puddle.java b/core/src/io/anuke/mindustry/entities/effect/Puddle.java index 69bb64c9c2..56d326c41b 100644 --- a/core/src/io/anuke/mindustry/entities/effect/Puddle.java +++ b/core/src/io/anuke/mindustry/entities/effect/Puddle.java @@ -16,7 +16,7 @@ import io.anuke.mindustry.content.*; import io.anuke.mindustry.entities.*; import io.anuke.mindustry.entities.type.SolidEntity; import io.anuke.mindustry.entities.traits.*; -import io.anuke.mindustry.game.TypeID; +import io.anuke.mindustry.type.TypeID; import io.anuke.mindustry.gen.Call; import io.anuke.mindustry.type.Liquid; import io.anuke.mindustry.world.Tile; diff --git a/core/src/io/anuke/mindustry/entities/traits/BuilderTrait.java b/core/src/io/anuke/mindustry/entities/traits/BuilderTrait.java index 482bfb653f..35205daa42 100644 --- a/core/src/io/anuke/mindustry/entities/traits/BuilderTrait.java +++ b/core/src/io/anuke/mindustry/entities/traits/BuilderTrait.java @@ -193,11 +193,16 @@ public interface BuilderTrait extends Entity, TeamTrait{ /** Add another build requests to the queue, if it doesn't exist there yet. */ default void addBuildRequest(BuildRequest place, boolean tail){ + BuildRequest replace = null; for(BuildRequest request : buildQueue()){ if(request.x == place.x && request.y == place.y){ - return; + replace = request; + break; } } + if(replace != null){ + buildQueue().remove(replace); + } Tile tile = world.tile(place.x, place.y); if(tile != null && tile.entity instanceof BuildEntity){ place.progress = tile.entity().progress; @@ -283,7 +288,7 @@ public interface BuilderTrait extends Entity, TeamTrait{ /** Last progress.*/ public float progress; /** Whether construction has started for this request.*/ - public boolean initialized; + public boolean initialized, worldContext = true; /** Visual scale. Used only for rendering.*/ public float animScale = 0f; diff --git a/core/src/io/anuke/mindustry/entities/traits/TypeTrait.java b/core/src/io/anuke/mindustry/entities/traits/TypeTrait.java index 9e53f9678a..deddefe7ed 100644 --- a/core/src/io/anuke/mindustry/entities/traits/TypeTrait.java +++ b/core/src/io/anuke/mindustry/entities/traits/TypeTrait.java @@ -1,6 +1,6 @@ package io.anuke.mindustry.entities.traits; -import io.anuke.mindustry.game.TypeID; +import io.anuke.mindustry.type.TypeID; public interface TypeTrait{ diff --git a/core/src/io/anuke/mindustry/entities/type/BaseUnit.java b/core/src/io/anuke/mindustry/entities/type/BaseUnit.java index 369170e560..ab22a7933b 100644 --- a/core/src/io/anuke/mindustry/entities/type/BaseUnit.java +++ b/core/src/io/anuke/mindustry/entities/type/BaseUnit.java @@ -16,6 +16,8 @@ import io.anuke.mindustry.game.EventType.*; import io.anuke.mindustry.game.*; import io.anuke.mindustry.gen.*; import io.anuke.mindustry.type.*; +import io.anuke.mindustry.type.TypeID; +import io.anuke.mindustry.ui.Cicon; import io.anuke.mindustry.world.*; import io.anuke.mindustry.world.blocks.*; import io.anuke.mindustry.world.blocks.defense.DeflectorWall.*; diff --git a/core/src/io/anuke/mindustry/entities/type/Player.java b/core/src/io/anuke/mindustry/entities/type/Player.java index 2940897d1e..b6668e36c4 100644 --- a/core/src/io/anuke/mindustry/entities/type/Player.java +++ b/core/src/io/anuke/mindustry/entities/type/Player.java @@ -24,7 +24,9 @@ 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.*; @@ -50,6 +52,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(); @@ -359,8 +362,8 @@ public class Player extends Unit implements BuilderMinerTrait, ShooterTrait{ public void drawOver(){ if(dead) return; - if(isBuilding()){ - if(!state.isPaused() && isBuilding){ + if(isBuilding() && isBuilding){ + if(!state.isPaused()){ drawBuilding(); } }else{ @@ -442,7 +445,7 @@ public class Player extends Unit implements BuilderMinerTrait, ShooterTrait{ control.input.drawBreaking(request); }else{ request.block.drawRequest(request, control.input.allRequests(), - Build.validPlace(getTeam(), request.x, request.y, request.block, request.rotation)); + Build.validPlace(getTeam(), request.x, request.y, request.block, request.rotation) || control.input.requestMatches(request)); } } @@ -460,7 +463,7 @@ public class Player extends Unit implements BuilderMinerTrait, ShooterTrait{ } //mine only when not building - if(buildRequest() == null){ + if(buildRequest() == null || !isBuilding){ updateMining(); } } @@ -589,11 +592,16 @@ public class Player extends Unit implements BuilderMinerTrait, ShooterTrait{ float xa = Core.input.axis(Binding.move_x); float ya = Core.input.axis(Binding.move_y); - if(!Core.input.keyDown(Binding.gridMode) && !(Core.scene.getKeyboardFocus() instanceof TextField)){ + if(!(Core.scene.getKeyboardFocus() instanceof TextField)){ movement.y += ya * speed; 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/Unit.java b/core/src/io/anuke/mindustry/entities/type/Unit.java index 618c733f3a..8211476cef 100644 --- a/core/src/io/anuke/mindustry/entities/type/Unit.java +++ b/core/src/io/anuke/mindustry/entities/type/Unit.java @@ -22,6 +22,7 @@ import io.anuke.mindustry.graphics.*; import io.anuke.mindustry.net.*; import io.anuke.mindustry.type.*; import io.anuke.mindustry.ui.*; +import io.anuke.mindustry.ui.Cicon; import io.anuke.mindustry.world.*; import io.anuke.mindustry.world.blocks.*; diff --git a/core/src/io/anuke/mindustry/entities/type/base/FlyingUnit.java b/core/src/io/anuke/mindustry/entities/type/base/FlyingUnit.java index 8a7e04dbcf..017ebad34f 100644 --- a/core/src/io/anuke/mindustry/entities/type/base/FlyingUnit.java +++ b/core/src/io/anuke/mindustry/entities/type/base/FlyingUnit.java @@ -151,7 +151,13 @@ public class FlyingUnit extends BaseUnit{ } public void drawWeapons(){ - + for(int i : Mathf.signs){ + float tra = rotation - 90, trY = -type.weapon.getRecoil(this, i > 0) + type.weaponOffsetY; + float w = -i * type.weapon.region.getWidth() * Draw.scl; + Draw.rect(type.weapon.region, + x + Angles.trnsx(tra, getWeapon().width * i, trY), + y + Angles.trnsy(tra, getWeapon().width * i, trY), w, type.weapon.region.getHeight() * Draw.scl, rotation - 90); + } } public void drawEngine(){ diff --git a/core/src/io/anuke/mindustry/game/EventType.java b/core/src/io/anuke/mindustry/game/EventType.java index c526a5359c..567a4a706f 100644 --- a/core/src/io/anuke/mindustry/game/EventType.java +++ b/core/src/io/anuke/mindustry/game/EventType.java @@ -2,6 +2,7 @@ package io.anuke.mindustry.game; import io.anuke.arc.util.ArcAnnotate.*; import io.anuke.mindustry.core.GameState.State; +import io.anuke.mindustry.ctype.UnlockableContent; import io.anuke.mindustry.entities.traits.BuilderTrait; import io.anuke.mindustry.entities.type.*; import io.anuke.mindustry.entities.units.*; @@ -134,10 +135,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/GlobalData.java b/core/src/io/anuke/mindustry/game/GlobalData.java index f0b7bfecab..908173e751 100644 --- a/core/src/io/anuke/mindustry/game/GlobalData.java +++ b/core/src/io/anuke/mindustry/game/GlobalData.java @@ -6,6 +6,7 @@ import io.anuke.arc.files.*; import io.anuke.arc.util.io.*; import io.anuke.mindustry.*; import io.anuke.mindustry.content.*; +import io.anuke.mindustry.ctype.UnlockableContent; import io.anuke.mindustry.game.EventType.*; import io.anuke.mindustry.type.*; @@ -46,6 +47,7 @@ public class GlobalData{ try(OutputStream fos = file.write(false, 2048); ZipOutputStream zos = new ZipOutputStream(fos)){ for(FileHandle add : files){ + if(add.isDirectory()) continue; zos.putNextEntry(new ZipEntry(add.path().substring(base.length()))); Streams.copyStream(add.read(), zos); zos.closeEntry(); @@ -64,14 +66,8 @@ public class GlobalData{ throw new IllegalArgumentException("Not valid save data."); } - //purge existing data - for(FileHandle f : base.list()){ - if(f.isDirectory()){ - f.deleteDirectory(); - }else if(!f.name().equals("zipdata.zip")){ - f.delete(); - } - } + //purge existing tmp data, keep everything else + tmpDirectory.deleteDirectory(); zipped.walk(f -> f.copyTo(base.child(f.path()))); dest.delete(); diff --git a/core/src/io/anuke/mindustry/game/LoopControl.java b/core/src/io/anuke/mindustry/game/LoopControl.java index 3924a1c28c..8a60711ece 100644 --- a/core/src/io/anuke/mindustry/game/LoopControl.java +++ b/core/src/io/anuke/mindustry/game/LoopControl.java @@ -37,7 +37,7 @@ public class LoopControl{ } }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/MusicControl.java b/core/src/io/anuke/mindustry/game/MusicControl.java index 7b5c314a95..16a3301ae3 100644 --- a/core/src/io/anuke/mindustry/game/MusicControl.java +++ b/core/src/io/anuke/mindustry/game/MusicControl.java @@ -22,16 +22,12 @@ public class MusicControl{ public Array darkMusic = Array.with(); private Music lastRandomPlayed; private Interval timer = new Interval(); - private @Nullable - Music current; + private @Nullable Music current; private float fade; private boolean silenced; public MusicControl(){ - Events.on(ClientLoadEvent.class, e -> { - ambientMusic = Array.with(Musics.game1, Musics.game3, Musics.game4, Musics.game6); - darkMusic = Array.with(Musics.game2, Musics.game5, Musics.game7); - }); + Events.on(ClientLoadEvent.class, e -> reload()); //only run music 10 seconds after a wave spawns Events.on(WaveEvent.class, e -> Time.run(60f * 10f, () -> { @@ -41,6 +37,13 @@ public class MusicControl{ })); } + private void reload(){ + current = null; + fade = 0f; + ambientMusic = Array.with(Musics.game1, Musics.game3, Musics.game4, Musics.game6); + darkMusic = Array.with(Musics.game2, Musics.game5, Musics.game7); + } + /** Update and play the right music track.*/ public void update(){ if(state.is(State.menu)){ diff --git a/core/src/io/anuke/mindustry/game/Saves.java b/core/src/io/anuke/mindustry/game/Saves.java index ff22a74210..25bc7720c9 100644 --- a/core/src/io/anuke/mindustry/game/Saves.java +++ b/core/src/io/anuke/mindustry/game/Saves.java @@ -22,13 +22,12 @@ import java.util.*; import static io.anuke.mindustry.Vars.*; public class Saves{ - private int nextSlot; private Array saves = new Array<>(); - private IntMap saveMap = new IntMap<>(); private SaveSlot current; private AsyncExecutor previewExecutor = new AsyncExecutor(1); private boolean saving; private float time; + private FileHandle zoneFile; private long totalPlaytime; private long lastTimestamp; @@ -47,16 +46,13 @@ public class Saves{ public void load(){ saves.clear(); - IntArray slots = Core.settings.getObject("save-slots", IntArray.class, IntArray::new); + zoneFile = saveDirectory.child("-1.msav"); - for(int i = 0; i < slots.size; i++){ - int index = slots.get(i); - if(SaveIO.isSaveValid(index)){ - SaveSlot slot = new SaveSlot(index); + for(FileHandle file : saveDirectory.list()){ + if(!file.name().contains("backup") && SaveIO.isSaveValid(file)){ + SaveSlot slot = new SaveSlot(file); saves.add(slot); - saveMap.put(slot.index, slot); - slot.meta = SaveIO.getMeta(index); - nextSlot = Math.max(index + 1, nextSlot); + slot.meta = SaveIO.getMeta(file); } } } @@ -110,73 +106,63 @@ public class Saves{ } public void zoneSave(){ - SaveSlot slot = new SaveSlot(-1); + SaveSlot slot = new SaveSlot(zoneFile); slot.setName("zone"); - saves.remove(s -> s.index == -1); + saves.remove(s -> s.file.equals(zoneFile)); saves.add(slot); - saveMap.put(slot.index, slot); slot.save(); - saveSlots(); } public SaveSlot addSave(String name){ - SaveSlot slot = new SaveSlot(nextSlot); - nextSlot++; + SaveSlot slot = new SaveSlot(getNextSlotFile()); slot.setName(name); saves.add(slot); - saveMap.put(slot.index, slot); slot.save(); - saveSlots(); return slot; } public SaveSlot importSave(FileHandle file) throws IOException{ - SaveSlot slot = new SaveSlot(nextSlot); + SaveSlot slot = new SaveSlot(getNextSlotFile()); slot.importFile(file); - nextSlot++; slot.setName(file.nameWithoutExtension()); saves.add(slot); - saveMap.put(slot.index, slot); - slot.meta = SaveIO.getMeta(slot.index); + slot.meta = SaveIO.getMeta(slot.file); current = slot; - saveSlots(); return slot; } public SaveSlot getZoneSlot(){ - SaveSlot slot = getByID(-1); + SaveSlot slot = getSaveSlots().find(s -> s.file.equals(zoneFile)); return slot == null || slot.getZone() == null ? null : slot; } - public SaveSlot getByID(int id){ - return saveMap.get(id); + public FileHandle getNextSlotFile(){ + int i = 0; + FileHandle file; + while((file = saveDirectory.child(i + "." + saveExtension)).exists()){ + i ++; + } + return file; } public Array getSaveSlots(){ return saves; } - private void saveSlots(){ - IntArray result = new IntArray(saves.size); - for(int i = 0; i < saves.size; i++) result.add(saves.get(i).index); - - Core.settings.putObject("save-slots", result); - Core.settings.save(); - } - public class SaveSlot{ - public final int index; + //public final int index; + public final FileHandle file; boolean requestedPreview; SaveMeta meta; - public SaveSlot(int index){ - this.index = index; + public SaveSlot(FileHandle file){ + this.file = file; } public void load() throws SaveException{ try{ - SaveIO.loadFromSlot(index); - meta = SaveIO.getMeta(index); + SaveIO.load(file); + meta = SaveIO.getMeta(file); current = this; totalPlaytime = meta.timePlayed; savePreview(); @@ -190,8 +176,8 @@ public class Saves{ long prev = totalPlaytime; totalPlaytime = time; - SaveIO.saveToSlot(index); - meta = SaveIO.getMeta(index); + SaveIO.save(file); + meta = SaveIO.getMeta(file); if(!state.is(State.menu)){ current = this; } @@ -226,8 +212,12 @@ public class Saves{ return null; } + private String index(){ + return file.nameWithoutExtension(); + } + private FileHandle previewFile(){ - return mapPreviewDirectory.child("save_slot_" + index + ".png"); + return mapPreviewDirectory.child("save_slot_" + index() + ".png"); } private FileHandle loadPreviewFile(){ @@ -266,11 +256,11 @@ public class Saves{ } public String getName(){ - return Core.settings.getString("save-" + index + "-name", "untitled"); + return Core.settings.getString("save-" + index() + "-name", "untitled"); } public void setName(String name){ - Core.settings.put("save-" + index + "-name", name); + Core.settings.put("save-" + index() + "-name", name); Core.settings.save(); } @@ -295,34 +285,33 @@ public class Saves{ } public boolean isAutosave(){ - return Core.settings.getBool("save-" + index + "-autosave", true); + return Core.settings.getBool("save-" + index() + "-autosave", true); } public void setAutosave(boolean save){ - Core.settings.put("save-" + index + "-autosave", save); + Core.settings.put("save-" + index() + "-autosave", save); Core.settings.save(); } - public void importFile(FileHandle file) throws IOException{ + public void importFile(FileHandle from) throws IOException{ try{ - file.copyTo(SaveIO.fileFor(index)); + from.copyTo(file); }catch(Exception e){ throw new IOException(e); } } - public void exportFile(FileHandle file) throws IOException{ + public void exportFile(FileHandle to) throws IOException{ try{ - SaveIO.fileFor(index).copyTo(file); + file.copyTo(to); }catch(Exception e){ throw new IOException(e); } } public void delete(){ - SaveIO.fileFor(index).delete(); + file.delete(); saves.removeValue(this, true); - saveMap.remove(index); if(this == current){ current = null; } @@ -330,8 +319,6 @@ public class Saves{ if(Core.assets.isLoaded(loadPreviewFile().path())){ Core.assets.unload(loadPreviewFile().path()); } - - saveSlots(); } } } diff --git a/core/src/io/anuke/mindustry/game/Schematic.java b/core/src/io/anuke/mindustry/game/Schematic.java index ff5f533d05..1ff6efd77c 100644 --- a/core/src/io/anuke/mindustry/game/Schematic.java +++ b/core/src/io/anuke/mindustry/game/Schematic.java @@ -5,13 +5,13 @@ import io.anuke.arc.collection.IntIntMap.*; import io.anuke.arc.files.*; import io.anuke.arc.util.ArcAnnotate.*; import io.anuke.mindustry.*; -import io.anuke.mindustry.game.Schematics.*; import io.anuke.mindustry.type.*; import io.anuke.mindustry.world.*; +import io.anuke.mindustry.world.blocks.storage.*; import static io.anuke.mindustry.Vars.*; -public class Schematic implements Publishable{ +public class Schematic implements Publishable, Comparable{ public final Array tiles; public StringMap tags; public int width, height; @@ -40,6 +40,16 @@ public class Schematic implements Publishable{ 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"); } @@ -90,10 +100,15 @@ public class Schematic implements Publishable{ @Override public FileHandle createSteamPreview(String id){ FileHandle preview = tmpDirectory.child("schematic_preview_" + id + ".png"); - schematics.savePreview(this, PreviewRes.high, preview); + schematics.savePreview(this, preview); return preview; } + @Override + public int compareTo(Schematic schematic){ + return name().compareTo(schematic.name()); + } + public static class Stile{ public @NonNull Block block; public short x, y; diff --git a/core/src/io/anuke/mindustry/game/Schematics.java b/core/src/io/anuke/mindustry/game/Schematics.java index 9cadd1e090..f6086b8b2e 100644 --- a/core/src/io/anuke/mindustry/game/Schematics.java +++ b/core/src/io/anuke/mindustry/game/Schematics.java @@ -16,9 +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.*; @@ -27,22 +30,33 @@ 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 OrderedMap previews = new OrderedMap<>(); private FrameBuffer shadowBuffer; + private long lastClearTime; public Schematics(){ Events.on(DisposeEvent.class, e -> { - previews.each((schem, m) -> m.each((res, buffer) -> buffer.dispose())); + previews.each((schem, m) -> m.dispose()); previews.clear(); shadowBuffer.dispose(); }); + + Events.on(ContentReloadEvent.class, event -> { + previews.each((schem, m) -> m.dispose()); + previews.clear(); + load(); + }); } @Override @@ -60,9 +74,32 @@ public class Schematics implements Loadable{ platform.getWorkshopContent(Schematic.class).each(this::loadFile); - Core.app.post(() -> { - shadowBuffer = new FrameBuffer(maxSchematicSize + padding + 2, maxSchematicSize + padding + 2); - }); + all.sort(); + + if(shadowBuffer == null){ + Core.app.post(() -> shadowBuffer = new FrameBuffer(maxSchematicSize + padding + 8, maxSchematicSize + padding + 8)); + } + } + + public void overwrite(Schematic target, Schematic newSchematic){ + if(previews.containsKey(target)){ + previews.get(target).dispose(); + previews.remove(target); + } + + target.tiles.clear(); + target.tiles.addAll(newSchematic.tiles); + target.width = newSchematic.width; + target.height = newSchematic.height; + newSchematic.tags.putAll(target.tags); + newSchematic.file = target.file; + + try{ + write(newSchematic, target.file); + }catch(Exception e){ + Log.err(e); + ui.showException(e); + } } private void loadFile(FileHandle file){ @@ -95,8 +132,8 @@ public class Schematics implements Loadable{ } } - public void savePreview(Schematic schematic, PreviewRes res, FileHandle file){ - FrameBuffer buffer = getBuffer(schematic, res); + public void savePreview(Schematic schematic, FileHandle file){ + FrameBuffer buffer = getBuffer(schematic); Draw.flush(); buffer.begin(); Pixmap pixmap = ScreenUtils.getFrameBufferPixmap(0, 0, buffer.getWidth(), buffer.getHeight()); @@ -104,16 +141,31 @@ public class Schematics implements Loadable{ buffer.end(); } - public Texture getPreview(Schematic schematic, PreviewRes res){ - return getBuffer(schematic, res).getTexture(); + public Texture getPreview(Schematic schematic){ + return getBuffer(schematic).getTexture(); } - public FrameBuffer getBuffer(Schematic schematic, PreviewRes res){ - if(!previews.getOr(schematic, ObjectMap::new).containsKey(res)){ - int resolution = res.resolution; + public boolean hasPreview(Schematic schematic){ + return previews.containsKey(schematic); + } + + 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(); - Time.mark(); Tmp.m1.set(Draw.proj()); Tmp.m2.set(Draw.trans()); FrameBuffer buffer = new FrameBuffer((schematic.width + padding) * resolution, (schematic.height + padding) * resolution); @@ -157,6 +209,7 @@ public class Schematics implements Loadable{ //draw requests requests.each(req -> { req.animScale = 1f; + req.worldContext = false; req.block.drawRequestRegion(req, requests::each); }); @@ -170,24 +223,48 @@ public class Schematics implements Loadable{ Draw.proj(Tmp.m1); Draw.trans(Tmp.m2); - previews.getOr(schematic, ObjectMap::new).put(res, buffer); - Log.info("Time taken: {0}", Time.elapsed()); + previews.put(schematic, buffer); } - return previews.get(schematic).get(res); + return previews.get(schematic); } /** 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()); + return schem.tiles.map(t -> new BuildRequest(t.x + x - schem.width/2, t.y + y - schem.height/2, t.rotation, t.block).original(t.x, t.y, schem.width, schem.height).configure(t.config)) + .removeAll(s -> !s.block.isVisible() || !s.block.unlockedCur()); + } + + public 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.*/ public void add(Schematic schematic){ all.add(schematic); try{ - write(schematic, schematicDirectory.child(Time.millis() + "." + schematicExtension)); - }catch(IOException e){ + FileHandle file = schematicDirectory.child(Time.millis() + "." + schematicExtension); + write(schematic, file); + schematic.file = file; + }catch(Exception e){ + ui.showException(e); Log.err(e); } } @@ -197,16 +274,23 @@ public class Schematics implements Loadable{ if(s.file != null){ s.file.delete(); } + + if(previews.containsKey(s)){ + previews.get(s).dispose(); + previews.remove(s); + } } /** 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; y2 = result.y2; + int ox = x, oy = y, ox2 = x2, oy2 = y2; + Array tiles = new Array<>(); int minx = x2, miny = y2, maxx = x, maxy = y; @@ -215,7 +299,7 @@ public class Schematics implements Loadable{ for(int cy = y; cy <= y2; cy++){ Tile linked = world.ltile(cx, cy); - if(linked != null && linked.entity != null && linked.entity.block.isVisible()){ + if(linked != null && linked.entity != null && linked.entity.block.isVisible() && !(linked.block() instanceof BuildBlock)){ int top = linked.block().size/2; int bot = linked.block().size % 2 == 1 ? -linked.block().size/2 : -(linked.block().size - 1)/2; minx = Math.min(linked.x + bot, minx); @@ -238,17 +322,19 @@ public class Schematics implements Loadable{ int width = x2 - x + 1, height = y2 - y + 1; int offsetX = -x, offsetY = -y; - for(int cx = x; cx <= x2; cx++){ - for(int cy = y; cy <= y2; cy++){ - Tile tile = world.tile(cx, cy); + IntSet counted = new IntSet(); + for(int cx = ox; cx <= ox2; cx++){ + for(int cy = oy; cy <= oy2; cy++){ + Tile tile = world.ltile(cx, cy); - if(tile != null && tile.entity != null){ + if(tile != null && tile.entity != null && !counted.contains(tile.pos()) && !(tile.block() instanceof BuildBlock) && tile.entity.block.isVisible()){ int config = tile.entity.config(); if(tile.block().posConfig){ config = Pos.get(Pos.x(config) + offsetX, Pos.y(config) + offsetY); } - tiles.add(new Stile(tile.block(), cx + offsetX, cy + offsetY, config, tile.rotation())); + tiles.add(new Stile(tile.block(), tile.x + offsetX, tile.y + offsetY, config, tile.rotation())); + counted.add(tile.pos()); } } } @@ -267,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")){ @@ -367,14 +453,4 @@ public class Schematics implements Loadable{ } //endregion - - public enum PreviewRes{ - low(8), med(8), high(32); - - public final int resolution; - - PreviewRes(int resolution){ - this.resolution = resolution; - } - } } diff --git a/core/src/io/anuke/mindustry/game/SpawnGroup.java b/core/src/io/anuke/mindustry/game/SpawnGroup.java index 4637ba4bfd..e799e26c40 100644 --- a/core/src/io/anuke/mindustry/game/SpawnGroup.java +++ b/core/src/io/anuke/mindustry/game/SpawnGroup.java @@ -3,6 +3,7 @@ package io.anuke.mindustry.game; import io.anuke.arc.util.serialization.Json; import io.anuke.arc.util.serialization.Json.Serializable; import io.anuke.arc.util.serialization.JsonValue; +import io.anuke.mindustry.content.*; import io.anuke.mindustry.entities.type.BaseUnit; import io.anuke.mindustry.type.*; @@ -84,6 +85,7 @@ public class SpawnGroup implements Serializable{ @Override public void read(Json json, JsonValue data){ type = content.getByName(ContentType.unit, data.getString("type", "dagger")); + if(type == null) type = UnitTypes.dagger; begin = data.getInt("begin", 0); end = data.getInt("end", never); spacing = data.getInt("spacing", 1); 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 f402f88a5b..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.*; @@ -41,9 +41,11 @@ public class Tutorial{ Events.on(DepositEvent.class, event -> events.add("deposit")); Events.on(WithdrawEvent.class, event -> events.add("withdraw")); - for(TutorialStage stage : TutorialStage.values()){ - stage.load(); - } + Events.on(ClientLoadEvent.class, e -> { + for(TutorialStage stage : TutorialStage.values()){ + stage.load(); + } + }); } /** update tutorial state, transition if needed */ @@ -192,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/game/TypeID.java b/core/src/io/anuke/mindustry/game/TypeID.java deleted file mode 100644 index c054f9d8e9..0000000000 --- a/core/src/io/anuke/mindustry/game/TypeID.java +++ /dev/null @@ -1,19 +0,0 @@ -package io.anuke.mindustry.game; - -import io.anuke.arc.function.Supplier; -import io.anuke.mindustry.entities.traits.TypeTrait; -import io.anuke.mindustry.type.ContentType; - -public class TypeID extends MappableContent{ - public final Supplier constructor; - - public TypeID(String name, Supplier constructor){ - super(name); - this.constructor = constructor; - } - - @Override - public ContentType getContentType(){ - return ContentType.typeid; - } -} diff --git a/core/src/io/anuke/mindustry/graphics/BlockRenderer.java b/core/src/io/anuke/mindustry/graphics/BlockRenderer.java index 1b9f821e92..6d3a8a5281 100644 --- a/core/src/io/anuke/mindustry/graphics/BlockRenderer.java +++ b/core/src/io/anuke/mindustry/graphics/BlockRenderer.java @@ -12,6 +12,7 @@ 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.world.*; import static io.anuke.arc.Core.camera; @@ -123,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{ diff --git a/core/src/io/anuke/mindustry/graphics/MenuRenderer.java b/core/src/io/anuke/mindustry/graphics/MenuRenderer.java index d6d3bcbd97..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.*; @@ -14,8 +14,8 @@ import io.anuke.arc.util.noise.RidgedPerlin; import io.anuke.arc.util.noise.Simplex; import io.anuke.mindustry.content.Blocks; import io.anuke.mindustry.content.UnitTypes; -import io.anuke.mindustry.game.*; import io.anuke.mindustry.type.UnitType; +import io.anuke.mindustry.ui.Cicon; import io.anuke.mindustry.world.*; import io.anuke.mindustry.world.blocks.Floor; import io.anuke.mindustry.world.blocks.OreBlock; @@ -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 92c8497b26..568884d609 100644 --- a/core/src/io/anuke/mindustry/graphics/MinimapRenderer.java +++ b/core/src/io/anuke/mindustry/graphics/MinimapRenderer.java @@ -9,10 +9,12 @@ import io.anuke.arc.math.*; import io.anuke.arc.math.geom.*; import io.anuke.arc.scene.ui.layout.*; import io.anuke.arc.util.*; +import io.anuke.arc.util.pooling.*; 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.world.*; import static io.anuke.mindustry.Vars.*; @@ -68,7 +70,7 @@ public class MinimapRenderer implements Disposable{ region = new TextureRegion(texture); } - public void drawEntities(float x, float y, float w, float h){ + public void drawEntities(float x, float y, float w, float h, boolean withLabels){ updateUnitArray(); float sz = baseSize * zoom; @@ -80,7 +82,17 @@ public class MinimapRenderer implements Disposable{ rect.set((dx - sz) * tilesize, (dy - sz) * tilesize, sz * 2 * tilesize, sz * 2 * tilesize); for(Unit unit : units){ - float rx = (unit.x - rect.x) / rect.width * w, ry = (unit.y - rect.y) / rect.width * h; + float rx = (unit.x - rect.x) / rect.width * w; + float ry = (unit.y - rect.y) / rect.width * h; + + if(withLabels && unit instanceof Player){ + Player pl = (Player) unit; + if(!pl.isLocal){ + // Only display names for other players. + drawLabel(x + rx, y + ry, pl.name, unit.getTeam().color); + } + } + Draw.color(unit.getTeam().color); Fill.rect(x + rx, y + ry, Scl.scl(baseSize / 2f), Scl.scl(baseSize / 2f)); } @@ -88,6 +100,10 @@ public class MinimapRenderer implements Disposable{ Draw.color(); } + public void drawEntities(float x, float y, float w, float h){ + drawEntities(x, y, w, h, true); + } + public TextureRegion getRegion(){ if(texture == null) return null; @@ -133,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(); } @@ -145,4 +165,27 @@ public class MinimapRenderer implements Disposable{ pixmap = null; } } + + public void drawLabel(float x, float y, String text, Color color){ + BitmapFont font = Fonts.outline; + GlyphLayout l = Pools.obtain(GlyphLayout.class, GlyphLayout::new); + boolean ints = font.usesIntegerPositions(); + font.getData().setScale(1 / 1.5f / Scl.scl(1f)); + font.setUseIntegerPositions(false); + + l.setText(font, text, color, 90f, Align.left, true); + float yOffset = 20f; + float margin = 3f; + + Draw.color(0f, 0f, 0f, 0.2f); + Fill.rect(x, y + yOffset - l.height/2f, l.width + margin, l.height + margin); + Draw.color(); + font.setColor(color); + font.draw(text, x - l.width/2f, y + yOffset, 90f, Align.left, true); + font.setUseIntegerPositions(ints); + + font.getData().setScale(1f); + + Pools.free(l); + } } diff --git a/core/src/io/anuke/mindustry/graphics/OverlayRenderer.java b/core/src/io/anuke/mindustry/graphics/OverlayRenderer.java index 3c91d89a58..f9e7797f71 100644 --- a/core/src/io/anuke/mindustry/graphics/OverlayRenderer.java +++ b/core/src/io/anuke/mindustry/graphics/OverlayRenderer.java @@ -12,7 +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.*; @@ -56,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.worldx(), mechpad.worldy()).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/Pal.java b/core/src/io/anuke/mindustry/graphics/Pal.java index 3017cc6c26..2c46e726f7 100644 --- a/core/src/io/anuke/mindustry/graphics/Pal.java +++ b/core/src/io/anuke/mindustry/graphics/Pal.java @@ -75,6 +75,8 @@ public class Pal{ surge = Color.valueOf("f3e979"), + plastanium = Color.valueOf("a1b46e"), + redSpark = Color.valueOf("fbb97f"), orangeSpark = Color.valueOf("d2b29c"), diff --git a/core/src/io/anuke/mindustry/input/Binding.java b/core/src/io/anuke/mindustry/input/Binding.java index bd7cc9b4ac..918a878937 100644 --- a/core/src/io/anuke/mindustry/input/Binding.java +++ b/core/src/io/anuke/mindustry/input/Binding.java @@ -9,6 +9,7 @@ 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), select(KeyCode.MOUSE_LEFT), deselect(KeyCode.MOUSE_RIGHT), break_block(KeyCode.MOUSE_RIGHT), @@ -23,8 +24,6 @@ public enum Binding implements KeyBind{ schematic_flip_y(KeyCode.X), schematic_menu(KeyCode.T), dash(KeyCode.SHIFT_LEFT), - gridMode(KeyCode.BACKTICK), - gridModeShift(KeyCode.ALT_LEFT), zoom_hold(KeyCode.CONTROL_LEFT, "view"), zoom(new Axis(KeyCode.SCROLL)), menu(Core.app.getType() == ApplicationType.Android ? KeyCode.BACK : KeyCode.ESCAPE), @@ -33,12 +32,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 b705551709..e3af574cff 100644 --- a/core/src/io/anuke/mindustry/input/DesktopInput.java +++ b/core/src/io/anuke/mindustry/input/DesktopInput.java @@ -45,13 +45,14 @@ public class DesktopInput extends InputHandler{ group.fill(t -> { t.bottom().update(() -> t.getColor().a = Mathf.lerpDelta(t.getColor().a, player.isBuilding() ? 1f : 0f, 0.15f)); t.visible(() -> Core.settings.getBool("hints") && selectRequests.isEmpty()); + 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.add(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.add(Core.bundle.format("selectschematic", Core.keybinds.get(Binding.schematic_select).key.toString())).style(Styles.outlineLabel); }).margin(10f); }); @@ -59,21 +60,13 @@ public class DesktopInput extends InputHandler{ t.visible(() -> lastSchematic != null && !selectRequests.isEmpty()); t.bottom(); t.table(Styles.black6, b -> { - b.touchable(Touchable.enabled); 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); + 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 -> { - lastSchematic.tags.put("name", text); - schematics.add(lastSchematic); - ui.showInfoFade("$schematic.saved"); - ui.schematics.showInfo(lastSchematic); - }); - }).colspan(2).size(250f, 50f); + a.addImageTextButton("$schematic.add", Icon.saveSmall, this::showSchematicSave).colspan(2).size(250f, 50f).disabled(f -> lastSchematic == null || lastSchematic.file != null); }); }).margin(6f); }); @@ -129,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); } @@ -173,8 +166,9 @@ public class DesktopInput extends InputHandler{ mode = none; } - if(mode != none){ + if(mode != none || isPlacing()){ selectRequests.clear(); + lastSchematic = null; } if(player.isShooting && !canShoot()){ @@ -188,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()){ @@ -243,6 +238,7 @@ public class DesktopInput extends InputHandler{ schematicX = tileX(getMouseX()); schematicY = tileY(getMouseY()); + selectRequests.clear(); selectRequests.addAll(schematics.toRequests(schem, schematicX, schematicY)); mode = none; } @@ -258,17 +254,25 @@ 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(); }); } void pollInput(){ + if(scene.getKeyboardFocus() instanceof TextField) return; + Tile selected = tileAt(Core.input.mouseX(), Core.input.mouseY()); int cursorX = tileX(Core.input.mouseX()); 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; @@ -289,13 +293,17 @@ public class DesktopInput extends InputHandler{ player.clearBuilding(); } - if(Core.input.keyTap(Binding.schematic_select)){ + if(Core.input.keyTap(Binding.schematic_select) && !ui.chatfrag.chatOpen()){ schemX = rawCursorX; schemY = rawCursorY; } - if(Core.input.keyTap(Binding.schematic_menu)){ - ui.schematics.show(); + if(Core.input.keyTap(Binding.schematic_menu) && !ui.chatfrag.chatOpen()){ + if(ui.schematics.isShown()){ + ui.schematics.hide(); + }else{ + ui.schematics.show(); + } } if(Core.input.keyTap(Binding.clear_building)){ @@ -303,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()){ @@ -335,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){ @@ -348,7 +357,6 @@ public class DesktopInput extends InputHandler{ if(!selectRequests.isEmpty()){ flushRequests(selectRequests); - //selectRequests.clear(); }else if(isPlacing()){ selectX = cursorX; selectY = cursorY; @@ -362,7 +370,7 @@ public class DesktopInput extends InputHandler{ deleting = true; }else if(selected != null){ //only begin shooting if there's no cursor event - if(!tileTapped(selected) && !tryTapPlayer(Core.input.mouseWorld().x, Core.input.mouseWorld().y) && player.buildQueue().size == 0 && !droppingItem && + if(!tileTapped(selected) && !tryTapPlayer(Core.input.mouseWorld().x, Core.input.mouseWorld().y) && (player.buildQueue().size == 0 || !player.isBuilding) && !droppingItem && !tryBeginMine(selected) && player.getMineTile() == null && !ui.chatfrag.chatOpen()){ player.isShooting = true; } @@ -421,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 cfdafc57fd..ca104342c1 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,11 +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.*; @@ -108,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; @@ -142,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); }; } @@ -214,6 +219,11 @@ public abstract class InputHandler implements InputProcessor, GestureListener{ } } + public boolean requestMatches(BuildRequest request){ + Tile tile = world.tile(request.x, request.y); + return tile != null && tile.block() instanceof BuildBlock && tile.entity().cblock == request.block; + } + public void drawBreaking(int x, int y){ Tile tile = world.ltile(x, y); if(tile == null) return; @@ -226,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 @@ -262,15 +292,15 @@ public abstract class InputHandler implements InputProcessor, GestureListener{ } public void flipRequests(Array requests, boolean x){ - int origin = x ? rawTileX() : rawTileY(); + int origin = (x ? schemOriginX() : schemOriginY()) * tilesize; requests.each(req -> { - int value = -((x ? req.x : req.y) - origin) + origin; + float value = -((x ? req.x : req.y) * tilesize - origin + req.block.offset()) + origin; if(x){ - req.x = value; + req.x = (int)((value - req.block.offset()) / tilesize); }else{ - req.y = value; + req.y = (int)((value - req.block.offset()) / tilesize); } if(req.block.posConfig){ @@ -292,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); @@ -304,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(); @@ -322,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++){ @@ -357,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); @@ -381,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); @@ -394,7 +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)){ - selectRequests.add(req.copy()); + 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()); + } } } } @@ -429,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); @@ -458,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(); @@ -486,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){ @@ -708,7 +759,10 @@ public abstract class InputHandler implements InputProcessor, GestureListener{ public boolean validPlace(int x, int y, Block type, int rotation, BuildRequest ignore){ for(BuildRequest req : player.buildQueue()){ - if(req != ignore && !req.breaking && req.block.bounds(req.x, req.y, Tmp.r1).overlaps(type.bounds(x, y, Tmp.r2))){ + 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))){ return false; } } @@ -720,6 +774,10 @@ public abstract class InputHandler implements InputProcessor, GestureListener{ } public void placeBlock(int x, int y, Block block, int rotation){ + BuildRequest req = getRequest(x, y); + if(req != null){ + player.buildQueue().remove(req); + } player.addBuildRequest(new BuildRequest(x, y, rotation, block)); } @@ -748,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); @@ -785,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 692a5f505c..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. */ @@ -153,7 +157,9 @@ public class MobileInput extends InputHandler implements GestureListener{ void removeRequest(BuildRequest request){ selectRequests.removeValue(request, true); - removals.add(request); + if(!request.breaking){ + removals.add(request); + } } boolean isLinePlacing(){ @@ -185,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, () -> { @@ -196,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); } @@ -216,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(); @@ -225,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 @@ -249,8 +319,6 @@ public class MobileInput extends InputHandler implements GestureListener{ }else{ request.block.drawRequest(request, allRequests(), true); } - //TODO - //drawRequest(request); } //draw list of requests @@ -299,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); @@ -329,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; @@ -350,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; @@ -365,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; } @@ -386,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); @@ -399,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); @@ -417,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 @@ -503,7 +610,6 @@ public class MobileInput extends InputHandler implements GestureListener{ //reset state when not placing if(mode == none){ - selecting = false; lineMode = false; } @@ -520,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; @@ -531,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()); @@ -582,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; @@ -591,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/PlaceMode.java b/core/src/io/anuke/mindustry/input/PlaceMode.java index 8eb6bb5105..5ac66c5220 100644 --- a/core/src/io/anuke/mindustry/input/PlaceMode.java +++ b/core/src/io/anuke/mindustry/input/PlaceMode.java @@ -1,5 +1,5 @@ package io.anuke.mindustry.input; enum PlaceMode{ - none, breaking, placing + none, breaking, placing, schematicSelect } 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 c9adc28482..4dc253672b 100644 --- a/core/src/io/anuke/mindustry/io/JsonIO.java +++ b/core/src/io/anuke/mindustry/io/JsonIO.java @@ -4,6 +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.game.*; import io.anuke.mindustry.type.*; import io.anuke.mindustry.world.*; @@ -18,7 +19,7 @@ public class JsonIO{ @Override public void writeValue(Object value, Class knownType, Class elementType){ - if(value instanceof MappableContent){ + if(value instanceof io.anuke.mindustry.ctype.MappableContent){ try{ getWriter().value(((MappableContent)value).name); }catch(IOException e){ diff --git a/core/src/io/anuke/mindustry/io/LegacyMapIO.java b/core/src/io/anuke/mindustry/io/LegacyMapIO.java index 31ebe0403d..4d62f6b63d 100644 --- a/core/src/io/anuke/mindustry/io/LegacyMapIO.java +++ b/core/src/io/anuke/mindustry/io/LegacyMapIO.java @@ -1,25 +1,21 @@ package io.anuke.mindustry.io; import io.anuke.arc.collection.*; -import io.anuke.arc.files.FileHandle; -import io.anuke.arc.graphics.Color; -import io.anuke.arc.graphics.Pixmap; -import io.anuke.arc.util.Pack; -import io.anuke.arc.util.Structs; -import io.anuke.arc.util.serialization.Json; -import io.anuke.mindustry.content.Blocks; -import io.anuke.mindustry.game.SpawnGroup; -import io.anuke.mindustry.game.Team; -import io.anuke.mindustry.io.MapIO.TileProvider; -import io.anuke.mindustry.maps.Map; -import io.anuke.mindustry.type.ContentType; +import io.anuke.arc.files.*; +import io.anuke.arc.graphics.*; +import io.anuke.arc.util.*; +import io.anuke.arc.util.serialization.*; +import io.anuke.mindustry.content.*; +import io.anuke.mindustry.game.*; +import io.anuke.mindustry.io.MapIO.*; +import io.anuke.mindustry.maps.*; +import io.anuke.mindustry.type.*; import io.anuke.mindustry.world.*; -import io.anuke.mindustry.world.LegacyColorMapper.LegacyBlock; -import io.anuke.mindustry.world.blocks.BlockPart; -import io.anuke.mindustry.world.blocks.Floor; +import io.anuke.mindustry.world.LegacyColorMapper.*; +import io.anuke.mindustry.world.blocks.*; import java.io.*; -import java.util.zip.InflaterInputStream; +import java.util.zip.*; import static io.anuke.mindustry.Vars.*; @@ -208,20 +204,6 @@ public class LegacyMapIO{ //place core if(color == Color.rgba8888(Color.green)){ - for(int dx = 0; dx < 3; dx++){ - for(int dy = 0; dy < 3; dy++){ - int worldx = dx - 1 + x; - int worldy = dy - 1 + y; - - //multiblock parts - if(Structs.inBounds(worldx, worldy, pixmap.getWidth(), pixmap.getHeight())){ - Tile write = tiles[worldx][worldy]; - write.setBlock(BlockPart.get(dx - 1, dy - 1)); - write.setTeam(Team.sharded); - } - } - } - //actual core parts tile.setBlock(Blocks.coreShard); tile.setTeam(Team.sharded); diff --git a/core/src/io/anuke/mindustry/io/MapIO.java b/core/src/io/anuke/mindustry/io/MapIO.java index 7d14c210d9..da24c1d8d7 100644 --- a/core/src/io/anuke/mindustry/io/MapIO.java +++ b/core/src/io/anuke/mindustry/io/MapIO.java @@ -6,6 +6,7 @@ import io.anuke.arc.graphics.*; import io.anuke.arc.graphics.Pixmap.*; import io.anuke.arc.util.io.*; import io.anuke.mindustry.content.*; +import io.anuke.mindustry.core.*; import io.anuke.mindustry.game.*; import io.anuke.mindustry.maps.*; import io.anuke.mindustry.world.*; diff --git a/core/src/io/anuke/mindustry/io/SaveIO.java b/core/src/io/anuke/mindustry/io/SaveIO.java index 8a6035363a..341682746f 100644 --- a/core/src/io/anuke/mindustry/io/SaveIO.java +++ b/core/src/io/anuke/mindustry/io/SaveIO.java @@ -34,37 +34,23 @@ public class SaveIO{ return versions.get(version); } - public static void saveToSlot(int slot){ - FileHandle file = fileFor(slot); + public static void save(FileHandle file){ boolean exists = file.exists(); if(exists) file.moveTo(backupFileFor(file)); try{ - write(fileFor(slot)); + write(file); }catch(Exception e){ if(exists) backupFileFor(file).moveTo(file); throw new RuntimeException(e); } } - public static void loadFromSlot(int slot) throws SaveException{ - load(fileFor(slot)); + public static DataInputStream getStream(FileHandle file){ + return new DataInputStream(new InflaterInputStream(file.read(bufferSize))); } - public static DataInputStream getSlotStream(int slot){ - return new DataInputStream(new InflaterInputStream(fileFor(slot).read(bufferSize))); - } - - public static DataInputStream getBackupSlotStream(int slot){ - return new DataInputStream(new InflaterInputStream(backupFileFor(fileFor(slot)).read(bufferSize))); - } - - public static boolean isSaveValid(int slot){ - try{ - getMeta(slot); - return true; - }catch(Exception e){ - return false; - } + public static DataInputStream getBackupStream(FileHandle file){ + return new DataInputStream(new InflaterInputStream(backupFileFor(file).read(bufferSize))); } public static boolean isSaveValid(FileHandle file){ @@ -85,11 +71,11 @@ public class SaveIO{ } } - public static SaveMeta getMeta(int slot){ + public static SaveMeta getMeta(FileHandle file){ try{ - return getMeta(getSlotStream(slot)); + return getMeta(getStream(file)); }catch(Exception e){ - return getMeta(getBackupSlotStream(slot)); + return getMeta(getBackupStream(file)); } } @@ -167,6 +153,7 @@ public class SaveIO{ }catch(Exception e){ throw new SaveException(e); }finally{ + world.setGenerating(false); content.setTemporaryMapper(null); } } diff --git a/core/src/io/anuke/mindustry/io/SaveVersion.java b/core/src/io/anuke/mindustry/io/SaveVersion.java index f1fceb5ce3..f3b994abae 100644 --- a/core/src/io/anuke/mindustry/io/SaveVersion.java +++ b/core/src/io/anuke/mindustry/io/SaveVersion.java @@ -3,6 +3,9 @@ package io.anuke.mindustry.io; import io.anuke.arc.collection.*; import io.anuke.arc.util.*; import io.anuke.arc.util.io.*; +import io.anuke.mindustry.content.*; +import io.anuke.mindustry.core.*; +import io.anuke.mindustry.ctype.*; import io.anuke.mindustry.entities.*; import io.anuke.mindustry.entities.traits.*; import io.anuke.mindustry.game.*; @@ -164,6 +167,7 @@ public abstract class SaveVersion extends SaveFileReader{ short floorid = stream.readShort(); short oreid = stream.readShort(); int consecutives = stream.readUnsignedByte(); + if(content.block(floorid) == Blocks.air) floorid = Blocks.stone.id; context.create(x, y, floorid, oreid, (short)0); @@ -180,6 +184,7 @@ public abstract class SaveVersion extends SaveFileReader{ int x = i % width, y = i / width; Block block = content.block(stream.readShort()); Tile tile = context.tile(x, y); + if(block == null) block = Blocks.air; tile.setBlock(block); if(tile.entity != null){ diff --git a/core/src/io/anuke/mindustry/io/TypeIO.java b/core/src/io/anuke/mindustry/io/TypeIO.java index 1d17e0bc44..b5864b5e5b 100644 --- a/core/src/io/anuke/mindustry/io/TypeIO.java +++ b/core/src/io/anuke/mindustry/io/TypeIO.java @@ -11,7 +11,7 @@ import io.anuke.mindustry.entities.traits.BuilderTrait.BuildRequest; import io.anuke.mindustry.entities.traits.ShooterTrait; import io.anuke.mindustry.entities.type.*; import io.anuke.mindustry.entities.units.*; -import io.anuke.mindustry.game.Team; +import io.anuke.mindustry.game.*; import io.anuke.mindustry.net.Administration.TraceInfo; import io.anuke.mindustry.net.Packets.AdminAction; import io.anuke.mindustry.net.Packets.KickReason; @@ -126,6 +126,8 @@ public class TypeIO{ if(!request.breaking){ buffer.putShort(request.block.id); buffer.put((byte)request.rotation); + buffer.put(request.hasConfig ? (byte)1 : 0); + buffer.putInt(request.config); } } } @@ -148,7 +150,12 @@ public class TypeIO{ }else{ //place short block = buffer.getShort(); byte rotation = buffer.get(); + boolean hasConfig = buffer.get() == 1; + int config = buffer.getInt(); currentRequest = new BuildRequest(Pos.x(position), Pos.y(position), rotation, content.block(block)); + if(hasConfig){ + currentRequest.configure(config); + } } reqs[i] = (currentRequest); @@ -167,6 +174,23 @@ public class TypeIO{ return KickReason.values()[buffer.get()]; } + @WriteClass(Rules.class) + public static void writeRules(ByteBuffer buffer, Rules rules){ + String string = JsonIO.write(rules); + byte[] bytes = string.getBytes(charset); + buffer.putInt(bytes.length); + buffer.put(bytes); + } + + @ReadClass(Rules.class) + public static Rules readRules(ByteBuffer buffer){ + int length = buffer.getInt(); + byte[] bytes = new byte[length]; + buffer.get(bytes); + String string = new String(bytes, charset); + return JsonIO.read(Rules.class, string); + } + @WriteClass(Team.class) public static void writeTeam(ByteBuffer buffer, Team reason){ buffer.put((byte)reason.ordinal()); 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/io/versions/Save2.java b/core/src/io/anuke/mindustry/io/versions/Save2.java index 4fb9954b0c..65c531c66e 100644 --- a/core/src/io/anuke/mindustry/io/versions/Save2.java +++ b/core/src/io/anuke/mindustry/io/versions/Save2.java @@ -1,9 +1,9 @@ package io.anuke.mindustry.io.versions; import io.anuke.mindustry.entities.traits.*; -import io.anuke.mindustry.game.*; import io.anuke.mindustry.io.*; import io.anuke.mindustry.type.*; +import io.anuke.mindustry.type.TypeID; import java.io.*; diff --git a/core/src/io/anuke/mindustry/maps/Map.java b/core/src/io/anuke/mindustry/maps/Map.java index 378f3c8ff6..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){ @@ -181,12 +181,14 @@ public class Map implements Comparable, Publishable{ @Override public FileHandle createSteamFolder(String id){ - return null; + FileHandle mapFile = tmpDirectory.child("map_" + id).child("map.msav"); + file.copyTo(mapFile); + return mapFile.parent(); } @Override public FileHandle createSteamPreview(String id){ - return null; + return previewFile(); } @Override diff --git a/core/src/io/anuke/mindustry/maps/MapPreviewLoader.java b/core/src/io/anuke/mindustry/maps/MapPreviewLoader.java index da229addce..ad0afea0e2 100644 --- a/core/src/io/anuke/mindustry/maps/MapPreviewLoader.java +++ b/core/src/io/anuke/mindustry/maps/MapPreviewLoader.java @@ -8,7 +8,7 @@ import io.anuke.arc.files.*; import io.anuke.arc.graphics.*; import io.anuke.arc.util.*; import io.anuke.mindustry.*; -import io.anuke.mindustry.game.*; +import io.anuke.mindustry.ctype.Content; public class MapPreviewLoader extends TextureLoader{ diff --git a/core/src/io/anuke/mindustry/maps/Maps.java b/core/src/io/anuke/mindustry/maps/Maps.java index b19f3628ea..beceeb1382 100644 --- a/core/src/io/anuke/mindustry/maps/Maps.java +++ b/core/src/io/anuke/mindustry/maps/Maps.java @@ -6,15 +6,16 @@ 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.*; import io.anuke.arc.util.async.*; import io.anuke.arc.util.io.*; import io.anuke.arc.util.serialization.*; import io.anuke.mindustry.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.*; @@ -222,10 +223,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())){ @@ -356,7 +357,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! @@ -371,7 +372,7 @@ public class Maps{ } }); }catch(Exception e){ - failed.accept(e); + failed.get(e); Log.err("Failed to generate preview!", e); } } diff --git a/core/src/io/anuke/mindustry/maps/filters/FilterOption.java b/core/src/io/anuke/mindustry/maps/filters/FilterOption.java index 038819b122..f1a63c0a37 100644 --- a/core/src/io/anuke/mindustry/maps/filters/FilterOption.java +++ b/core/src/io/anuke/mindustry/maps/filters/FilterOption.java @@ -2,13 +2,13 @@ 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.*; import io.anuke.mindustry.*; import io.anuke.mindustry.content.*; -import io.anuke.mindustry.game.*; +import io.anuke.mindustry.ui.Cicon; import io.anuke.mindustry.ui.dialogs.*; import io.anuke.mindustry.world.*; import io.anuke.mindustry.world.blocks.*; @@ -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(Cicon.full)); - public static final Predicate wallsOnly = b -> (!b.synthetic() && !(b instanceof Floor)) && Core.atlas.isFound(b.icon(Cicon.full)); - public static final Predicate floorsOptional = b -> b == Blocks.air || ((b instanceof Floor && !(b instanceof OverlayFloor)) && Core.atlas.isFound(b.icon(Cicon.full))); - public static final Predicate wallsOptional = b -> b == Blocks.air || ((!b.synthetic() && !(b instanceof Floor)) && Core.atlas.isFound(b.icon(Cicon.full))); - public static final Predicate wallsOresOptional = b -> b == Blocks.air || (((!b.synthetic() && !(b instanceof Floor)) || (b instanceof OverlayFloor)) && Core.atlas.isFound(b.icon(Cicon.full))); - public static final Predicate oresOnly = b -> b instanceof OverlayFloor && Core.atlas.isFound(b.icon(Cicon.full)); - public static final Predicate anyOptional = b -> floorsOnly.test(b) || wallsOnly.test(b) || oresOnly.test(b) || b == Blocks.air; + public 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; @@ -76,16 +76,16 @@ public abstract class FilterOption{ @Override public void build(Table table){ - table.addButton(b -> b.addImage(supplier.get().icon(Cicon.small)).update(i -> ((TextureRegionDrawable)i.getDrawable()) - .setRegion(supplier.get() == Blocks.air ? Core.atlas.find("icon-none") : supplier.get().icon(Cicon.small))).size(8 * 3), () -> { + table.addButton(b -> b.addImage(supplier.get().icon(io.anuke.mindustry.ui.Cicon.small)).update(i -> ((TextureRegionDrawable)i.getDrawable()) + .setRegion(supplier.get() == Blocks.air ? Core.atlas.find("icon-none") : supplier.get().icon(io.anuke.mindustry.ui.Cicon.small))).size(8 * 3), () -> { FloatingDialog dialog = new FloatingDialog(""); dialog.setFillParent(false); int i = 0; for(Block block : Vars.content.blocks()){ - if(!filter.test(block)) continue; + 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 08092e7fdb..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.*; @@ -39,6 +40,9 @@ public class MapGenerator extends Generator{ this.decorations.addAll(decor); return this; } + public void removePrefix(String name){ + this.mapName = this.mapName.substring(name.length() + 1); + } { decor(new Decoration(Blocks.snow, Blocks.snowrock, 0.01), new Decoration(Blocks.ignarock, Blocks.pebbles, 0.03f)); @@ -49,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; @@ -146,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 4ee77fad1f..e8b242223d 100644 --- a/core/src/io/anuke/mindustry/mod/ContentParser.java +++ b/core/src/io/anuke/mindustry/mod/ContentParser.java @@ -2,10 +2,11 @@ package io.anuke.mindustry.mod; import io.anuke.arc.*; import io.anuke.arc.audio.*; +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.*; @@ -16,6 +17,7 @@ import io.anuke.arc.util.serialization.Json.*; import io.anuke.mindustry.*; import io.anuke.mindustry.content.*; import io.anuke.mindustry.content.TechTree.*; +import io.anuke.mindustry.ctype.*; import io.anuke.mindustry.entities.Effects.*; import io.anuke.mindustry.entities.bullet.*; import io.anuke.mindustry.entities.type.*; @@ -37,7 +39,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()){ @@ -51,9 +65,11 @@ public class ContentParser{ }); put(Sound.class, (type, data) -> { if(fieldOpt(Sounds.class, data) != null) return fieldOpt(Sounds.class, data); + if(Vars.headless) return new MockSound(); - String path = "sounds/" + data.asString() + (Vars.ios ? ".mp3" : ".ogg"); - ProxySound sound = new ProxySound(); + String name = "sounds/" + data.asString(); + String path = Vars.tree.get(name + ".ogg").exists() && !Vars.ios ? name + ".ogg" : name + ".mp3"; + ModLoadingSound sound = new ModLoadingSound(); Core.assets.load(path, Sound.class).loaded = result -> { sound.sound = (Sound)result; }; @@ -66,11 +82,18 @@ public class ContentParser{ readFields(obj, data); return obj; }); + put(Weapon.class, (type, data) -> { + Weapon weapon = new Weapon(); + readFields(weapon, data); + weapon.name = currentMod.name + "-" + weapon.name; + return weapon; + }); }}; /** Stores things that need to be parsed fully, e.g. reading fields of content. * This is done to accomodate binding of content names first.*/ private Array reads = new Array<>(); private Array postreads = new Array<>(); + private ObjectSet toBeParsed = new ObjectSet<>(); private LoadedMod currentMod; private Content currentContent; @@ -118,11 +141,11 @@ public class ContentParser{ block = Vars.content.getByName(ContentType.block, name); if(value.has("type")){ - throw new IllegalArgumentException("When overwriting an existing block, you must not re-declared its type. The original type will be used. Block: " + name); + throw new IllegalArgumentException("When overwriting an existing block, you must not re-declare its type. The original type will be used. Block: " + name); } }else{ //TODO generate dynamically instead of doing.. this - Class type = resolve(value.getString("type"), + Class type = resolve(getType(value), "io.anuke.mindustry.world", "io.anuke.mindustry.world.blocks", "io.anuke.mindustry.world.blocks.defense", @@ -199,7 +222,7 @@ public class ContentParser{ ContentType.unit, (TypeParser)(mod, name, value) -> { readBundle(ContentType.unit, name, value); - Class type = resolve(value.getString("type"), "io.anuke.mindustry.entities.type.base"); + Class type = resolve(getType(value), "io.anuke.mindustry.entities.type.base"); UnitType unit = new UnitType(mod + "-" + name, supply(type)); currentContent = unit; read(() -> readFields(unit, value, true)); @@ -212,6 +235,18 @@ public class ContentParser{ ContentType.zone, parser(ContentType.zone, Zone::new) ); + private String getString(JsonValue value, String key){ + if(value.has(key)){ + return value.getString(key); + }else{ + throw new IllegalArgumentException((currentContent == null ? "" : currentContent.sourceFile + ": ") + "You are missing a \"" + key + "\". It must be added before the file can be parsed."); + } + } + + private String getType(JsonValue value){ + return getString(value, "type"); + } + private T find(ContentType type, String name){ Content c = Vars.content.getByName(type, name); if(c == null) c = Vars.content.getByName(type, currentMod.name + "-" + name); @@ -219,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){ @@ -291,6 +326,7 @@ public class ContentParser{ } reads.clear(); postreads.clear(); + toBeParsed.clear(); } /** @@ -306,6 +342,9 @@ public class ContentParser{ init(); } + //add comments starting with //, but ignore links + json = json.replace("http://", "http:~~").replace("https://", "https:~~").replaceAll("//.*?\n","\n").replace("http:~~", "http://").replace("https:~~", "https://"); + JsonValue value = parser.fromJson(null, json); if(!parsers.containsKey(type)){ throw new SerializationException("No parsers for content type '" + type + "'"); @@ -314,6 +353,7 @@ public class ContentParser{ currentMod = mod; boolean exists = Vars.content.getByName(type, name) != null; Content c = parsers.get(type).parse(mod.name, name, value); + toBeParsed.add(c); if(!exists){ c.sourceFile = file; c.mod = mod; @@ -341,7 +381,7 @@ public class ContentParser{ } } - private Supplier supply(Class type){ + private Prov supply(Class type){ try{ java.lang.reflect.Constructor cons = type.getDeclaredConstructor(); return () -> { @@ -380,7 +420,7 @@ public class ContentParser{ } private void checkNullFields(Object object){ - if(object instanceof Number || object instanceof String) return; + if(object instanceof Number || object instanceof String || toBeParsed.contains(object)) return; parser.getFields(object.getClass()).values().toArray().each(field -> { try{ @@ -401,6 +441,7 @@ public class ContentParser{ } private void readFields(Object object, JsonValue jsonMap){ + toBeParsed.remove(object); Class type = object.getClass(); ObjectMap fields = parser.getFields(type); for(JsonValue child = jsonMap.child; child != null; child = child.next){ diff --git a/core/src/io/anuke/mindustry/mod/ModCrashHandler.java b/core/src/io/anuke/mindustry/mod/ModCrashHandler.java new file mode 100644 index 0000000000..77f3c68aba --- /dev/null +++ b/core/src/io/anuke/mindustry/mod/ModCrashHandler.java @@ -0,0 +1,67 @@ +package io.anuke.mindustry.mod; + +import io.anuke.arc.*; +import io.anuke.arc.collection.*; +import io.anuke.arc.graphics.*; +import io.anuke.arc.graphics.g2d.*; +import io.anuke.arc.math.*; +import io.anuke.arc.scene.ui.layout.*; +import io.anuke.arc.util.*; +import io.anuke.mindustry.graphics.*; +import io.anuke.mindustry.mod.Mods.*; +import io.anuke.mindustry.ui.*; + +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."; + GlyphLayout layout = new GlyphLayout(); + Core.atlas = TextureAtlas.blankAtlas(); + Colors.put("accent", Pal.accent); + + Core.app.addListener(new ApplicationListener(){ + @Override + public void update(){ + Core.graphics.clear(0.1f, 0.1f, 0.1f, 1f); + float rad = Math.min(Core.graphics.getWidth(), Core.graphics.getHeight()) / 2f / 1.3f; + Draw.color(Color.scarlet, Color.black, Mathf.absin(Core.graphics.getFrameId(), 15f, 0.6f)); + Lines.stroke(Scl.scl(40f)); + //Lines.poly2(Core.graphics.getWidth()/2f, Core.graphics.getHeight()/2f, 3, rad, 0f); + float cx = Core.graphics.getWidth()/2f, cy = Core.graphics.getHeight()/2f; + for(int i = 0; i < 3; i++){ + float angle1 = i * 120f + 90f; + float angle2 = (i + 1) * 120f + 90f; + Tmp.v1.trnsExact(angle1, rad - Lines.getStroke()/2f).add(cx, cy); + Tmp.v2.trnsExact(angle2, rad - Lines.getStroke()/2f).add(cx, cy); + Tmp.v3.trnsExact(angle1, rad + Lines.getStroke()/2f).add(cx, cy); + Tmp.v4.trnsExact(angle2, rad + Lines.getStroke()/2f).add(cx, cy); + Fill.quad(Tmp.v1.x, Tmp.v1.y, Tmp.v2.x, Tmp.v2.y, Tmp.v4.x, Tmp.v4.y, Tmp.v3.x, Tmp.v3.y); + } + Lines.lineAngleCenter(Core.graphics.getWidth()/2f, Core.graphics.getHeight()/2f - Scl.scl(5f), 90f, rad/3.1f); + Fill.square(Core.graphics.getWidth()/2f, Core.graphics.getHeight()/2f + rad/2f - Scl.scl(15f), Lines.getStroke()/2f); + Draw.reset(); + + Fonts.outline.getData().markupEnabled = true; + layout.setText(Fonts.outline, text, Color.white, Core.graphics.getWidth(), Align.left, true); + Fonts.outline.draw(text, Core.graphics.getWidth()/2f - layout.width/2f, Core.graphics.getHeight() - Scl.scl(50f), Core.graphics.getWidth(), Align.left, true); + + layout.setText(Fonts.outline, bottom, Color.white, Core.graphics.getWidth(), Align.left, true); + Fonts.outline.draw(bottom, Core.graphics.getWidth()/2f - layout.width/2f, layout.height + Scl.scl(10f), Core.graphics.getWidth(), Align.left, true); + Draw.flush(); + } + + @Override + public void resize(int width, int height){ + Draw.proj().setOrtho(0, 0, width, height); + } + }); + }else{ + throw new RuntimeException(t); + } + } +} diff --git a/core/src/io/anuke/mindustry/mod/ProxySound.java b/core/src/io/anuke/mindustry/mod/ModLoadingSound.java similarity index 98% rename from core/src/io/anuke/mindustry/mod/ProxySound.java rename to core/src/io/anuke/mindustry/mod/ModLoadingSound.java index a71e77e2c6..43d30f4617 100644 --- a/core/src/io/anuke/mindustry/mod/ProxySound.java +++ b/core/src/io/anuke/mindustry/mod/ModLoadingSound.java @@ -5,7 +5,7 @@ import io.anuke.arc.audio.mock.*; import io.anuke.arc.math.geom.*; import io.anuke.arc.util.ArcAnnotate.*; -public class ProxySound implements Sound{ +public class ModLoadingSound implements Sound{ public @NonNull Sound sound = new MockSound(); @Override diff --git a/core/src/io/anuke/mindustry/mod/Mods.java b/core/src/io/anuke/mindustry/mod/Mods.java index 2692581d2a..5e8837bed9 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.*; @@ -14,7 +14,9 @@ import io.anuke.arc.util.ArcAnnotate.*; import io.anuke.arc.util.*; import io.anuke.arc.util.io.*; import io.anuke.arc.util.serialization.*; -import io.anuke.mindustry.game.*; +import io.anuke.mindustry.core.*; +import io.anuke.mindustry.ctype.*; +import io.anuke.mindustry.game.EventType.*; import io.anuke.mindustry.gen.*; import io.anuke.mindustry.plugin.*; import io.anuke.mindustry.type.*; @@ -60,7 +62,7 @@ public class Mods implements Loadable{ file.copyTo(dest); try{ - loaded.add(loadMod(dest, false)); + loaded.add(loadMod(dest)); requiresReload = true; }catch(IOException e){ dest.delete(); @@ -148,12 +150,18 @@ 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); requiresReload = true; } @@ -161,14 +169,16 @@ public class Mods implements Loadable{ return requiresReload; } - /** Loads all mods from the folder, but does call any methods on them.*/ + /** Loads all mods from the folder, but does not call any methods on them.*/ public void load(){ for(FileHandle file : modDirectory.list()){ if(!file.extension().equals("jar") && !file.extension().equals("zip") && !(file.isDirectory() && file.child("mod.json").exists())) continue; + + Log.debug("[Mods] Loading mod {0}", file); try{ - LoadedMod mod = loadMod(file, false); - if(mod.enabled()){ + LoadedMod mod = loadMod(file); + if(mod.enabled() || headless){ loaded.add(mod); }else{ disabled.add(mod); @@ -182,26 +192,74 @@ public class Mods implements Loadable{ //load workshop mods now for(FileHandle file : platform.getWorkshopContent(LoadedMod.class)){ try{ - LoadedMod mod = loadMod(file, true); + LoadedMod mod = loadMod(file); if(mod.enabled()){ loaded.add(mod); }else{ disabled.add(mod); } + mod.addSteamID(file.name()); }catch(Exception e){ Log.err("Failed to load mod workshop file {0}. Skipping.", file); Log.err(e); } } + resolveDependencies(); //sort mods to make sure servers handle them properly. loaded.sort(Structs.comparing(m -> m.name)); buildFiles(); } - private void buildFiles(){ + private void resolveDependencies(){ + for(LoadedMod mod : Array.withArrays(loaded, disabled)){ + updateDependencies(mod); + } + + disabled.addAll(loaded.select(LoadedMod::hasUnmetDependencies)); + loaded.removeAll(LoadedMod::hasUnmetDependencies); + disabled.each(mod -> setEnabled(mod, false)); + disabled.distinct(); + loaded.distinct(); + } + + private void updateDependencies(LoadedMod mod){ + mod.dependencies.clear(); + mod.missingDependencies.clear(); + mod.dependencies = mod.meta.dependencies.map(this::locateMod); + + for(int i = 0; i < mod.dependencies.size; i++){ + if(mod.dependencies.get(i) == null){ + mod.missingDependencies.add(mod.meta.dependencies.get(i)); + } + } + } + + private void topoSort(LoadedMod mod, Array stack, ObjectSet visited){ + visited.add(mod); + mod.dependencies.each(m -> !visited.contains(m), m -> topoSort(m, stack, visited)); + stack.add(mod); + } + + /** @return mods ordered in the correct way needed for dependencies. */ + private Array orderedMods(){ + ObjectSet visited = new ObjectSet<>(); + Array result = new Array<>(); for(LoadedMod mod : loaded){ + if(!visited.contains(mod)){ + topoSort(mod, result, visited); + } + } + return result; + } + + private LoadedMod locateMod(String name){ + return loaded.find(mod -> mod.name.equals(name)); + } + + private void buildFiles(){ + for(LoadedMod mod : orderedMods()){ boolean zipFolder = !mod.file.isDirectory() && mod.root.parent() != null; String parentName = zipFolder ? mod.root.name() : null; for(FileHandle file : mod.root.list()){ @@ -244,14 +302,13 @@ public class Mods implements Loadable{ /** Reloads all mod content. How does this even work? I refuse to believe that it functions correctly.*/ public void reloadContent(){ //epic memory leak + //TODO make it less epic Core.atlas = new TextureAtlas(Core.files.internal("sprites/sprites.atlas")); + loaded.clear(); disabled.clear(); load(); - buildFiles(); - Musics.dispose(); Sounds.dispose(); - Musics.load(); Sounds.load(); Core.assets.finishLoading(); content.clear(); @@ -263,35 +320,62 @@ public class Mods implements Loadable{ content.loadColors(); data.load(); requiresReload = false; + + Events.fire(new ContentReloadEvent()); } /** Creates all the content found in mod files. */ public void loadContent(){ - for(LoadedMod mod : loaded){ - 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.info("[{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); - } - } + 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()){ + 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")){ + 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(); @@ -322,15 +406,18 @@ public class Mods implements Loadable{ /** Makes a mod enabled or disabled. shifts it.*/ public void setEnabled(LoadedMod mod, boolean enabled){ if(mod.enabled() != enabled){ - Core.settings.putSave(mod.name + "-enabled", enabled); + Core.settings.putSave("mod-" + mod.name + "-enabled", enabled); + Core.settings.save(); requiresReload = true; if(!enabled){ loaded.remove(mod); - disabled.add(mod); + if(!disabled.contains(mod)) disabled.add(mod); }else{ - loaded.add(mod); + if(!loaded.contains(mod)) loaded.add(mod); disabled.remove(mod); } + loaded.each(this::updateDependencies); + disabled.each(this::updateDependencies); } } @@ -348,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){ @@ -369,9 +456,11 @@ public class Mods implements Loadable{ } } + setEnabled(mod, false); + 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); } @@ -387,7 +476,7 @@ public class Mods implements Loadable{ /** Loads a mod file+meta, but does not add it to the list. * Note that directories can be loaded as mods.*/ - private LoadedMod loadMod(FileHandle sourceFile, boolean workshop) throws Exception{ + private LoadedMod loadMod(FileHandle sourceFile) throws Exception{ FileHandle zip = sourceFile.isDirectory() ? sourceFile : new ZipFileHandle(sourceFile); if(zip.list().length == 1 && zip.list()[0].isDirectory()){ zip = zip.list()[0]; @@ -453,6 +542,10 @@ public class Mods implements Loadable{ public final String name; /** This mod's metadata. */ public final ModMeta meta; + /** This mod's dependencies as already-loaded mods. */ + public Array dependencies = new Array<>(); + /** All missing dependencies of this mod as strings. */ + public Array missingDependencies = new Array<>(); public LoadedMod(FileHandle file, FileHandle root, Mod mod, ModMeta meta){ this.root = root; @@ -463,7 +556,11 @@ public class Mods implements Loadable{ } public boolean enabled(){ - return Core.settings.getBool(name + "-enabled", true); + return Core.settings.getBool("mod-" + name + "-enabled", true); + } + + public boolean hasUnmetDependencies(){ + return !missingDependencies.isEmpty(); } @Override @@ -536,7 +633,7 @@ public class Mods implements Loadable{ /** Plugin metadata information.*/ public static class ModMeta{ public String name, author, description, version, main; - public String[] dependencies = {}; //TODO implement + public Array dependencies = Array.with(); /** Hidden mods are only server-side or client-side, and do not support adding new content. */ public boolean hidden; } @@ -557,5 +654,13 @@ public class Mods implements Loadable{ this.mod = content.mod; } } + + public ModLoadException(@Nullable Content content, Throwable cause){ + super(cause); + this.content = content; + if(content != null){ + this.mod = content.mod; + } + } } } 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 332371ff58..21b12bf3d8 100644 --- a/core/src/io/anuke/mindustry/net/CrashSender.java +++ b/core/src/io/anuke/mindustry/net/CrashSender.java @@ -4,14 +4,14 @@ 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.*; import io.anuke.arc.util.serialization.JsonValue.*; import io.anuke.arc.util.serialization.JsonWriter.*; import io.anuke.mindustry.*; -import io.anuke.mindustry.game.*; +import io.anuke.mindustry.core.*; import java.io.*; import java.text.*; @@ -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/NetworkIO.java b/core/src/io/anuke/mindustry/net/NetworkIO.java index 9bc881f08c..2e82e83fa1 100644 --- a/core/src/io/anuke/mindustry/net/NetworkIO.java +++ b/core/src/io/anuke/mindustry/net/NetworkIO.java @@ -2,6 +2,7 @@ package io.anuke.mindustry.net; import io.anuke.arc.*; import io.anuke.arc.util.*; +import io.anuke.mindustry.core.*; import io.anuke.mindustry.entities.type.*; import io.anuke.mindustry.game.*; import io.anuke.mindustry.io.*; @@ -27,6 +28,7 @@ public class NetworkIO{ stream.writeInt(player.id); player.write(stream); + SaveIO.getSaveWriter().writeContentHeader(stream); SaveIO.getSaveWriter().writeMap(stream); }catch(IOException e){ throw new RuntimeException(e); @@ -50,9 +52,12 @@ public class NetworkIO{ player.resetID(id); player.add(); + SaveIO.getSaveWriter().readContentHeader(stream); SaveIO.getSaveWriter().readMap(stream, world.context); }catch(IOException e){ throw new RuntimeException(e); + }finally{ + content.setTemporaryMapper(null); } } diff --git a/core/src/io/anuke/mindustry/net/Packets.java b/core/src/io/anuke/mindustry/net/Packets.java index 760728d945..0a39de51ef 100644 --- a/core/src/io/anuke/mindustry/net/Packets.java +++ b/core/src/io/anuke/mindustry/net/Packets.java @@ -1,12 +1,12 @@ package io.anuke.mindustry.net; -import io.anuke.arc.Core; +import io.anuke.arc.*; import io.anuke.arc.collection.*; -import io.anuke.arc.util.serialization.Base64Coder; -import io.anuke.mindustry.game.Version; -import io.anuke.mindustry.io.TypeIO; +import io.anuke.arc.util.serialization.*; +import io.anuke.mindustry.core.*; +import io.anuke.mindustry.io.*; -import java.nio.ByteBuffer; +import java.nio.*; /** * Class for storing all packets. 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/Item.java b/core/src/io/anuke/mindustry/type/Item.java index 8dcefc9f75..421730009e 100644 --- a/core/src/io/anuke/mindustry/type/Item.java +++ b/core/src/io/anuke/mindustry/type/Item.java @@ -4,7 +4,7 @@ import io.anuke.arc.*; import io.anuke.arc.collection.*; import io.anuke.arc.graphics.*; import io.anuke.arc.scene.ui.layout.*; -import io.anuke.mindustry.game.*; +import io.anuke.mindustry.ctype.UnlockableContent; import io.anuke.mindustry.ui.*; import io.anuke.mindustry.world.blocks.*; diff --git a/core/src/io/anuke/mindustry/type/Liquid.java b/core/src/io/anuke/mindustry/type/Liquid.java index dd5e7bf63f..a5df56de8f 100644 --- a/core/src/io/anuke/mindustry/type/Liquid.java +++ b/core/src/io/anuke/mindustry/type/Liquid.java @@ -3,13 +3,16 @@ 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.game.*; +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; /** 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 +23,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 +41,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 136018acc2..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.game.*; -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/Mech.java b/core/src/io/anuke/mindustry/type/Mech.java index be58d1cfe3..f0931bdd7a 100644 --- a/core/src/io/anuke/mindustry/type/Mech.java +++ b/core/src/io/anuke/mindustry/type/Mech.java @@ -4,8 +4,9 @@ import io.anuke.arc.Core; import io.anuke.arc.graphics.Color; import io.anuke.arc.graphics.g2d.TextureRegion; import io.anuke.arc.scene.ui.layout.Table; +import io.anuke.arc.util.ArcAnnotate.*; import io.anuke.mindustry.entities.type.Player; -import io.anuke.mindustry.game.UnlockableContent; +import io.anuke.mindustry.ctype.UnlockableContent; import io.anuke.mindustry.graphics.Pal; import io.anuke.mindustry.ui.ContentDisplay; @@ -31,7 +32,7 @@ public class Mech extends UnlockableContent{ public float compoundSpeed, compoundSpeedBoost; public float weaponOffsetX, weaponOffsetY, engineOffset = 5f, engineSize = 2.5f; - public Weapon weapon; + public @NonNull Weapon weapon; public TextureRegion baseRegion, legRegion, region; diff --git a/core/src/io/anuke/mindustry/type/StatusEffect.java b/core/src/io/anuke/mindustry/type/StatusEffect.java index ae74288758..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.*; @@ -11,7 +11,7 @@ import io.anuke.mindustry.entities.Effects; import io.anuke.mindustry.entities.Effects.Effect; import io.anuke.mindustry.entities.type.Unit; import io.anuke.mindustry.entities.units.Statuses.StatusEntry; -import io.anuke.mindustry.game.Content; +import io.anuke.mindustry.ctype.Content; public class StatusEffect extends Content{ public float damageMultiplier = 1f; //damage dealt @@ -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 new file mode 100644 index 0000000000..bd190a7a63 --- /dev/null +++ b/core/src/io/anuke/mindustry/type/TypeID.java @@ -0,0 +1,19 @@ +package io.anuke.mindustry.type; + +import io.anuke.arc.func.*; +import io.anuke.mindustry.ctype.*; +import io.anuke.mindustry.entities.traits.*; + +public class TypeID extends MappableContent{ + public final Prov constructor; + + public TypeID(String name, Prov constructor){ + super(name); + this.constructor = constructor; + } + + @Override + public ContentType getContentType(){ + return ContentType.typeid; + } +} diff --git a/core/src/io/anuke/mindustry/type/UnitType.java b/core/src/io/anuke/mindustry/type/UnitType.java index a2a98d6b45..0345bc38b7 100644 --- a/core/src/io/anuke/mindustry/type/UnitType.java +++ b/core/src/io/anuke/mindustry/type/UnitType.java @@ -3,11 +3,12 @@ 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.*; import io.anuke.mindustry.content.*; +import io.anuke.mindustry.ctype.UnlockableContent; import io.anuke.mindustry.entities.type.*; import io.anuke.mindustry.game.*; import io.anuke.mindustry.gen.*; @@ -15,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; @@ -42,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); } @@ -52,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/Weapon.java b/core/src/io/anuke/mindustry/type/Weapon.java index fd150a55fa..5660718c93 100644 --- a/core/src/io/anuke/mindustry/type/Weapon.java +++ b/core/src/io/anuke/mindustry/type/Weapon.java @@ -20,7 +20,7 @@ import io.anuke.mindustry.gen.*; import static io.anuke.mindustry.Vars.net; public class Weapon{ - public final String name; + public String name; /** minimum cursor distance from player, fixes 'cross-eyed' shooting. */ protected static float minPlayerDist = 20f; @@ -48,7 +48,7 @@ public class Weapon{ /** fraction of velocity that is random */ public float velocityRnd = 0f; /** whether to shoot the weapons in different arms one after another, rather than all at once */ - public boolean roundrobin = false; + public boolean alternate = false; /** randomization of shot length */ public float lengthRand = 0f; /** delay in ticks between shots */ @@ -64,7 +64,7 @@ public class Weapon{ this.name = name; } - protected Weapon(){ + public Weapon(){ //no region this.name = ""; } @@ -125,7 +125,7 @@ public class Weapon{ } public void load(){ - region = Core.atlas.find(name + "-equip", Core.atlas.find("clear")); + region = Core.atlas.find(name + "-equip", Core.atlas.find(name, Core.atlas.find("clear"))); } public void update(ShooterTrait shooter, float pointerX, float pointerY){ @@ -144,7 +144,7 @@ public class Weapon{ public void update(ShooterTrait shooter, float mountX, float mountY, float angle, boolean left){ if(shooter.getTimer().get(shooter.getShootTimer(left), reload)){ - if(roundrobin){ + if(alternate){ shooter.getTimer().reset(shooter.getShootTimer(!left), reload / 2f); } diff --git a/core/src/io/anuke/mindustry/type/WeatherEvent.java b/core/src/io/anuke/mindustry/type/WeatherEvent.java index 385124a1b9..29b6ca0855 100644 --- a/core/src/io/anuke/mindustry/type/WeatherEvent.java +++ b/core/src/io/anuke/mindustry/type/WeatherEvent.java @@ -1,6 +1,6 @@ package io.anuke.mindustry.type; -import io.anuke.mindustry.game.Content; +import io.anuke.mindustry.ctype.Content; //currently unimplemented, see trello for implementation plans public class WeatherEvent extends Content{ diff --git a/core/src/io/anuke/mindustry/type/Zone.java b/core/src/io/anuke/mindustry/type/Zone.java index bfec538d67..c60249b223 100644 --- a/core/src/io/anuke/mindustry/type/Zone.java +++ b/core/src/io/anuke/mindustry/type/Zone.java @@ -2,11 +2,12 @@ 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.*; import io.anuke.mindustry.content.*; +import io.anuke.mindustry.ctype.UnlockableContent; import io.anuke.mindustry.game.EventType.*; import io.anuke.mindustry.game.*; import io.anuke.mindustry.game.Objectives.*; @@ -21,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<>(); @@ -53,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; } } @@ -136,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; @@ -146,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; @@ -171,6 +172,10 @@ public class Zone extends UnlockableContent{ @Override public void init(){ + if(generator instanceof MapGenerator && mod != null){ + ((MapGenerator)generator).removePrefix(mod.name); + } + generator.init(loadout); resources.sort(); diff --git a/core/src/io/anuke/mindustry/ui/Bar.java b/core/src/io/anuke/mindustry/ui/Bar.java index 56c17befae..da4fa7eaf8 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); diff --git a/core/src/io/anuke/mindustry/game/Cicon.java b/core/src/io/anuke/mindustry/ui/Cicon.java similarity index 92% rename from core/src/io/anuke/mindustry/game/Cicon.java rename to core/src/io/anuke/mindustry/ui/Cicon.java index eccc436c1e..71024fddbf 100644 --- a/core/src/io/anuke/mindustry/game/Cicon.java +++ b/core/src/io/anuke/mindustry/ui/Cicon.java @@ -1,4 +1,4 @@ -package io.anuke.mindustry.game; +package io.anuke.mindustry.ui; import java.util.*; diff --git a/core/src/io/anuke/mindustry/ui/ContentDisplay.java b/core/src/io/anuke/mindustry/ui/ContentDisplay.java index fd44ed99ea..7715ac00aa 100644 --- a/core/src/io/anuke/mindustry/ui/ContentDisplay.java +++ b/core/src/io/anuke/mindustry/ui/ContentDisplay.java @@ -5,7 +5,6 @@ import io.anuke.arc.collection.*; import io.anuke.arc.graphics.*; import io.anuke.arc.scene.ui.layout.*; import io.anuke.arc.util.*; -import io.anuke.mindustry.game.*; import io.anuke.mindustry.graphics.*; import io.anuke.mindustry.type.*; import io.anuke.mindustry.world.*; @@ -49,7 +48,7 @@ public class ContentDisplay{ for(BlockStat stat : map.keys()){ table.table(inset -> { inset.left(); - inset.add("[LIGHT_GRAY]" + stat.localized() + ":[] "); + inset.add("[LIGHT_GRAY]" + stat.localized() + ":[] ").left(); Array arr = map.get(stat); for(StatValue value : arr){ value.display(inset); 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/ItemImage.java b/core/src/io/anuke/mindustry/ui/ItemImage.java index 22edaedd75..e2ea1b5c23 100644 --- a/core/src/io/anuke/mindustry/ui/ItemImage.java +++ b/core/src/io/anuke/mindustry/ui/ItemImage.java @@ -3,7 +3,6 @@ package io.anuke.mindustry.ui; import io.anuke.arc.graphics.g2d.*; import io.anuke.arc.scene.ui.*; import io.anuke.arc.scene.ui.layout.*; -import io.anuke.mindustry.game.*; import io.anuke.mindustry.type.*; public class ItemImage extends Stack{ diff --git a/core/src/io/anuke/mindustry/ui/ItemsDisplay.java b/core/src/io/anuke/mindustry/ui/ItemsDisplay.java index 363e272ff8..e198673c08 100644 --- a/core/src/io/anuke/mindustry/ui/ItemsDisplay.java +++ b/core/src/io/anuke/mindustry/ui/ItemsDisplay.java @@ -3,7 +3,6 @@ package io.anuke.mindustry.ui; import io.anuke.arc.graphics.*; import io.anuke.arc.scene.ui.layout.*; import io.anuke.mindustry.core.GameState.*; -import io.anuke.mindustry.game.*; import io.anuke.mindustry.gen.*; import io.anuke.mindustry.type.*; diff --git a/core/src/io/anuke/mindustry/ui/Links.java b/core/src/io/anuke/mindustry/ui/Links.java index 9f0fec6e86..cfdaac40a9 100644 --- a/core/src/io/anuke/mindustry/ui/Links.java +++ b/core/src/io/anuke/mindustry/ui/Links.java @@ -14,6 +14,7 @@ public class Links{ new LinkEntry("changelog", "https://github.com/Anuken/Mindustry/releases", Pal.accent.cpy()), new LinkEntry("trello", "https://trello.com/b/aE2tcUwF", Color.valueOf("026aa7")), new LinkEntry("wiki", "https://mindustrygame.github.io/wiki/", Color.valueOf("0f142f")), + 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("github", "https://github.com/Anuken/Mindustry/", Color.valueOf("24292e")), diff --git a/core/src/io/anuke/mindustry/ui/LiquidDisplay.java b/core/src/io/anuke/mindustry/ui/LiquidDisplay.java index 6fc5f8ba6d..741491d9b9 100644 --- a/core/src/io/anuke/mindustry/ui/LiquidDisplay.java +++ b/core/src/io/anuke/mindustry/ui/LiquidDisplay.java @@ -5,7 +5,6 @@ import io.anuke.arc.scene.ui.Image; import io.anuke.arc.scene.ui.layout.Stack; import io.anuke.arc.scene.ui.layout.Table; import io.anuke.arc.util.Strings; -import io.anuke.mindustry.game.*; import io.anuke.mindustry.type.Liquid; import io.anuke.mindustry.world.meta.StatUnit; diff --git a/core/src/io/anuke/mindustry/ui/Minimap.java b/core/src/io/anuke/mindustry/ui/Minimap.java index d4cba3bc33..dc2817e8f0 100644 --- a/core/src/io/anuke/mindustry/ui/Minimap.java +++ b/core/src/io/anuke/mindustry/ui/Minimap.java @@ -36,7 +36,7 @@ public class Minimap extends Table{ Draw.rect(renderer.minimap.getRegion(), x + width / 2f, y + height / 2f, width, height); if(renderer.minimap.getTexture() != null){ - renderer.minimap.drawEntities(x, y, width, height); + renderer.minimap.drawEntities(x, y, width, height, false); } } }).size(140f); 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/Styles.java b/core/src/io/anuke/mindustry/ui/Styles.java index cd9af651ad..29c1321009 100644 --- a/core/src/io/anuke/mindustry/ui/Styles.java +++ b/core/src/io/anuke/mindustry/ui/Styles.java @@ -27,7 +27,7 @@ public class Styles{ public static ButtonStyle defaultb, waveb; public static TextButtonStyle defaultt, squaret, nodet, cleart, discordt, infot, clearPartialt, clearTogglet, clearToggleMenut, togglet; public static ImageButtonStyle defaulti, nodei, righti, emptyi, emptytogglei, selecti, cleari, clearFulli, clearPartiali, clearPartial2i, clearTogglei, clearTransi, clearToggleTransi, clearTogglePartiali; - public static ScrollPaneStyle defaultPane, horizontalPane; + public static ScrollPaneStyle defaultPane, horizontalPane, smallPane; public static KeybindDialogStyle defaultKeybindDialog; public static SliderStyle defaultSlider, vSlider; public static LabelStyle defaultLabel, outlineLabel; @@ -225,6 +225,10 @@ public class Styles{ hScroll = scrollHorizontal; hScrollKnob = scrollKnobHorizontalBlack; }}; + smallPane = new ScrollPaneStyle(){{ + vScroll = clear; + vScrollKnob = scrollKnobVerticalThin; + }}; defaultKeybindDialog = new KeybindDialogStyle(){{ keyColor = Pal.accent; diff --git a/core/src/io/anuke/mindustry/ui/dialogs/ColorPickDialog.java b/core/src/io/anuke/mindustry/ui/dialogs/ColorPickDialog.java index 4402d740c4..5e26f272d3 100644 --- a/core/src/io/anuke/mindustry/ui/dialogs/ColorPickDialog.java +++ b/core/src/io/anuke/mindustry/ui/dialogs/ColorPickDialog.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.*; @@ -11,7 +11,7 @@ import io.anuke.mindustry.ui.*; import static io.anuke.mindustry.Vars.*; public class ColorPickDialog extends Dialog{ - private Consumer cons; + private Cons cons; public ColorPickDialog(){ super(""); @@ -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/ContentInfoDialog.java b/core/src/io/anuke/mindustry/ui/dialogs/ContentInfoDialog.java index f76bba6bbc..3a4abf4d18 100644 --- a/core/src/io/anuke/mindustry/ui/dialogs/ContentInfoDialog.java +++ b/core/src/io/anuke/mindustry/ui/dialogs/ContentInfoDialog.java @@ -2,7 +2,7 @@ package io.anuke.mindustry.ui.dialogs; import io.anuke.arc.scene.ui.ScrollPane; import io.anuke.arc.scene.ui.layout.Table; -import io.anuke.mindustry.game.UnlockableContent; +import io.anuke.mindustry.ctype.UnlockableContent; public class ContentInfoDialog extends FloatingDialog{ diff --git a/core/src/io/anuke/mindustry/ui/dialogs/CustomRulesDialog.java b/core/src/io/anuke/mindustry/ui/dialogs/CustomRulesDialog.java index dc5b208123..b3bea499c3 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.*; @@ -15,6 +15,7 @@ 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 io.anuke.mindustry.world.*; import static io.anuke.mindustry.Vars.*; @@ -22,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; @@ -107,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(); @@ -172,16 +173,16 @@ public class CustomRulesDialog extends FloatingDialog{ number("$rules.enemycorebuildradius", f -> rules.enemyCoreBuildRadius = f * tilesize, () -> Math.min(rules.enemyCoreBuildRadius / tilesize, 200)); } - 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()); @@ -189,11 +190,11 @@ 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(); } diff --git a/core/src/io/anuke/mindustry/ui/dialogs/DatabaseDialog.java b/core/src/io/anuke/mindustry/ui/dialogs/DatabaseDialog.java index 281682710f..65adb85efa 100644 --- a/core/src/io/anuke/mindustry/ui/dialogs/DatabaseDialog.java +++ b/core/src/io/anuke/mindustry/ui/dialogs/DatabaseDialog.java @@ -1,19 +1,19 @@ package io.anuke.mindustry.ui.dialogs; -import io.anuke.arc.Core; -import io.anuke.arc.collection.Array; -import io.anuke.arc.graphics.Color; -import io.anuke.arc.scene.event.ClickListener; -import io.anuke.arc.scene.event.HandCursorListener; +import io.anuke.arc.*; +import io.anuke.arc.collection.*; +import io.anuke.arc.graphics.*; +import io.anuke.arc.scene.event.*; import io.anuke.arc.scene.ui.*; -import io.anuke.arc.scene.ui.layout.Table; -import io.anuke.arc.util.Time; -import io.anuke.mindustry.Vars; -import io.anuke.mindustry.core.GameState.State; -import io.anuke.mindustry.game.*; +import io.anuke.arc.scene.ui.layout.*; +import io.anuke.arc.util.*; +import io.anuke.mindustry.*; +import io.anuke.mindustry.core.GameState.*; +import io.anuke.mindustry.ctype.*; import io.anuke.mindustry.gen.*; -import io.anuke.mindustry.graphics.Pal; -import io.anuke.mindustry.type.ContentType; +import io.anuke.mindustry.graphics.*; +import io.anuke.mindustry.type.*; +import io.anuke.mindustry.ui.*; public class DatabaseDialog extends FloatingDialog{ diff --git a/core/src/io/anuke/mindustry/ui/dialogs/DeployDialog.java b/core/src/io/anuke/mindustry/ui/dialogs/DeployDialog.java index 0764a6cea3..a84ff1a73c 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.*; @@ -17,6 +17,7 @@ import io.anuke.arc.scene.utils.*; import io.anuke.arc.util.*; import io.anuke.mindustry.content.*; import io.anuke.mindustry.core.GameState.*; +import io.anuke.mindustry.game.EventType.*; import io.anuke.mindustry.game.Saves.*; import io.anuke.mindustry.gen.*; import io.anuke.mindustry.graphics.*; @@ -38,14 +39,8 @@ public class DeployDialog extends FloatingDialog{ public DeployDialog(){ super("", Styles.fullDialog); - ZoneNode root = new ZoneNode(Zones.groundZero, null); - - BranchTreeLayout layout = new BranchTreeLayout(); - layout.gapBetweenLevels = layout.gapBetweenNodes = Scl.scl(60f); - layout.gapBetweenNodes = Scl.scl(120f); - layout.layout(root); - bounds.set(layout.getBounds()); - bounds.y += nodeSize*0.4f; + treeLayout(); + Events.on(ContentReloadEvent.class, e -> treeLayout()); addCloseButton(); buttons.addImageTextButton("$techtree", Icon.tree, () -> ui.tech.show()).size(230f, 64f); @@ -98,6 +93,18 @@ public class DeployDialog extends FloatingDialog{ } + void treeLayout(){ + nodes.clear(); + ZoneNode root = new ZoneNode(Zones.groundZero, null); + + BranchTreeLayout layout = new BranchTreeLayout(); + layout.gapBetweenLevels = layout.gapBetweenNodes = Scl.scl(60f); + layout.gapBetweenNodes = Scl.scl(120f); + layout.layout(root); + bounds.set(layout.getBounds()); + bounds.y += nodeSize*0.4f; + } + public void setup(){ platform.updateRPC(); @@ -227,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/GameOverDialog.java b/core/src/io/anuke/mindustry/ui/dialogs/GameOverDialog.java index 1e8bcfad87..af64727163 100644 --- a/core/src/io/anuke/mindustry/ui/dialogs/GameOverDialog.java +++ b/core/src/io/anuke/mindustry/ui/dialogs/GameOverDialog.java @@ -6,6 +6,7 @@ import io.anuke.mindustry.game.*; import io.anuke.mindustry.game.EventType.*; import io.anuke.mindustry.game.Stats.*; import io.anuke.mindustry.type.*; +import io.anuke.mindustry.ui.Cicon; import static io.anuke.mindustry.Vars.*; diff --git a/core/src/io/anuke/mindustry/ui/dialogs/HostDialog.java b/core/src/io/anuke/mindustry/ui/dialogs/HostDialog.java index 92a69ddcc3..5ecb7a3e9a 100644 --- a/core/src/io/anuke/mindustry/ui/dialogs/HostDialog.java +++ b/core/src/io/anuke/mindustry/ui/dialogs/HostDialog.java @@ -5,7 +5,7 @@ import io.anuke.arc.graphics.*; import io.anuke.arc.scene.ui.*; import io.anuke.arc.util.*; import io.anuke.mindustry.*; -import io.anuke.mindustry.game.*; +import io.anuke.mindustry.core.*; import io.anuke.mindustry.gen.*; import io.anuke.mindustry.ui.*; diff --git a/core/src/io/anuke/mindustry/ui/dialogs/JoinDialog.java b/core/src/io/anuke/mindustry/ui/dialogs/JoinDialog.java index d6d579a787..b786bc3fe4 100644 --- a/core/src/io/anuke/mindustry/ui/dialogs/JoinDialog.java +++ b/core/src/io/anuke/mindustry/ui/dialogs/JoinDialog.java @@ -10,7 +10,7 @@ import io.anuke.arc.scene.ui.*; import io.anuke.arc.scene.ui.layout.*; import io.anuke.arc.util.*; import io.anuke.mindustry.*; -import io.anuke.mindustry.game.*; +import io.anuke.mindustry.core.*; import io.anuke.mindustry.gen.*; import io.anuke.mindustry.net.*; import io.anuke.mindustry.net.Packets.*; @@ -105,9 +105,8 @@ public class JoinDialog extends FloatingDialog{ TextButton button = buttons[0] = remote.addButton("[accent]" + server.displayIP(), Styles.cleart, () -> { if(!buttons[0].childrenPressed()){ - if(server.lastHost != null && server.lastHost.version != Version.build && Version.build != -1 && server.lastHost.version != -1){ - ui.showInfo("[scarlet]" + (server.lastHost.version > Version.build ? KickReason.clientOutdated : KickReason.serverOutdated).toString() + "\n[]" + - Core.bundle.format("server.versions", Version.build, server.lastHost.version)); + if(server.lastHost != null){ + safeConnect(server.ip, server.port, server.lastHost.version); }else{ connect(server.ip, server.port); } @@ -314,7 +313,7 @@ public class JoinDialog extends FloatingDialog{ local.row(); - TextButton button = local.addButton("", Styles.cleart, () -> connect(host.address, port)) + TextButton button = local.addButton("", Styles.cleart, () -> safeConnect(host.address, port, host.version)) .width(w).pad(5f).get(); button.clearChildren(); buildServer(host, button); @@ -344,6 +343,15 @@ public class JoinDialog extends FloatingDialog{ }); } + void safeConnect(String ip, int port, int version){ + if(version != Version.build && Version.build != -1 && version != -1){ + ui.showInfo("[scarlet]" + (version > Version.build ? KickReason.clientOutdated : KickReason.serverOutdated).toString() + "\n[]" + + Core.bundle.format("server.versions", Version.build, version)); + }else{ + connect(ip, port); + } + } + float targetWidth(){ return Core.graphics.isPortrait() ? 350f : 500f; } diff --git a/core/src/io/anuke/mindustry/ui/dialogs/LoadoutDialog.java b/core/src/io/anuke/mindustry/ui/dialogs/LoadoutDialog.java index 0acbaa7864..f6bd24ff37 100644 --- a/core/src/io/anuke/mindustry/ui/dialogs/LoadoutDialog.java +++ b/core/src/io/anuke/mindustry/ui/dialogs/LoadoutDialog.java @@ -5,21 +5,19 @@ import io.anuke.arc.collection.*; import io.anuke.arc.input.*; import io.anuke.arc.scene.ui.layout.*; import io.anuke.arc.util.*; -import io.anuke.mindustry.game.*; import io.anuke.mindustry.gen.*; import io.anuke.mindustry.type.*; import io.anuke.mindustry.ui.*; +import io.anuke.mindustry.ui.Cicon; import static io.anuke.mindustry.Vars.*; public class LoadoutDialog extends FloatingDialog{ private Runnable hider; - //private Supplier> supplier; private Runnable resetter; private Runnable updater; private Array stacks = new Array<>(); private Array originalStacks = new Array<>(); - //private Predicate filter; private Table items; private int capacity; diff --git a/core/src/io/anuke/mindustry/ui/dialogs/ModsDialog.java b/core/src/io/anuke/mindustry/ui/dialogs/ModsDialog.java index 7dfe21b5c2..50164a7dff 100644 --- a/core/src/io/anuke/mindustry/ui/dialogs/ModsDialog.java +++ b/core/src/io/anuke/mindustry/ui/dialogs/ModsDialog.java @@ -1,7 +1,9 @@ package io.anuke.mindustry.ui.dialogs; import io.anuke.arc.*; +import io.anuke.arc.Net.*; import io.anuke.arc.collection.*; +import io.anuke.arc.files.*; import io.anuke.arc.util.*; import io.anuke.arc.util.io.*; import io.anuke.mindustry.gen.*; @@ -19,45 +21,65 @@ 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(210f, 64f); + .size(210, 64f); 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 -> { - try{ - Streams.copyStream(result.getResultAsStream(), modDirectory.child(text.replace("/", "") + ".zip").write(false)); - Core.app.post(() -> { - try{ - mods.reloadContent(); - setup(); - ui.loadfrag.hide(); - }catch(Throwable e){ - ui.showException(e); - } - }); - }catch(Throwable e){ - ui.showException(e); + 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))); + }, t -> Core.app.post(() -> modError(t))); + }, t -> Core.app.post(() -> modError(t))); }); }).size(250f, 64f); + shown(this::setup); hidden(() -> { if(mods.requiresReload()){ ui.loadAnd("$reloading", () -> { + mods.all().each(mod -> { + if(mod.hasUnmetDependencies()){ + ui.showErrorMessage(Core.bundle.format("mod.nowdisabled", mod.name, mod.missingDependencies.toString(", "))); + } + }); mods.reloadContent(); }); } @@ -70,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())){ @@ -86,6 +118,7 @@ public class ModsDialog extends FloatingDialog{ anyDisabled = true; table.row(); table.addImage().growX().height(4f).pad(6f).color(Pal.gray); + table.row(); } table.table(Styles.black6, t -> { @@ -93,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"))); + 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, () -> { @@ -128,8 +161,11 @@ public class ModsDialog extends FloatingDialog{ t.labelWrap("[lightgray]" + mod.meta.description).growX(); t.row(); } - - }).width(500f); + if(mod.hasUnmetDependencies()){ + t.labelWrap(Core.bundle.format("mod.missingdependencies", mod.missingDependencies.toString(", "))).growX(); + t.row(); + } + }).width(mobile ? 430f : 500f); table.row(); } }); @@ -150,6 +186,6 @@ public class ModsDialog extends FloatingDialog{ e.printStackTrace(); } }); - }).margin(12f).width(500f); + }).margin(12f).width(400f); } } diff --git a/core/src/io/anuke/mindustry/ui/dialogs/SchematicsDialog.java b/core/src/io/anuke/mindustry/ui/dialogs/SchematicsDialog.java index c5e9541930..0109b959e4 100644 --- a/core/src/io/anuke/mindustry/ui/dialogs/SchematicsDialog.java +++ b/core/src/io/anuke/mindustry/ui/dialogs/SchematicsDialog.java @@ -5,13 +5,14 @@ import io.anuke.arc.collection.*; import io.anuke.arc.graphics.*; import io.anuke.arc.graphics.Texture.*; import io.anuke.arc.graphics.g2d.*; +import io.anuke.arc.scene.style.*; import io.anuke.arc.scene.ui.*; 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.game.Schematics.*; import io.anuke.mindustry.gen.*; import io.anuke.mindustry.graphics.*; import io.anuke.mindustry.type.*; @@ -33,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(){ @@ -109,20 +111,24 @@ public class SchematicsDialog extends FloatingDialog{ b.stack(new SchematicImage(s).setScaling(Scaling.fit), new Table(n -> { n.top(); n.table(Styles.black3, c -> { - Label label = c.add(s.name()).style(Styles.outlineLabel).color(Color.white).top().growX().get(); + 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).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(); } } @@ -147,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"); @@ -194,6 +200,7 @@ public class SchematicsDialog extends FloatingDialog{ t.addImageTextButton("$schematic.shareworkshop", Icon.wikiSmall, style, () -> platform.publish(s)).marginLeft(12f); t.row(); + dialog.hide(); } t.addImageTextButton("$schematic.copy", Icon.copySmall, style, () -> { dialog.hide(); @@ -221,9 +228,18 @@ public class SchematicsDialog extends FloatingDialog{ public float thickness = 4f; public Color borderColor = Pal.gray; + private Schematic schematic; + boolean set; + public SchematicImage(Schematic s){ - super(schematics.getPreview(s, PreviewRes.high)); + super(Tex.clear); setScaling(Scaling.fit); + schematic = s; + + if(schematics.hasPreview(s)){ + setPreview(); + set = true; + } } @Override @@ -231,6 +247,12 @@ public class SchematicsDialog extends FloatingDialog{ boolean checked = getParent().getParent() instanceof Button && ((Button)getParent().getParent()).isOver(); + boolean wasSet = set; + if(!set){ + Core.app.post(this::setPreview); + set = true; + } + Texture background = Core.assets.get("sprites/schematic-background.png", Texture.class); TextureRegion region = Draw.wrap(background); float xr = width / scaling; @@ -241,7 +263,11 @@ public class SchematicsDialog extends FloatingDialog{ Draw.alpha(parentAlpha); Draw.rect(region, x + width/2f, y + height/2f, width, height); - super.draw(); + if(wasSet){ + super.draw(); + }else{ + Draw.rect(Icon.loading.getRegion(), x + width/2f, y + height/2f, width/4f, height/4f); + } Draw.color(checked ? Pal.accent : borderColor); Draw.alpha(parentAlpha); @@ -249,6 +275,12 @@ public class SchematicsDialog extends FloatingDialog{ Lines.rect(x, y, width, height); Draw.reset(); } + + private void setPreview(){ + TextureRegionDrawable draw = new TextureRegionDrawable(new TextureRegion(schematics.getPreview(schematic))); + setDrawable(draw); + setScaling(Scaling.fit); + } } public static class SchematicInfoDialog extends FloatingDialog{ diff --git a/core/src/io/anuke/mindustry/ui/dialogs/SettingsMenuDialog.java b/core/src/io/anuke/mindustry/ui/dialogs/SettingsMenuDialog.java index 06b1c605a3..f351fd133a 100644 --- a/core/src/io/anuke/mindustry/ui/dialogs/SettingsMenuDialog.java +++ b/core/src/io/anuke/mindustry/ui/dialogs/SettingsMenuDialog.java @@ -14,7 +14,7 @@ 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.core.*; import io.anuke.mindustry.game.EventType.*; import io.anuke.mindustry.gen.*; import io.anuke.mindustry.graphics.*; @@ -225,8 +225,12 @@ public class SettingsMenuDialog extends SettingsDialog{ } 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 +251,7 @@ public class SettingsMenuDialog extends SettingsDialog{ } }); - graphics.sliderPref("uiscale", 100, 25, 400, 25, s -> { + graphics.sliderPref("uiscale", 100, 25, 400, 5, s -> { if(ui.settings != null){ Core.settings.put("uiscalechanged", true); } @@ -255,7 +259,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 +301,17 @@ 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); 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); diff --git a/core/src/io/anuke/mindustry/ui/dialogs/TechTreeDialog.java b/core/src/io/anuke/mindustry/ui/dialogs/TechTreeDialog.java index 071879f640..7a60ad2724 100644 --- a/core/src/io/anuke/mindustry/ui/dialogs/TechTreeDialog.java +++ b/core/src/io/anuke/mindustry/ui/dialogs/TechTreeDialog.java @@ -16,12 +16,12 @@ import io.anuke.arc.scene.ui.layout.*; import io.anuke.arc.util.*; import io.anuke.mindustry.content.*; import io.anuke.mindustry.content.TechTree.*; -import io.anuke.mindustry.game.*; import io.anuke.mindustry.game.EventType.*; import io.anuke.mindustry.gen.*; import io.anuke.mindustry.graphics.*; import io.anuke.mindustry.type.*; import io.anuke.mindustry.ui.*; +import io.anuke.mindustry.ui.Cicon; import io.anuke.mindustry.ui.layout.*; import io.anuke.mindustry.ui.layout.TreeLayout.*; @@ -40,10 +40,15 @@ public class TechTreeDialog extends FloatingDialog{ titleTable.remove(); margin(0f).marginBottom(8); - cont.stack(view = new View(), items = new ItemsDisplay()).grow(); + Stack stack = cont.stack(view = new View(), items = new ItemsDisplay()).grow().get(); Events.on(ContentReloadEvent.class, e -> { + nodes.clear(); root = new TechTreeNode(TechTree.root, null); + checkNodes(root); + treeLayout(); + stack.getChildren().get(0).remove(); + stack.addChildAt(0, view = new View()); }); shown(() -> { @@ -61,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){ @@ -357,7 +361,6 @@ public class TechTreeDialog extends FloatingDialog{ infoTable.table(t -> t.margin(3f).left().labelWrap(node.block.description).color(Color.lightGray).growX()).fillX(); } - addChild(infoTable); infoTable.pack(); infoTable.act(Core.graphics.getDeltaTime()); diff --git a/core/src/io/anuke/mindustry/ui/dialogs/ZoneInfoDialog.java b/core/src/io/anuke/mindustry/ui/dialogs/ZoneInfoDialog.java index 077fc36e51..1bf34b0855 100644 --- a/core/src/io/anuke/mindustry/ui/dialogs/ZoneInfoDialog.java +++ b/core/src/io/anuke/mindustry/ui/dialogs/ZoneInfoDialog.java @@ -10,6 +10,7 @@ import io.anuke.mindustry.game.Objectives.*; import io.anuke.mindustry.gen.*; import io.anuke.mindustry.graphics.*; import io.anuke.mindustry.type.*; +import io.anuke.mindustry.ui.Cicon; import static io.anuke.mindustry.Vars.*; @@ -44,7 +45,7 @@ public class ZoneInfoDialog extends FloatingDialog{ if(i++ % 2 == 0){ iteminfo.row(); } - iteminfo.addImage(stack.item.icon(Cicon.small)).size(8 * 3).padRight(1); + iteminfo.addImage(stack.item.icon(io.anuke.mindustry.ui.Cicon.small)).size(8 * 3).padRight(1); iteminfo.add(stack.amount + "").color(Color.lightGray).padRight(5); } }; @@ -84,7 +85,7 @@ public class ZoneInfoDialog extends FloatingDialog{ r.add("$research.list").colspan(2).left(); r.row(); for(Unlock blocko : blocks){ - r.addImage(blocko.block.icon(Cicon.small)).size(8 * 3).padRight(5); + r.addImage(blocko.block.icon(io.anuke.mindustry.ui.Cicon.small)).size(8 * 3).padRight(5); r.add(blocko.block.localizedName).color(Color.lightGray).left(); r.addImage(blocko.block.unlocked() ? Icon.checkSmall : Icon.cancelSmall, blocko.block.unlocked() ? Color.lightGray : Color.scarlet).padLeft(3); r.row(); @@ -136,15 +137,17 @@ 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) - ).fillX().pad(3).disabled(b -> !zone.canConfigure()); } cont.marginRight(12f); }); cont.row(); + cont.addButton(zone.canConfigure() ? "$configure" : Core.bundle.format("configure.locked", zone.configureObjective.display()), + () -> loadout.show(zone.loadout.findCore().itemCapacity, zone.getStartingItems(), zone::resetStartingItems, zone::updateLaunchCost, rebuildItems) + ).fillX().pad(3).disabled(b -> !zone.canConfigure()); + + cont.row(); + Button button = cont.addButton(zone.locked() ? "$uncover" : "$launch", () -> { if(!data.isUnlocked(zone)){ Sounds.unlock.play(); diff --git a/core/src/io/anuke/mindustry/ui/fragments/BlockInventoryFragment.java b/core/src/io/anuke/mindustry/ui/fragments/BlockInventoryFragment.java index 316990d8bf..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.*; @@ -17,10 +17,10 @@ import io.anuke.arc.util.*; import io.anuke.mindustry.core.GameState.*; import io.anuke.mindustry.entities.*; import io.anuke.mindustry.entities.type.*; -import io.anuke.mindustry.game.*; import io.anuke.mindustry.game.EventType.*; import io.anuke.mindustry.gen.*; import io.anuke.mindustry.type.*; +import io.anuke.mindustry.ui.Cicon; import io.anuke.mindustry.world.*; import static io.anuke.mindustry.Vars.*; @@ -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 f393b2e325..6b77c55d3d 100644 --- a/core/src/io/anuke/mindustry/ui/fragments/HudFragment.java +++ b/core/src/io/anuke/mindustry/ui/fragments/HudFragment.java @@ -17,6 +17,7 @@ import io.anuke.arc.scene.ui.ImageButton.*; import io.anuke.arc.scene.ui.layout.*; import io.anuke.arc.util.*; import io.anuke.mindustry.core.GameState.*; +import io.anuke.mindustry.ctype.UnlockableContent; import io.anuke.mindustry.entities.*; import io.anuke.mindustry.entities.type.*; import io.anuke.mindustry.game.*; @@ -27,6 +28,7 @@ import io.anuke.mindustry.input.*; import io.anuke.mindustry.net.Packets.*; import io.anuke.mindustry.type.*; import io.anuke.mindustry.ui.*; +import io.anuke.mindustry.ui.Cicon; import io.anuke.mindustry.ui.dialogs.*; import static io.anuke.mindustry.Vars.*; @@ -38,7 +40,7 @@ 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; @@ -63,10 +65,14 @@ 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{ @@ -74,14 +80,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(); @@ -95,11 +101,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(); @@ -112,7 +118,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); @@ -122,7 +128,7 @@ public class HudFragment extends Fragment{ }); } - cont.add().size(dsize * 4 + 3, dsize).left(); + cont.add().size(dsize * 5 + 3, dsize).left(); } cont.row(); @@ -131,7 +137,7 @@ public class HudFragment extends Fragment{ } cont.update(() -> { - if(!Core.input.keyDown(Binding.gridMode) && Core.input.keyTap(Binding.toggle_menus) && !ui.chatfrag.chatOpen() && !Core.scene.hasDialog() && !(Core.scene.getKeyboardFocus() instanceof TextField)){ + if(Core.input.keyTap(Binding.toggle_menus) && !ui.chatfrag.chatOpen() && !Core.scene.hasDialog() && !(Core.scene.getKeyboardFocus() instanceof TextField)){ toggleMenus(); } }); @@ -152,7 +158,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(); @@ -232,7 +238,7 @@ public class HudFragment extends Fragment{ } }); } - }).width(dsize * 4 + 4f); + }).width(dsize * 5 + 4f); editorMain.visible(() -> shown && state.isEditor()); } @@ -576,7 +582,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 b4a0a2078b..9229546fe0 100644 --- a/core/src/io/anuke/mindustry/ui/fragments/MenuFragment.java +++ b/core/src/io/anuke/mindustry/ui/fragments/MenuFragment.java @@ -11,12 +11,11 @@ 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.mindustry.core.*; 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.*; -import io.anuke.mindustry.ui.Styles; import static io.anuke.arc.Core.assets; import static io.anuke.mindustry.Vars.*; @@ -98,6 +97,7 @@ public class MenuFragment extends Fragment{ join = new MobileButton(Icon.add, "$joingame", ui.join::show), editor = new MobileButton(Icon.editor, "$editor", ui.maps::show), tools = new MobileButton(Icon.tools, "$settings", ui.settings::show), + mods = new MobileButton(Icon.wiki, "$mods", ui.mods::show), donate = new MobileButton(Icon.link, "$website", () -> Core.net.openURI("https://anuke.itch.io/mindustry")), exit = new MobileButton(Icon.exit, "$quit", () -> Core.app.exit()); @@ -106,9 +106,8 @@ public class MenuFragment extends Fragment{ container.add(play); container.add(join); container.add(custom); - if(ios) container.row(); container.add(maps); - if(!ios) container.row(); + container.row(); container.table(table -> { table.defaults().set(container.defaults()); @@ -116,7 +115,8 @@ public class MenuFragment extends Fragment{ table.add(editor); table.add(tools); - if(platform.canDonate()) table.add(donate); + table.add(mods); + //if(platform.canDonate()) table.add(donate); if(!ios) table.add(exit); }).colspan(4); }else{ @@ -134,7 +134,8 @@ public class MenuFragment extends Fragment{ container.table(table -> { table.defaults().set(container.defaults()); - if(platform.canDonate()) table.add(donate); + table.add(mods); + //if(platform.canDonate()) table.add(donate); if(!ios) table.add(exit); }).colspan(2); } @@ -163,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 a52a252bc8..fd088ae3b6 100644 --- a/core/src/io/anuke/mindustry/ui/fragments/PlacementFragment.java +++ b/core/src/io/anuke/mindustry/ui/fragments/PlacementFragment.java @@ -3,7 +3,6 @@ package io.anuke.mindustry.ui.fragments; import io.anuke.arc.*; import io.anuke.arc.collection.*; import io.anuke.arc.graphics.*; -import io.anuke.arc.input.*; import io.anuke.arc.math.geom.*; import io.anuke.arc.scene.*; import io.anuke.arc.scene.event.*; @@ -13,13 +12,13 @@ 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.game.*; import io.anuke.mindustry.game.EventType.*; import io.anuke.mindustry.gen.*; import io.anuke.mindustry.graphics.*; import io.anuke.mindustry.input.*; import io.anuke.mindustry.type.*; import io.anuke.mindustry.ui.*; +import io.anuke.mindustry.ui.Cicon; import io.anuke.mindustry.world.*; import static io.anuke.mindustry.Vars.*; @@ -27,29 +26,17 @@ 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; - //not configurable, no plans to make it configurable - final KeyCode[] inputGrid = { - KeyCode.NUM_1, KeyCode.NUM_2, KeyCode.NUM_3, KeyCode.NUM_4, - KeyCode.Q, KeyCode.W, KeyCode.E, KeyCode.R, - KeyCode.A, KeyCode.S, KeyCode.D, KeyCode.F, - KeyCode.Z, KeyCode.X, KeyCode.C, KeyCode.V - }, inputCatGrid = { - KeyCode.NUM_1, KeyCode.NUM_2, - KeyCode.Q, KeyCode.W, - KeyCode.A, KeyCode.S, - KeyCode.Z, KeyCode.X, KeyCode.C, KeyCode.V - }; - public PlacementFragment(){ Events.on(WorldLoadEvent.class, event -> { Core.app.post(() -> { @@ -63,6 +50,10 @@ public class PlacementFragment extends Fragment{ rebuild(); } }); + + Events.on(ResetEvent.class, event -> { + selectedBlocks.clear(); + }); } void rebuild(){ @@ -92,27 +83,6 @@ public class PlacementFragment extends Fragment{ return true; } } - - if(!Core.input.keyDown(Binding.gridMode) || ui.chatfrag.chatOpen()) return false; - if(Core.input.keyDown(Binding.gridModeShift)){ //select category - int i = 0; - for(KeyCode key : inputCatGrid){ - if(Core.input.keyDown(key)){ - input.block = getByCategory(Category.all[i]).first(); - currentCategory = input.block.category; - } - i++; - } - return true; - }else{ //select block - int i = 0; - Array recipes = getByCategory(currentCategory); - for(KeyCode key : inputGrid){ - if(Core.input.keyDown(key)) - input.block = (i < recipes.size && unlocked(recipes.get(i))) ? recipes.get(i) : null; - i++; - } - } return false; } @@ -147,6 +117,7 @@ public class PlacementFragment extends Fragment{ 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(); @@ -220,7 +191,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 "*/*"; @@ -267,11 +238,26 @@ public class PlacementFragment extends Fragment{ frame.row(); frame.table(Tex.pane2, blocksSelect -> { blocksSelect.margin(4).marginTop(0); - blocksSelect.table(blocks -> blockTable = blocks).grow(); + 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); frame.table(categories -> { + categories.bottom(); + categories.add(new Image(Styles.black6){ + @Override + public void draw(){ + if(height <= Scl.scl(3f)) return; + getDrawable().draw(x, y, width, height - Scl.scl(3f)); + } + }).colspan(2).growX().growY().padTop(-3f).row(); categories.defaults().size(50f); ButtonGroup group = new ButtonGroup<>(); @@ -293,10 +279,16 @@ public class PlacementFragment extends Fragment{ categories.addImageButton(Core.atlas.drawable("icon-" + cat.name() + "-smaller"), Styles.clearToggleTransi, () -> { currentCategory = cat; + if(control.input.block != null){ + if(selectedBlocks.get(currentCategory) == null){ + selectedBlocks.put(currentCategory, getByCategory(currentCategory).find(this::unlocked)); + } + control.input.block = selectedBlocks.get(currentCategory); + } rebuildCategory.run(); }).group(group).update(i -> i.setChecked(currentCategory == cat)).name("category-" + cat.name()); } - }).touchable(Touchable.enabled); + }).fillY().bottom().touchable(Touchable.enabled); rebuildCategory.run(); frame.update(() -> { 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 c6010004fd..563bffccd8 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.*; @@ -17,11 +17,11 @@ import io.anuke.arc.scene.ui.layout.*; import io.anuke.arc.util.*; import io.anuke.arc.util.ArcAnnotate.*; import io.anuke.arc.util.pooling.*; +import io.anuke.mindustry.ctype.*; import io.anuke.mindustry.entities.*; import io.anuke.mindustry.entities.effect.*; import io.anuke.mindustry.entities.traits.BuilderTrait.*; import io.anuke.mindustry.entities.type.*; -import io.anuke.mindustry.game.*; import io.anuke.mindustry.gen.*; import io.anuke.mindustry.graphics.*; import io.anuke.mindustry.type.*; @@ -55,6 +55,8 @@ public class Block extends BlockStorage{ public boolean breakable; /** whether this floor can be placed on. */ public boolean placeableOn = true; + /** whether this block has insulating properties. */ + public boolean insulated = false; /** tile entity health */ public int health = -1; /** base block explosiveness */ @@ -89,6 +91,8 @@ public class Block extends BlockStorage{ public boolean consumesTap; /** 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. @@ -231,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){ @@ -241,7 +245,7 @@ public class Block extends BlockStorage{ } public void drawCracks(Tile tile){ - if(!tile.entity.damaged()) return; + if(!tile.entity.damaged() || size > maxCrackSize) return; int id = tile.pos(); TextureRegion region = cracks[size - 1][Mathf.clamp((int)((1f - tile.entity.healthf()) * crackRegions), 0, crackRegions-1)]; Draw.colorl(0.2f, 0.1f + (1f - tile.entity.healthf())* 0.6f); @@ -313,7 +317,7 @@ public class Block extends BlockStorage{ tempTiles.clear(); Geometry.circle(tile.x, tile.y, range, (x, y) -> { Tile other = world.ltile(x, y); - if(other != null && other.block instanceof PowerNode && ((PowerNode)other.block).linkValid(other, tile) && !other.entity.proximity().contains(tile) && + if(other != null && other.block instanceof PowerNode && ((PowerNode)other.block).linkValid(other, tile) && !PowerNode.insulated(other, tile) && !other.entity.proximity().contains(tile) && !(outputsPower && tile.entity.proximity().contains(p -> p.entity != null && p.entity.power != null && p.entity.power.graph == other.entity.power.graph))){ tempTiles.add(other); } @@ -322,7 +326,7 @@ public class Block extends BlockStorage{ if(!tempTiles.isEmpty()){ Tile toLink = tempTiles.first(); if(!toLink.entity.power.links.contains(tile.pos())){ - toLink.configure(tile.pos()); + toLink.configureAny(tile.pos()); } } } @@ -507,7 +511,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; @@ -515,7 +519,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()){ @@ -544,6 +548,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; } @@ -661,7 +670,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,6 +711,11 @@ public class Block extends BlockStorage{ 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){ } diff --git a/core/src/io/anuke/mindustry/world/BlockStorage.java b/core/src/io/anuke/mindustry/world/BlockStorage.java index 984858a5ef..477ca3504f 100644 --- a/core/src/io/anuke/mindustry/world/BlockStorage.java +++ b/core/src/io/anuke/mindustry/world/BlockStorage.java @@ -10,7 +10,7 @@ import io.anuke.mindustry.entities.Effects; import io.anuke.mindustry.entities.effect.Puddle; import io.anuke.mindustry.entities.type.TileEntity; import io.anuke.mindustry.entities.type.Unit; -import io.anuke.mindustry.game.UnlockableContent; +import io.anuke.mindustry.ctype.UnlockableContent; import io.anuke.mindustry.type.Item; import io.anuke.mindustry.type.Liquid; import io.anuke.mindustry.world.consumers.Consumers; @@ -41,6 +41,10 @@ public abstract class BlockStorage extends UnlockableContent{ return true; } + public boolean productionValid(Tile tile){ + return true; + } + public float getPowerProduction(Tile tile){ return 0f; } @@ -111,6 +115,8 @@ public abstract class BlockStorage extends UnlockableContent{ Tile other = proximity.get((i + dump) % proximity.size); Tile in = Edges.getFacingEdge(tile, other); + other = other.block().getLiquidDestination(other, tile); + if(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; @@ -138,6 +144,7 @@ public abstract class BlockStorage extends UnlockableContent{ if(next == null) return 0; next = next.link(); + next = next.block().getLiquidDestination(next, tile); if(next.getTeam() == tile.getTeam() && next.block().hasLiquids && tile.entity.liquids.get(liquid) > 0f){ @@ -175,6 +182,10 @@ public abstract class BlockStorage extends UnlockableContent{ return 0; } + public Tile getLiquidDestination(Tile tile, Tile from){ + 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 +277,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 7d1441314f..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) @@ -69,7 +68,7 @@ public class Build{ /** Returns whether a tile can be placed at this location by this team. */ public static boolean validPlace(Team team, int x, int y, Block type, int rotation){ - if(!type.isVisible() || type.isHidden()){ + if(type == null || !type.isVisible() || type.isHidden()){ return false; } diff --git a/core/src/io/anuke/mindustry/world/LegacyColorMapper.java b/core/src/io/anuke/mindustry/world/LegacyColorMapper.java index 17c7e19417..e57e99eb3a 100644 --- a/core/src/io/anuke/mindustry/world/LegacyColorMapper.java +++ b/core/src/io/anuke/mindustry/world/LegacyColorMapper.java @@ -3,7 +3,7 @@ package io.anuke.mindustry.world; import io.anuke.arc.collection.IntMap; import io.anuke.arc.graphics.Color; import io.anuke.mindustry.content.Blocks; -import io.anuke.mindustry.game.ContentList; +import io.anuke.mindustry.ctype.ContentList; import io.anuke.mindustry.world.blocks.Floor; public class LegacyColorMapper implements ContentList{ diff --git a/core/src/io/anuke/mindustry/world/Tile.java b/core/src/io/anuke/mindustry/world/Tile.java index c5526e5c23..004f32304c 100644 --- a/core/src/io/anuke/mindustry/world/Tile.java +++ b/core/src/io/anuke/mindustry/world/Tile.java @@ -1,9 +1,10 @@ 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.*; import io.anuke.mindustry.content.*; import io.anuke.mindustry.entities.traits.*; import io.anuke.mindustry.entities.type.*; @@ -93,6 +94,10 @@ public class Tile implements Position, TargetTrait{ Call.onTileConfig(player, this, value); } + public void configureAny(int value){ + Call.onTileConfig(null, this, value); + } + @SuppressWarnings("unchecked") public T entity(){ return (T)entity; @@ -118,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; } @@ -148,7 +153,7 @@ public class Tile implements Position, TargetTrait{ return team; } - public void setBlock(Block type, Team team, int rotation){ + public void setBlock(@NonNull Block type, Team team, int rotation){ preChanged(); this.block = type; this.team = (byte)team.ordinal(); @@ -156,11 +161,12 @@ public class Tile implements Position, TargetTrait{ changed(); } - public void setBlock(Block type, Team team){ + public void setBlock(@NonNull Block type, Team team){ setBlock(type, team, 0); } - public void setBlock(Block type){ + public void setBlock(@NonNull Block type){ + if(type == null) throw new IllegalArgumentException("Block cannot be null."); preChanged(); this.block = type; this.rotation = 0; @@ -168,13 +174,13 @@ public class Tile implements Position, TargetTrait{ } /**This resets the overlay!*/ - public void setFloor(Floor type){ + public void setFloor(@NonNull Floor type){ this.floor = type; this.overlay = (Floor)Blocks.air; } /** Sets the floor, preserving overlay.*/ - public void setFloorUnder(Floor floor){ + public void setFloorUnder(@NonNull Floor floor){ Block overlay = this.overlay; setFloor(floor); setOverlay(overlay); @@ -245,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; @@ -253,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); } } @@ -446,4 +452,4 @@ public class Tile implements Position, TargetTrait{ public String toString(){ return floor.name + ":" + block.name + ":" + overlay + "[" + x + "," + y + "] " + "entity=" + (entity == null ? "null" : (entity.getClass())) + ":" + getTeam(); } -} \ No newline at end of file +} diff --git a/core/src/io/anuke/mindustry/world/blocks/Autotiler.java b/core/src/io/anuke/mindustry/world/blocks/Autotiler.java index 3256a47178..081651d40e 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.*; @@ -33,20 +33,20 @@ public interface Autotiler{ } }); - return buildBlending(req.tile(), req.rotation, directionals); + return buildBlending(req.tile(), req.rotation, directionals, req.worldContext); } - default int[] buildBlending(Tile tile, int rotation, BuildRequest[] directional){ + default int[] buildBlending(Tile tile, int rotation, BuildRequest[] directional, boolean world){ int[] blendresult = AutotilerHolder.blendresult; blendresult[0] = 0; blendresult[1] = blendresult[2] = 1; int num = - (blends(tile, rotation, directional, 2) && blends(tile, rotation, directional, 1) && blends(tile, rotation, directional, 3)) ? 0 : - (blends(tile, rotation, directional, 1) && blends(tile, rotation, directional, 3)) ? 1 : - (blends(tile, rotation, directional, 1) && blends(tile, rotation, directional, 2)) ? 2 : - (blends(tile, rotation, directional, 3) && blends(tile, rotation, directional, 2)) ? 3 : - blends(tile, rotation, directional, 1) ? 4 : - blends(tile, rotation, directional, 3) ? 5 : + (blends(tile, rotation, directional, 2, world) && blends(tile, rotation, directional, 1, world) && blends(tile, rotation, directional, 3, world)) ? 0 : + (blends(tile, rotation, directional, 1, world) && blends(tile, rotation, directional, 3, world)) ? 1 : + (blends(tile, rotation, directional, 1, world) && blends(tile, rotation, directional, 2, world)) ? 2 : + (blends(tile, rotation, directional, 3, world) && blends(tile, rotation, directional, 2, world)) ? 3 : + blends(tile, rotation, directional, 1, world) ? 4 : + blends(tile, rotation, directional, 3, world) ? 5 : -1; transformCase(num, blendresult); return blendresult; @@ -70,7 +70,7 @@ public interface Autotiler{ } } - default boolean blends(Tile tile, int rotation, @Nullable BuildRequest[] directional, int direction){ + default boolean blends(Tile tile, int rotation, @Nullable BuildRequest[] directional, int direction, boolean checkWorld){ int realDir = Mathf.mod(rotation - direction, 4); if(directional != null && directional[realDir] != null){ BuildRequest req = directional[realDir]; @@ -78,7 +78,7 @@ public interface Autotiler{ return true; } } - return blends(tile, rotation, direction); + return checkWorld && blends(tile, rotation, direction); } default boolean blends(Tile tile, int rotation, int direction){ diff --git a/core/src/io/anuke/mindustry/world/blocks/BuildBlock.java b/core/src/io/anuke/mindustry/world/blocks/BuildBlock.java index 1f76ed527a..799eaffaba 100644 --- a/core/src/io/anuke/mindustry/world/blocks/BuildBlock.java +++ b/core/src/io/anuke/mindustry/world/blocks/BuildBlock.java @@ -7,16 +7,18 @@ 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.*; import io.anuke.mindustry.entities.traits.BuilderTrait.*; import io.anuke.mindustry.entities.type.*; -import io.anuke.mindustry.game.*; 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.type.*; +import io.anuke.mindustry.ui.*; import io.anuke.mindustry.world.*; import io.anuke.mindustry.world.modules.*; @@ -28,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; @@ -52,7 +58,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) @@ -63,19 +69,45 @@ public class BuildBlock extends Block{ if(tile.entity != null){ tile.entity.health = block.health * healthf; } - Effects.effect(Fx.placeBlock, tile.drawx(), tile.drawy(), block.size); - Core.app.post(() -> tile.block().placed(tile)); - //last builder was this local client player, call placed() if(!headless && builderID == player.id){ - //this is run delayed, since if this is called on the server, all clients need to recieve the onBuildFinish() - //event first before they can recieve the placed() event modification results if(!skipConfig){ - Core.app.post(() -> tile.block().playerPlaced(tile)); + tile.block().playerPlaced(tile); } } - Core.app.post(() -> Events.fire(new BlockBuildEndEvent(tile, playerGroup.getByID(builderID), team, false))); - Sounds.place.at(tile, Mathf.random(0.7f, 1.4f)); + 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)); + if(shouldPlay()) Sounds.place.at(tile, calcPitch(true)); } @Override @@ -92,7 +124,7 @@ public class BuildBlock extends Block{ @Override public TextureRegion getDisplayIcon(Tile tile){ BuildEntity entity = tile.entity(); - return (entity.cblock == null ? entity.previous : entity.cblock).icon(Cicon.full); + return (entity.cblock == null ? entity.previous : entity.cblock).icon(io.anuke.mindustry.ui.Cicon.full); } @Override @@ -112,6 +144,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); } @@ -137,7 +172,7 @@ public class BuildBlock extends Block{ if(entity.previous == null) return; - if(Core.atlas.isFound(entity.previous.icon(Cicon.full))){ + if(Core.atlas.isFound(entity.previous.icon(io.anuke.mindustry.ui.Cicon.full))){ Draw.rect(entity.previous.icon(Cicon.full), tile.drawx(), tile.drawy(), entity.previous.rotate ? tile.rotation() * 90 : 0); } } @@ -210,7 +245,7 @@ public class BuildBlock extends Block{ } if(progress >= 1f || state.rules.infiniteResources){ - Call.onConstructFinish(tile, cblock, builderID, tile.rotation(), builder.getTeam(), configured); + constructed(tile, cblock, builderID, tile.rotation(), builder.getTeam(), configured); return true; } return false; diff --git a/core/src/io/anuke/mindustry/world/blocks/Floor.java b/core/src/io/anuke/mindustry/world/blocks/Floor.java index 86fc8b5ea1..c293eb5f9d 100644 --- a/core/src/io/anuke/mindustry/world/blocks/Floor.java +++ b/core/src/io/anuke/mindustry/world/blocks/Floor.java @@ -9,8 +9,8 @@ import io.anuke.arc.math.*; import io.anuke.arc.math.geom.*; import io.anuke.mindustry.content.*; import io.anuke.mindustry.entities.Effects.*; -import io.anuke.mindustry.game.*; import io.anuke.mindustry.type.*; +import io.anuke.mindustry.ui.Cicon; import io.anuke.mindustry.world.*; import static io.anuke.mindustry.Vars.tilesize; diff --git a/core/src/io/anuke/mindustry/world/blocks/ItemSelection.java b/core/src/io/anuke/mindustry/world/blocks/ItemSelection.java index 391638355f..26e4a3d5c9 100644 --- a/core/src/io/anuke/mindustry/world/blocks/ItemSelection.java +++ b/core/src/io/anuke/mindustry/world/blocks/ItemSelection.java @@ -1,20 +1,20 @@ 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.*; -import io.anuke.mindustry.game.*; import io.anuke.mindustry.gen.*; import io.anuke.mindustry.type.*; import io.anuke.mindustry.ui.*; +import io.anuke.mindustry.ui.Cicon; 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/ForceProjector.java b/core/src/io/anuke/mindustry/world/blocks/defense/ForceProjector.java index 4107281512..52977033f3 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); @@ -73,8 +72,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); } 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..30c261e0e1 100644 --- a/core/src/io/anuke/mindustry/world/blocks/defense/MendProjector.java +++ b/core/src/io/anuke/mindustry/world/blocks/defense/MendProjector.java @@ -139,7 +139,7 @@ public class MendProjector extends Block{ 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..a9177fa1c7 100644 --- a/core/src/io/anuke/mindustry/world/blocks/defense/OverdriveProjector.java +++ b/core/src/io/anuke/mindustry/world/blocks/defense/OverdriveProjector.java @@ -139,7 +139,7 @@ public class OverdriveProjector extends Block{ 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/Wall.java b/core/src/io/anuke/mindustry/world/blocks/defense/Wall.java index 66972be035..70d6b6f91f 100644 --- a/core/src/io/anuke/mindustry/world/blocks/defense/Wall.java +++ b/core/src/io/anuke/mindustry/world/blocks/defense/Wall.java @@ -51,5 +51,4 @@ public class Wall extends Block{ public boolean canReplace(Block other){ return super.canReplace(other) && health > other.health; } - } diff --git a/core/src/io/anuke/mindustry/world/blocks/defense/turrets/CooledTurret.java b/core/src/io/anuke/mindustry/world/blocks/defense/turrets/CooledTurret.java index 86f15dce93..58038d857e 100644 --- a/core/src/io/anuke/mindustry/world/blocks/defense/turrets/CooledTurret.java +++ b/core/src/io/anuke/mindustry/world/blocks/defense/turrets/CooledTurret.java @@ -11,6 +11,7 @@ import io.anuke.mindustry.type.*; import io.anuke.mindustry.world.*; import io.anuke.mindustry.world.consumers.*; import io.anuke.mindustry.world.meta.*; +import io.anuke.mindustry.world.meta.values.*; import static io.anuke.mindustry.Vars.tilesize; @@ -31,9 +32,7 @@ public class CooledTurret extends Turret{ public void setStats(){ super.setStats(); - float maxUsed = consumes.get(ConsumeType.liquid).amount; - - stats.add(BlockStat.boostEffect, 1f + maxUsed * coolantMultiplier, StatUnit.timesSpeed); + stats.add(BlockStat.booster, new BoosterListValue(reload, consumes.get(ConsumeType.liquid).amount, coolantMultiplier, true, l -> consumes.liquidfilters.get(l.id))); } @Override 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 b48b36303f..3cce48833e 100644 --- a/core/src/io/anuke/mindustry/world/blocks/defense/turrets/ItemTurret.java +++ b/core/src/io/anuke/mindustry/world/blocks/defense/turrets/ItemTurret.java @@ -7,11 +7,11 @@ import io.anuke.mindustry.*; import io.anuke.mindustry.content.*; import io.anuke.mindustry.entities.bullet.*; import io.anuke.mindustry.entities.type.*; -import io.anuke.mindustry.game.*; import io.anuke.mindustry.game.EventType.*; import io.anuke.mindustry.graphics.*; import io.anuke.mindustry.type.*; import io.anuke.mindustry.ui.*; +import io.anuke.mindustry.ui.Cicon; import io.anuke.mindustry.world.*; import io.anuke.mindustry.world.consumers.*; import io.anuke.mindustry.world.meta.*; @@ -45,7 +45,7 @@ public class ItemTurret extends CooledTurret{ @Override public void build(Tile tile, Table table){ MultiReqImage image = new MultiReqImage(); - content.items().each(i -> filter.test(i) && (!world.isZone() || data.isUnlocked(i)), item -> image.add(new ReqImage(new ItemImage(item.icon(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); 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 b33b21a55d..d6b94f872c 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 @@ -1,17 +1,15 @@ package io.anuke.mindustry.world.blocks.defense.turrets; -import io.anuke.arc.math.Angles; -import io.anuke.arc.math.Mathf; -import io.anuke.arc.util.Time; -import io.anuke.mindustry.entities.Effects; -import io.anuke.mindustry.entities.type.Bullet; -import io.anuke.mindustry.entities.bullet.BulletType; -import io.anuke.mindustry.entities.type.TileEntity; -import io.anuke.mindustry.type.Liquid; -import io.anuke.mindustry.world.Tile; +import io.anuke.arc.math.*; +import io.anuke.arc.util.*; +import io.anuke.mindustry.entities.*; +import io.anuke.mindustry.entities.bullet.*; +import io.anuke.mindustry.entities.type.*; +import io.anuke.mindustry.type.*; +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 io.anuke.mindustry.world.meta.values.*; import static io.anuke.mindustry.Vars.tilesize; @@ -24,13 +22,15 @@ public class LaserTurret extends PowerTurret{ canOverdrive = false; consumes.add(new ConsumeLiquidFilter(liquid -> liquid.temperature <= 0.5f && liquid.flammability < 0.1f, 0.01f)).update(false); + coolantMultiplier = 1f; } @Override public void setStats(){ super.setStats(); - stats.remove(BlockStat.boostEffect); + stats.remove(BlockStat.booster); + stats.add(BlockStat.input, new BoosterListValue(reload, consumes.get(ConsumeType.liquid).amount, coolantMultiplier, false, l -> consumes.liquidfilters.get(l.id))); stats.remove(BlockStat.damage); //damages every 5 ticks, at least in meltdown's case stats.add(BlockStat.damage, shootType.damage * 60f / 5f, StatUnit.perSecond); @@ -74,7 +74,7 @@ public class LaserTurret extends PowerTurret{ Liquid liquid = entity.liquids.current(); float maxUsed = consumes.get(ConsumeType.liquid).amount; - float used = baseReloadSpeed(tile) * (tile.isEnemyCheat() ? maxUsed : Math.min(entity.liquids.get(liquid), maxUsed * Time.delta())); + float used = baseReloadSpeed(tile) * (tile.isEnemyCheat() ? maxUsed : Math.min(entity.liquids.get(liquid), maxUsed * Time.delta())) * liquid.heatCapacity * coolantMultiplier; entity.reload += used; entity.liquids.remove(liquid, used); 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..2150fdac4d 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){ 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..e0b815d583 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); @@ -119,10 +119,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); } } 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 3bad2c3945..fad38034e5 100644 --- a/core/src/io/anuke/mindustry/world/blocks/distribution/ArmoredConveyor.java +++ b/core/src/io/anuke/mindustry/world/blocks/distribution/ArmoredConveyor.java @@ -18,6 +18,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() && (Point2.equals(tile.x + Geometry.d4(rotation).x, tile.y + Geometry.d4(rotation).y, otherx, othery) - || ((!otherblock.rotate && 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))); + || ((!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)))); } } diff --git a/core/src/io/anuke/mindustry/world/blocks/distribution/Conduit.java b/core/src/io/anuke/mindustry/world/blocks/distribution/Conduit.java index d051adbc2d..6459c6be68 100644 --- a/core/src/io/anuke/mindustry/world/blocks/distribution/Conduit.java +++ b/core/src/io/anuke/mindustry/world/blocks/distribution/Conduit.java @@ -1,9 +1,13 @@ package io.anuke.mindustry.world.blocks.distribution; 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.*; @@ -22,6 +26,7 @@ public class Conduit extends LiquidBlock implements Autotiler{ rotate = true; solid = false; floating = true; + conveyorPlacement = true; } @Override @@ -40,7 +45,7 @@ public class Conduit extends LiquidBlock implements Autotiler{ super.onProximityUpdate(tile); ConduitEntity entity = tile.entity(); - int[] bits = buildBlending(tile, tile.rotation(), null); + int[] bits = buildBlending(tile, tile.rotation(), null, true); entity.blendbits = bits[0]; } @@ -61,6 +66,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; @@ -109,7 +124,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()); + 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()); } @Override 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 09e73ce7cb..4c6aae0be6 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.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.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,7 @@ public class Conveyor extends Block implements Autotiler{ group = BlockGroup.transportation; hasItems = true; itemCapacity = 4; + conveyorPlacement = true; idleSound = Sounds.conveyor; idleSoundVolume = 0.004f; @@ -59,7 +58,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 @@ -94,7 +93,7 @@ public class Conveyor extends Block implements Autotiler{ super.onProximityUpdate(tile); ConveyorEntity entity = tile.entity(); - int[] bits = buildBlending(tile, tile.rotation(), null); + int[] bits = buildBlending(tile, tile.rotation(), null, true); entity.blendbits = bits[0]; entity.blendsclx = bits[1]; entity.blendscly = bits[2]; @@ -183,7 +182,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--){ @@ -251,6 +250,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(); @@ -413,12 +422,12 @@ public class Conveyor extends Block implements Autotiler{ static long toLong(int value){ byte[] values = Pack.bytes(value, writeByte); - byte itemid = values[0]; + short itemid = content.item(values[0]).id; float x = values[1] / 127f; float y = ((int)values[2] + 128) / 255f; short[] shorts = writeShort; - shorts[0] = (short)itemid; + shorts[0] = itemid; shorts[1] = (short)(x * Short.MAX_VALUE); shorts[2] = (short)((y - 1f) * Short.MAX_VALUE); return Pack.longShorts(shorts); 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..f30fa0433f 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.*; diff --git a/core/src/io/anuke/mindustry/world/blocks/distribution/LiquidJunction.java b/core/src/io/anuke/mindustry/world/blocks/distribution/LiquidJunction.java index c2942cb797..db5623276f 100644 --- a/core/src/io/anuke/mindustry/world/blocks/distribution/LiquidJunction.java +++ b/core/src/io/anuke/mindustry/world/blocks/distribution/LiquidJunction.java @@ -1,18 +1,15 @@ 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; +import io.anuke.arc.*; +import io.anuke.arc.graphics.g2d.*; +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); - hasLiquids = true; } @Override @@ -38,23 +35,10 @@ public class LiquidJunction extends LiquidBlock{ } @Override - public void handleLiquid(Tile tile, Tile source, Liquid liquid, float amount){ + public Tile getLiquidDestination(Tile tile, Tile source){ 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); + Tile next = tile.getNearby(dir).link(); + return next.block().getLiquidDestination(next, tile); } } 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 bf6cb7d436..46486bc074 100644 --- a/core/src/io/anuke/mindustry/world/blocks/distribution/Sorter.java +++ b/core/src/io/anuke/mindustry/world/blocks/distribution/Sorter.java @@ -1,10 +1,9 @@ package io.anuke.mindustry.world.blocks.distribution; -import io.anuke.arc.*; -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.*; @@ -39,7 +38,7 @@ public class Sorter extends Block{ @Override public void playerPlaced(Tile tile){ if(lastItem != null){ - Core.app.post(() -> tile.configure(lastItem.id)); + tile.configure(lastItem.id); } } @@ -65,6 +64,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); @@ -80,7 +84,7 @@ public class Sorter extends Block{ } boolean isSame(Tile tile, Tile other){ - return other != null && other.block() == this && other.entity().sortItem == tile.entity().sortItem; + return other != null && other.block() instanceof Sorter && other.entity().sortItem == tile.entity().sortItem; } Tile getTileTarget(Item item, Tile dest, Tile source, boolean flip){ 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/ItemLiquidGenerator.java b/core/src/io/anuke/mindustry/world/blocks/power/ItemLiquidGenerator.java index 5af8ba1e9c..d185a9f9cd 100644 --- a/core/src/io/anuke/mindustry/world/blocks/power/ItemLiquidGenerator.java +++ b/core/src/io/anuke/mindustry/world/blocks/power/ItemLiquidGenerator.java @@ -87,7 +87,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; } 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 1907329ee4..2103f4d58e 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.*; @@ -101,46 +102,56 @@ 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)){ - tempTiles.add(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.configure(other.pos()); + tile.configureAny(other.pos()); } }); 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() + 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); tempTiles.clear(); graphs.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) && !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); }); } @@ -149,6 +160,7 @@ public class PowerNode extends PowerBlock{ super.setStats(); stats.add(BlockStat.powerRange, laserRange, StatUnit.blocks); + stats.add(BlockStat.powerConnections, maxNodes, StatUnit.none); } @Override @@ -161,12 +173,24 @@ public class PowerNode extends PowerBlock{ TileEntity entity = tile.entity(); other = other.link(); - Tile result = other; - if(linkValid(tile, other)){ tile.configure(other.pos()); return false; } + + if(tile == other){ + if(other.entity.power.links.size == 0){ + getPotentialLinks(tile, link -> { + tile.configure(link.pos()); + }); + }else{ + while(entity.power.links.size > 0){ + tile.configure(entity.power.links.get(0)); + } + } + return false; + } + return true; } @@ -221,7 +245,13 @@ public class PowerNode extends PowerBlock{ Draw.color(Pal.placing); Drawf.circles(x * tilesize + offset(), y * tilesize + offset(), laserRange * tilesize); - getPotentialLinks(tile, other -> Drawf.square(other.drawx(), other.drawy(), other.block().size * tilesize / 2f + 2f, Pal.place)); + getPotentialLinks(tile, other -> { + Drawf.square(other.drawx(), other.drawy(), other.block().size * tilesize / 2f + 2f, Pal.place); + + insulators(tile.x, tile.y, other.x, other.y, cause -> { + Drawf.square(cause.drawx(), cause.drawy(), cause.block().size * tilesize / 2f + 2f, Pal.plastanium); + }); + }); Draw.reset(); } @@ -273,6 +303,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 overlaps(src.drawx(), src.drawy(), other, laserRange * tilesize); + } + protected void drawLaser(Tile tile, Tile target){ int opacityPercentage = Core.settings.getInt("lasersopacity"); if(opacityPercentage == 0) return; @@ -291,12 +326,35 @@ public class PowerNode extends PowerBlock{ x2 += t2.x; y2 += t2.y; - float fract = 1f-tile.entity.power.graph.getSatisfaction(); + float fract = 1f - tile.entity.power.graph.getSatisfaction(); - Draw.color(Color.white, Pal.powerLight, fract*0.86f + Mathf.absin(3f, 0.1f)); + Draw.color(Color.white, Pal.powerLight, fract * 0.86f + Mathf.absin(3f, 0.1f)); Draw.alpha(opacity); Drawf.laser(laser, laserEnd, x1, y1, x2, y2, 0.25f); Draw.color(); } + public static boolean insulated(Tile tile, Tile other){ + return insulated(tile.x, tile.y, other.x, other.y); + } + + 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]; + } + + 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.get(tile); + } + + return false; + }); + } } 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..62bdef1e2d 100644 --- a/core/src/io/anuke/mindustry/world/blocks/production/Cultivator.java +++ b/core/src/io/anuke/mindustry/world/blocks/production/Cultivator.java @@ -23,6 +23,7 @@ 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); @@ -57,7 +58,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 @@ -103,7 +104,7 @@ public class Cultivator extends GenericCrafter{ 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 41d024bd86..084d26df0e 100644 --- a/core/src/io/anuke/mindustry/world/blocks/production/Drill.java +++ b/core/src/io/anuke/mindustry/world/blocks/production/Drill.java @@ -10,11 +10,11 @@ import io.anuke.mindustry.content.*; import io.anuke.mindustry.entities.*; import io.anuke.mindustry.entities.Effects.*; import io.anuke.mindustry.entities.type.*; -import io.anuke.mindustry.game.*; import io.anuke.mindustry.gen.*; import io.anuke.mindustry.graphics.*; import io.anuke.mindustry.type.*; import io.anuke.mindustry.ui.*; +import io.anuke.mindustry.ui.Cicon; import io.anuke.mindustry.world.*; import io.anuke.mindustry.world.meta.*; @@ -129,7 +129,7 @@ public class Drill extends Block{ } @Override - public boolean canProduce(Tile tile){ + public boolean shouldConsume(Tile tile){ return tile.entity.items.total() < itemCapacity; } @@ -194,7 +194,9 @@ public class Drill extends Block{ }); stats.add(BlockStat.drillSpeed, 60f / drillTime * size * size, StatUnit.itemsSecond); - stats.add(BlockStat.boostEffect, liquidBoostIntensity, StatUnit.timesSpeed); + if(liquidBoostIntensity > 0){ + stats.add(BlockStat.boostEffect, liquidBoostIntensity * liquidBoostIntensity, StatUnit.timesSpeed); + } } void countOre(Tile tile){ diff --git a/core/src/io/anuke/mindustry/world/blocks/production/Fracker.java b/core/src/io/anuke/mindustry/world/blocks/production/Fracker.java index 2cd220d7b2..632fe30b7d 100644 --- a/core/src/io/anuke/mindustry/world/blocks/production/Fracker.java +++ b/core/src/io/anuke/mindustry/world/blocks/production/Fracker.java @@ -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; } 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..5ee91e3f01 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); @@ -73,7 +73,7 @@ public class GenericCrafter extends Block{ if(drawer == null){ super.draw(tile); }else{ - drawer.accept(tile); + drawer.get(tile); } } @@ -135,7 +135,7 @@ 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; } 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..a2e989d81c 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)}; 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 37199f6c61..b7813c5b4f 100644 --- a/core/src/io/anuke/mindustry/world/blocks/production/Separator.java +++ b/core/src/io/anuke/mindustry/world/blocks/production/Separator.java @@ -4,6 +4,7 @@ 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.util.ArcAnnotate.*; import io.anuke.mindustry.entities.type.TileEntity; import io.anuke.mindustry.type.Item; import io.anuke.mindustry.type.ItemStack; @@ -20,7 +21,7 @@ import io.anuke.mindustry.world.meta.values.ItemFilterValue; * Extracts a random list of items from an input item and an input liquid. */ public class Separator extends Block{ - protected ItemStack[] results; + protected @NonNull ItemStack[] results; protected float craftTime; protected float spinnerRadius = 2.5f; protected float spinnerLength = 1f; @@ -60,7 +61,7 @@ public class Separator extends Block{ } @Override - public boolean canProduce(Tile tile){ + public boolean shouldConsume(Tile tile){ return tile.entity.items.total() < itemCapacity; } 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..332c8c6d67 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.*; 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 0aa787c79e..df34b54342 100644 --- a/core/src/io/anuke/mindustry/world/blocks/sandbox/LiquidSource.java +++ b/core/src/io/anuke/mindustry/world/blocks/sandbox/LiquidSource.java @@ -2,18 +2,18 @@ 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.*; -import io.anuke.mindustry.game.*; import io.anuke.mindustry.gen.*; import io.anuke.mindustry.type.*; import io.anuke.mindustry.ui.*; +import io.anuke.mindustry.ui.Cicon; import io.anuke.mindustry.world.*; import java.io.*; @@ -113,7 +113,7 @@ public class LiquidSource extends Block{ @Override public void configured(Tile tile, Player player, int value){ - tile.entity().source = content.liquid(value); + tile.entity().source = value == -1 ? null : content.liquid(value); } class LiquidSourceEntity extends TileEntity{ diff --git a/core/src/io/anuke/mindustry/world/blocks/storage/CoreBlock.java b/core/src/io/anuke/mindustry/world/blocks/storage/CoreBlock.java index 045003a545..09552c2bef 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.*; @@ -111,7 +111,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 +119,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(); 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 ceb9191948..5c7ce01bf6 100644 --- a/core/src/io/anuke/mindustry/world/blocks/storage/Unloader.java +++ b/core/src/io/anuke/mindustry/world/blocks/storage/Unloader.java @@ -1,10 +1,9 @@ package io.anuke.mindustry.world.blocks.storage; -import io.anuke.arc.*; -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.*; @@ -49,7 +48,7 @@ public class Unloader extends Block{ @Override public void playerPlaced(Tile tile){ if(lastItem != null){ - Core.app.post(() -> tile.configure(lastItem.id)); + tile.configure(lastItem.id); } } 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 9dfee5e827..1c82bed65c 100644 --- a/core/src/io/anuke/mindustry/world/blocks/units/MechPad.java +++ b/core/src/io/anuke/mindustry/world/blocks/units/MechPad.java @@ -2,10 +2,12 @@ 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.*; import io.anuke.arc.util.*; +import io.anuke.arc.util.ArcAnnotate.*; import io.anuke.mindustry.content.*; import io.anuke.mindustry.entities.*; import io.anuke.mindustry.entities.traits.*; @@ -23,7 +25,7 @@ import java.io.*; import static io.anuke.mindustry.Vars.*; public class MechPad extends Block{ - protected Mech mech; + public @NonNull Mech mech; protected float buildTime = 60 * 5; public MechPad(String name){ @@ -32,6 +34,7 @@ public class MechPad extends Block{ solid = false; hasPower = true; layer = Layer.overlay; + flags = EnumSet.of(BlockFlag.mechPad); } @Override @@ -41,11 +44,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; @@ -113,7 +111,7 @@ public class MechPad extends Block{ MechFactoryEntity entity = tile.entity(); if(entity.player != null){ - RespawnBlock.drawRespawn(tile, entity.heat, entity.progress, entity.time, entity.player, (!entity.sameMech && entity.player.mech == mech ? Mechs.starter : mech)); + RespawnBlock.drawRespawn(tile, entity.heat, entity.progress, entity.time, entity.player, (!entity.sameMech && entity.player.mech == mech ? mech : Mechs.starter)); } } 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 35caf17d9c..1090f84015 100644 --- a/core/src/io/anuke/mindustry/world/blocks/units/UnitFactory.java +++ b/core/src/io/anuke/mindustry/world/blocks/units/UnitFactory.java @@ -10,13 +10,13 @@ import io.anuke.mindustry.Vars; import io.anuke.mindustry.content.Fx; import io.anuke.mindustry.entities.Effects; import io.anuke.mindustry.entities.type.*; -import io.anuke.mindustry.game.*; import io.anuke.mindustry.game.EventType.*; import io.anuke.mindustry.gen.Call; import io.anuke.mindustry.graphics.Pal; import io.anuke.mindustry.graphics.Shaders; import io.anuke.mindustry.type.*; import io.anuke.mindustry.ui.Bar; +import io.anuke.mindustry.ui.Cicon; import io.anuke.mindustry.world.Block; import io.anuke.mindustry.world.Tile; import io.anuke.mindustry.world.consumers.ConsumeItems; @@ -27,7 +27,7 @@ import java.io.*; import static io.anuke.mindustry.Vars.*; public class UnitFactory extends Block{ - protected UnitType type; + protected UnitType unitType; protected float produceTime = 1000f; protected float launchVelocity = 0f; protected TextureRegion topRegion; @@ -57,7 +57,7 @@ public class UnitFactory extends Block{ Effects.effect(Fx.producesmoke, tile.drawx(), tile.drawy()); if(!net.client()){ - BaseUnit unit = factory.type.create(tile.getTeam()); + BaseUnit unit = factory.unitType.create(tile.getTeam()); unit.setSpawner(tile); unit.set(tile.drawx() + Mathf.range(4), tile.drawy() + Mathf.range(4)); unit.add(); @@ -122,7 +122,7 @@ public class UnitFactory extends Block{ @Override public void draw(Tile tile){ UnitFactoryEntity entity = tile.entity(); - TextureRegion region = type.icon(Cicon.full); + TextureRegion region = unitType.icon(Cicon.full); Draw.rect(name, tile.drawx(), tile.drawy()); @@ -170,7 +170,7 @@ public class UnitFactory extends Block{ entity.buildTime = 0f; Call.onUnitFactorySpawn(tile, entity.spawned + 1); - useContent(tile, type); + useContent(tile, unitType); entity.cons.trigger(); } @@ -186,16 +186,11 @@ public class UnitFactory extends Block{ } @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 57133c66ea..93e05c17aa 100644 --- a/core/src/io/anuke/mindustry/world/consumers/ConsumeItemFilter.java +++ b/core/src/io/anuke/mindustry/world/consumers/ConsumeItemFilter.java @@ -1,13 +1,13 @@ 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.*; -import io.anuke.mindustry.game.*; import io.anuke.mindustry.type.*; import io.anuke.mindustry.ui.*; +import io.anuke.mindustry.ui.Cicon; import io.anuke.mindustry.world.*; import io.anuke.mindustry.world.meta.*; import io.anuke.mindustry.world.meta.values.*; @@ -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/ConsumeItems.java b/core/src/io/anuke/mindustry/world/consumers/ConsumeItems.java index f6b047bf6f..0b5c7bc5bc 100644 --- a/core/src/io/anuke/mindustry/world/consumers/ConsumeItems.java +++ b/core/src/io/anuke/mindustry/world/consumers/ConsumeItems.java @@ -4,9 +4,9 @@ import io.anuke.arc.collection.*; import io.anuke.arc.scene.ui.layout.*; import io.anuke.arc.util.ArcAnnotate.*; import io.anuke.mindustry.entities.type.*; -import io.anuke.mindustry.game.*; import io.anuke.mindustry.type.*; import io.anuke.mindustry.ui.*; +import io.anuke.mindustry.ui.Cicon; import io.anuke.mindustry.world.*; import io.anuke.mindustry.world.meta.*; import io.anuke.mindustry.world.meta.values.*; diff --git a/core/src/io/anuke/mindustry/world/consumers/ConsumeLiquid.java b/core/src/io/anuke/mindustry/world/consumers/ConsumeLiquid.java index 2774849cb5..faaf5dc4ca 100644 --- a/core/src/io/anuke/mindustry/world/consumers/ConsumeLiquid.java +++ b/core/src/io/anuke/mindustry/world/consumers/ConsumeLiquid.java @@ -4,9 +4,9 @@ import io.anuke.arc.collection.*; import io.anuke.arc.scene.ui.layout.*; import io.anuke.arc.util.ArcAnnotate.*; import io.anuke.mindustry.entities.type.*; -import io.anuke.mindustry.game.*; import io.anuke.mindustry.type.*; import io.anuke.mindustry.ui.*; +import io.anuke.mindustry.ui.Cicon; import io.anuke.mindustry.world.*; import io.anuke.mindustry.world.meta.*; diff --git a/core/src/io/anuke/mindustry/world/consumers/ConsumeLiquidFilter.java b/core/src/io/anuke/mindustry/world/consumers/ConsumeLiquidFilter.java index 3f2ff4ced7..1da3e86e50 100644 --- a/core/src/io/anuke/mindustry/world/consumers/ConsumeLiquidFilter.java +++ b/core/src/io/anuke/mindustry/world/consumers/ConsumeLiquidFilter.java @@ -1,11 +1,11 @@ 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.game.*; import io.anuke.mindustry.type.Liquid; +import io.anuke.mindustry.ui.Cicon; import io.anuke.mindustry.ui.MultiReqImage; import io.anuke.mindustry.ui.ReqImage; import io.anuke.mindustry.world.Tile; @@ -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..dcdc1fd487 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; @@ -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; }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..9006d51b09 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{ @@ -10,13 +10,13 @@ public enum BuildVisibility{ sandboxOnly(() -> Vars.state.rules.infiniteResources), campaignOnly(() -> Vars.world.isZone()); - 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/Producers.java b/core/src/io/anuke/mindustry/world/meta/Producers.java index 346a387860..2b430ee28a 100644 --- a/core/src/io/anuke/mindustry/world/meta/Producers.java +++ b/core/src/io/anuke/mindustry/world/meta/Producers.java @@ -1,6 +1,6 @@ package io.anuke.mindustry.world.meta; -import io.anuke.mindustry.game.Content; +import io.anuke.mindustry.ctype.Content; public class Producers{ private Content output; 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 eb613ed766..3fb9af730d 100644 --- a/core/src/io/anuke/mindustry/world/meta/values/AmmoListValue.java +++ b/core/src/io/anuke/mindustry/world/meta/values/AmmoListValue.java @@ -7,9 +7,10 @@ import io.anuke.arc.math.*; import io.anuke.arc.scene.ui.layout.*; import io.anuke.arc.util.*; import io.anuke.mindustry.content.*; +import io.anuke.mindustry.ctype.UnlockableContent; import io.anuke.mindustry.entities.bullet.*; -import io.anuke.mindustry.game.*; import io.anuke.mindustry.gen.*; +import io.anuke.mindustry.ui.Cicon; import io.anuke.mindustry.world.meta.*; import static io.anuke.mindustry.Vars.tilesize; diff --git a/core/src/io/anuke/mindustry/world/meta/values/BoosterListValue.java b/core/src/io/anuke/mindustry/world/meta/values/BoosterListValue.java new file mode 100644 index 0000000000..30c1ff0765 --- /dev/null +++ b/core/src/io/anuke/mindustry/world/meta/values/BoosterListValue.java @@ -0,0 +1,56 @@ +package io.anuke.mindustry.world.meta.values; + +import io.anuke.arc.*; +import io.anuke.arc.func.*; +import io.anuke.arc.scene.ui.layout.*; +import io.anuke.arc.util.*; +import io.anuke.mindustry.gen.*; +import io.anuke.mindustry.type.*; +import io.anuke.mindustry.ui.Cicon; +import io.anuke.mindustry.world.meta.*; + +import static io.anuke.mindustry.Vars.content; + +public class BoosterListValue implements StatValue{ + protected float reload, maxUsed, multiplier; + protected boolean baseReload; + protected Boolf filter; + + public BoosterListValue(float reload, float maxUsed, float multiplier, boolean baseReload, Boolf filter){ + this.reload = reload; + this.maxUsed = maxUsed; + this.baseReload = baseReload; + this.multiplier = multiplier; + this.filter = filter; + } + + @Override + public void display(Table table){ + + table.row(); + table.table(c -> { + for(Liquid liquid : content.liquids()){ + if(!filter.get(liquid)) continue; + + c.addImage(liquid.icon(Cicon.medium)).size(3 * 8).padRight(4).right().top(); + c.add(liquid.localizedName).padRight(10).left().top(); + c.table(Tex.underline, bt -> { + bt.left().defaults().padRight(3).left(); + + float reloadRate = (baseReload ? 1f : 0f) + maxUsed * multiplier * liquid.heatCapacity; + float standardReload = baseReload ? reload : reload / (maxUsed * multiplier * 0.4f); + float result = standardReload / (reload / reloadRate); + bt.add(Core.bundle.format("bullet.reload", Strings.fixed(result, 1))); + }).left().padTop(-9); + c.row(); + } + }).colspan(table.getColumns()); + table.row(); + + } + + void sep(Table table, String text){ + table.row(); + table.add(text); + } +} 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/desktop/build.gradle b/desktop/build.gradle index 7aac76552a..90d7fbdca2 100644 --- a/desktop/build.gradle +++ b/desktop/build.gradle @@ -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()}" diff --git a/desktop/src/io/anuke/mindustry/desktop/DesktopLauncher.java b/desktop/src/io/anuke/mindustry/desktop/DesktopLauncher.java index a35b74f619..1ce411d804 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.*; @@ -19,9 +19,9 @@ import io.anuke.arc.util.io.*; import io.anuke.arc.util.serialization.*; import io.anuke.mindustry.*; import io.anuke.mindustry.core.GameState.*; +import io.anuke.mindustry.core.Version; import io.anuke.mindustry.desktop.steam.*; import io.anuke.mindustry.game.EventType.*; -import io.anuke.mindustry.game.Version; import io.anuke.mindustry.mod.Mods.*; import io.anuke.mindustry.net.*; import io.anuke.mindustry.net.Net.*; @@ -39,7 +39,8 @@ 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,75 +92,91 @@ 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){ - Log.err(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."); - Log.err(e); + logSteamError(e); } } } + 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); + s.write(log.getBytes()); + }catch(Exception e2){ + Log.err(e2); + } + } + void fallbackSteam(){ try{ String name = "steam_api"; @@ -169,7 +186,7 @@ public class DesktopLauncher extends ClientLauncher{ Streams.copyStream(getClass().getResourceAsStream(name), new FileOutputStream(name)); System.loadLibrary(new File(name).getAbsolutePath()); }catch(Throwable e){ - Log.err(e); + logSteamError(e); } } @@ -222,12 +239,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" + @@ -243,7 +260,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 f6f9a6c3bf..526152a52e 100644 --- a/desktop/src/io/anuke/mindustry/desktop/steam/SNet.java +++ b/desktop/src/io/anuke/mindustry/desktop/steam/SNet.java @@ -6,11 +6,12 @@ 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.*; +import io.anuke.mindustry.core.Version; import io.anuke.mindustry.game.EventType.*; -import io.anuke.mindustry.game.Version; import io.anuke.mindustry.game.*; import io.anuke.mindustry.net.ArcNetImpl.*; import io.anuke.mindustry.net.*; @@ -38,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){ @@ -63,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(); @@ -163,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; @@ -171,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); } @@ -245,6 +246,13 @@ public class SNet implements SteamNetworkingCallback, SteamMatchmakingCallback, return; } + if(net.active()){ + net.disconnect(); + net.closeServer(); + logic.reset(); + state.set(State.menu); + } + currentLobby = steamIDLobby; currentServer = smat.getLobbyOwner(steamIDLobby); @@ -307,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 b5b010bb9e..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(){ @@ -57,6 +57,7 @@ public class SWorkshop implements SteamUGCCallback{ /** Publish a new item and submit an update for it. * If it is already published, redirects to its page.*/ public void publish(Publishable p){ + Log.info("publish(): " + p.steamTitle()); if(p.hasSteamID()){ Log.info("Content already published, redirecting to ID."); viewListing(p); @@ -64,6 +65,7 @@ public class SWorkshop implements SteamUGCCallback{ } if(!p.prePublish()){ + Log.info("Rejecting due to pre-publish."); return; } @@ -74,27 +76,29 @@ 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())){ - FloatingDialog dialog = new FloatingDialog("$editor.mapinfo"); + FloatingDialog dialog = new FloatingDialog("$workshop.info"); dialog.setFillParent(false); - dialog.cont.add("$map.menu").pad(20f); + dialog.cont.add("$workshop.menu").pad(20f); dialog.addCloseButton(); dialog.buttons.addImageTextButton("$view.workshop", Icon.linkSmall, () -> { @@ -111,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(); @@ -122,13 +131,13 @@ 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(); ui.showErrorMessage("$missing"); }else{ - ui.showErrorMessage(Core.bundle.format("workshop.error", result.name())); + ui.showErrorMessage(Core.bundle.format("workshop.error", details.getResult().name())); } }else{ ui.showErrorMessage(Core.bundle.format("workshop.error", result.name())); @@ -137,11 +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){ - 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){ @@ -159,10 +169,14 @@ public class SWorkshop implements SteamUGCCallback{ ugc.setItemVisibility(h, PublishedFileVisibility.Private); } ugc.submitItemUpdate(h, changelog == null ? "" : changelog); + + if(p instanceof Map){ + SAchievement.publishMap.complete(); + } }, () -> 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(); @@ -172,38 +186,46 @@ public class SWorkshop implements SteamUGCCallback{ .size(210f, 64f); dialog.buttons.addImageTextButton("$ok", Icon.checkSmall, () -> { + Log.info("Accepted, publishing item..."); + itemHandlers.add(published); ugc.createItem(SVars.steamID, WorkshopFileType.Community); ui.loadfrag.show("$publishing"); dialog.hide(); - itemHandlers.add(published); }).size(170f, 64f); 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){ - SteamUGCUpdateHandle h = ugc.startItemUpdate(SVars.steamID, publishedFileID); + void updateItem(SteamPublishedFileID publishedFileID, Cons tagger, Runnable updated){ + try{ + SteamUGCUpdateHandle h = ugc.startItemUpdate(SVars.steamID, publishedFileID); + Log.info("begin updateItem({0})", publishedFileID.handle()); - tagger.accept(h); + tagger.get(h); + Log.info("Tagged."); - ItemUpdateInfo info = new ItemUpdateInfo(); + ItemUpdateInfo info = new ItemUpdateInfo(); - ui.loadfrag.setProgress(() -> { - ItemUpdateStatus status = ugc.getItemUpdateProgress(h, info); - ui.loadfrag.setText("$" + status.name().toLowerCase()); - if(status == ItemUpdateStatus.Invalid){ - ui.loadfrag.setText("$done"); - return 1f; - } - return (float)status.ordinal() / (float)ItemUpdateStatus.values().length; - }); + ui.loadfrag.setProgress(() -> { + ItemUpdateStatus status = ugc.getItemUpdateProgress(h, info); + ui.loadfrag.setText("$" + status.name().toLowerCase()); + if(status == ItemUpdateStatus.Invalid){ + ui.loadfrag.setText("$done"); + return 1f; + } + return (float)status.ordinal() / (float)ItemUpdateStatus.values().length; + }); - updatedHandlers.put(publishedFileID, updated); + updatedHandlers.put(publishedFileID, updated); + }catch(Throwable t){ + ui.loadfrag.hide(); + Log.err(t); + } } @Override @@ -216,18 +238,23 @@ public class SWorkshop implements SteamUGCCallback{ Log.info("GET QUERY " + query); if(detailHandlers.containsKey(query)){ + Log.info("Query being handled..."); if(numResultsReturned > 0){ + Log.info("{0} q results", numResultsReturned); Array details = new Array<>(); for(int i = 0; i < numResultsReturned; i++){ - details.set(i, new SteamUGCDetails()); + details.add(new SteamUGCDetails()); ugc.getQueryUGCResult(query, i, details.get(i)); } - detailHandlers.get(query).accept(details, result); + detailHandlers.get(query).get(details, result); }else{ - detailHandlers.get(query).accept(new Array<>(), SteamResult.FileNotFound); + Log.info("Nothing found."); + detailHandlers.get(query).get(new Array<>(), SteamResult.FileNotFound); } detailHandlers.remove(query); + }else{ + Log.info("Query not handled."); } } @@ -248,24 +275,28 @@ public class SWorkshop implements SteamUGCCallback{ @Override public void onCreateItem(SteamPublishedFileID publishedFileID, boolean needsToAcceptWLA, SteamResult result){ + Log.info("onCreateItem(" + result + ")"); if(!itemHandlers.isEmpty()){ if(result == SteamResult.OK){ - itemHandlers.first().accept(publishedFileID); + Log.info("Passing to first handler."); + 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); + }else{ + Log.err("No handlers for createItem()"); } } @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"); } @@ -274,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/ja/full_description.txt b/fastlane/metadata/android/ja-JP/full_description.txt similarity index 100% rename from fastlane/metadata/android/ja/full_description.txt rename to fastlane/metadata/android/ja-JP/full_description.txt diff --git a/fastlane/metadata/android/ja/short_description.txt b/fastlane/metadata/android/ja-JP/short_description.txt similarity index 100% rename from fastlane/metadata/android/ja/short_description.txt rename to fastlane/metadata/android/ja-JP/short_description.txt diff --git a/fastlane/metadata/android/ja/title.txt b/fastlane/metadata/android/ja-JP/title.txt similarity index 100% rename from fastlane/metadata/android/ja/title.txt rename to fastlane/metadata/android/ja-JP/title.txt diff --git a/fastlane/metadata/android/ja/video.txt b/fastlane/metadata/android/ja-JP/video.txt similarity index 100% rename from fastlane/metadata/android/ja/video.txt rename to fastlane/metadata/android/ja-JP/video.txt 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 c07c359326..d5884a59a0 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,3 +1,3 @@ org.gradle.daemon=true org.gradle.jvmargs=-Xms256m -Xmx1024m -archash=e82f446a81abba5d6f712b9053c1b84ec9a73156 +archash=900a4966bf9b05272c8b0c258dc534540c0628fb diff --git a/ios/src/io/anuke/mindustry/IOSLauncher.java b/ios/src/io/anuke/mindustry/IOSLauncher.java index 0b0cf974f5..7f2998a317 100644 --- a/ios/src/io/anuke/mindustry/IOSLauncher.java +++ b/ios/src/io/anuke/mindustry/IOSLauncher.java @@ -3,13 +3,14 @@ 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.*; import io.anuke.mindustry.game.EventType.*; 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.foundation.*; import org.robovm.apple.uikit.*; @@ -34,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, () -> {}))); @@ -58,7 +59,128 @@ public class IOSLauncher extends IOSApplication.Delegate{ if(documentURLs.size() < 1) return; cont.dismissViewController(true, () -> {}); - controller.importDocument(documentURLs.get(0), new NSURL(getDocumentsDirectory() + "/document"), UIDocumentBrowserImportMode.Copy, (url, error) -> cons.accept(Core.files.absolute(url.getPath()))); + NSFileCoordinator coord = new NSFileCoordinator(null); + + try{ + coord.coordinateReadingItem(documentURLs.get(0), NSFileCoordinatorReadingOptions.None, url -> { + if(url.startAccessingSecurityScopedResource()){ + try{ + controller.importDocument(url, new NSURL(getDocumentsDirectory() + "/document"), UIDocumentBrowserImportMode.Copy, (result, error) -> { + if(error != null){ + ui.showErrorMessage("Import error.\n" + error.getLocalizedFailureReason() + "\n" + error.getLocalizedDescription()); + }else{ + try{ + cons.get(Core.files.absolute(url.getPath())); + }catch(Throwable t){ + ui.showException(t); + } + } + }); + }catch(Throwable t){ + ui.showException(t); + } + + /* + + try{ + int[] tread = {0}; + + cons.get(new FileHandle(url.getPath()){ + @Override + public InputStream read(){ + NSInputStream stream = new NSInputStream(url); + + return new InputStream(){ + byte[] tmp = {0}; + + @Override + public int read() throws IOException{ + read(tmp); + return tmp[0]; + } + + @Override + public int read(byte[] bytes, int offset, int length){ + int read = (int)stream.read(bytes, offset, length); + tread[0] += read; + return read; + } + }; + } + }); + Core.app.post(() -> Core.app.post(() -> Core.app.post(() -> ui.showInfo("Read " + tread[0])))); + //cons.get(new FileHandle(url.getAbsoluteString())); + }catch(Throwable t){ + ui.showException(t); + + try{ + cons.get(new FileHandle(url.getPath())); + }catch(Throwable t2){ + ui.showException(t2); + + try{ + cons.get(new FileHandle(url.getAbsoluteURL().getPath())); + }catch(Throwable t3){ + ui.showException(t3); + } + } + }*/ + }else{ + ui.showErrorMessage("Failed to access file."); + } + + /* + try{ + int[] tread = {0}; + + cons.get(new FileHandle(url.getPath()){ + @Override + public InputStream read(){ + NSInputStream stream = new NSInputStream(url); + + return new InputStream(){ + byte[] tmp = {0}; + + @Override + public int read() throws IOException{ + read(tmp); + return tmp[0]; + } + + @Override + public int read(byte[] bytes, int offset, int length){ + int read = (int)stream.read(bytes, offset, length); + tread[0] += read; + return read; + } + }; + } + }); + Core.app.post(() -> Core.app.post(() -> Core.app.post(() -> ui.showInfo("Read " + tread[0])))); + }catch(Throwable t){ + ui.showException(t); + }*/ + }); + }catch(Throwable t){ + ui.showException(t); + } + /* + + try{ + controller.importDocument(documentURLs.get(0), new NSURL(getDocumentsDirectory() + "/document"), UIDocumentBrowserImportMode.Copy, (url, error) -> { + if(error != null){ + ui.showErrorMessage("Import error.\n" + error.getLocalizedFailureReason() + "\n" + error.getLocalizedDescription()); + }else{ + try{ + cons.get(Core.files.absolute(url.getPath())); + }catch(Throwable t){ + ui.showException(t); + } + } + }); + }catch(Throwable t){ + ui.showException(t); + }*/ } @Override @@ -68,7 +190,7 @@ public class IOSLauncher extends IOSApplication.Delegate{ @Override public void didImportDocument(UIDocumentBrowserViewController controller, NSURL sourceURL, NSURL destinationURL){ - cons.accept(Core.files.absolute(destinationURL.getAbsoluteString())); + //cons.get(Core.files.absolute(destinationURL.getAbsoluteString())); } @Override @@ -88,23 +210,23 @@ public class IOSLauncher extends IOSApplication.Delegate{ } cont.setDelegate(new ChooserDelegate()); - UIApplication.getSharedApplication().getKeyWindow().getRootViewController().presentViewController(cont, true, () -> { - }); + 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()); - - UIApplication.getSharedApplication().getKeyWindow().getRootViewController() - .presentViewController(p, true, () -> io.anuke.arc.util.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 @@ -118,7 +240,9 @@ public class IOSLauncher extends IOSApplication.Delegate{ forced = false; UINavigationController.attemptRotationToDeviceOrientation(); } - }, config); + }, new IOSApplicationConfiguration(){{ + errorHandler = ModCrashHandler::handle; + }}); } @Override @@ -129,7 +253,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; } @@ -139,7 +262,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/src/io/anuke/mindustry/server/MindustryServer.java b/server/src/io/anuke/mindustry/server/MindustryServer.java index c42e695c1d..ad83a69eb7 100644 --- a/server/src/io/anuke/mindustry/server/MindustryServer.java +++ b/server/src/io/anuke/mindustry/server/MindustryServer.java @@ -1,6 +1,8 @@ package io.anuke.mindustry.server; import io.anuke.arc.*; +import io.anuke.arc.files.*; +import io.anuke.arc.util.*; import io.anuke.mindustry.*; import io.anuke.mindustry.core.*; import io.anuke.mindustry.mod.*; @@ -20,6 +22,15 @@ public class MindustryServer implements ApplicationListener{ loadLocales = false; headless = true; + FileHandle plugins = Core.settings.getDataDirectory().child("plugins"); + if(plugins.isDirectory() && plugins.list().length > 0 && !plugins.sibling("mods").exists()){ + Log.warn("[IMPORTANT NOTICE] &lrPlugins have been detected.&ly Automatically moving all contents of the plugin folder into the 'mods' folder. The original folder will not be removed; please do so manually."); + plugins.sibling("mods").mkdirs(); + for(FileHandle file : plugins.list()){ + file.copyTo(plugins.sibling("mods")); + } + } + Vars.loadSettings(); Vars.init(); content.createContent(); diff --git a/server/src/io/anuke/mindustry/server/ServerControl.java b/server/src/io/anuke/mindustry/server/ServerControl.java index a78792306a..7297a3c138 100644 --- a/server/src/io/anuke/mindustry/server/ServerControl.java +++ b/server/src/io/anuke/mindustry/server/ServerControl.java @@ -10,6 +10,7 @@ import io.anuke.arc.util.CommandHandler.*; import io.anuke.arc.util.Timer.*; import io.anuke.mindustry.*; import io.anuke.mindustry.core.GameState.*; +import io.anuke.mindustry.core.*; import io.anuke.mindustry.entities.*; import io.anuke.mindustry.entities.type.*; import io.anuke.mindustry.game.*; @@ -210,19 +211,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; @@ -669,28 +677,25 @@ public class ServerControl implements ApplicationListener{ if(state.is(State.playing)){ err("Already hosting. Type 'stop' to stop hosting first."); return; - }else if(!Strings.canParseInt(arg[0])){ - err("Invalid save slot '{0}'.", arg[0]); - return; } - int slot = Strings.parseInt(arg[0]); + FileHandle file = saveDirectory.child(arg[0] + "." + saveExtension); - if(!SaveIO.isSaveValid(slot)){ + if(!SaveIO.isSaveValid(file)){ err("No (valid) save data found for slot."); return; } Core.app.post(() -> { try{ - SaveIO.loadFromSlot(slot); + SaveIO.load(file); state.rules.zone = null; + info("Save loaded."); + host(); + state.set(State.playing); }catch(Throwable t){ err("Failed to load save. Outdated or corrupt file."); } - info("Save loaded."); - host(); - state.set(State.playing); }); }); @@ -698,18 +703,25 @@ public class ServerControl implements ApplicationListener{ if(!state.is(State.playing)){ err("Not hosting. Host a game first."); return; - }else if(!Strings.canParseInt(arg[0])){ - err("Invalid save slot '{0}'.", arg[0]); - return; } + FileHandle file = saveDirectory.child(arg[0] + "." + saveExtension); + Core.app.post(() -> { - int slot = Strings.parseInt(arg[0]); - SaveIO.saveToSlot(slot); - info("Saved to slot {0}.", slot); + SaveIO.save(file); + info("Saved to {0}.", file); }); }); + handler.register("saves", "List all saves in the save directory.", arg -> { + info("Save files: "); + for(FileHandle file : saveDirectory.list()){ + if(file.extension().equals(saveExtension)){ + info("| &ly{0}", file.nameWithoutExtension()); + } + } + }); + handler.register("gameover", "Force a game over.", arg -> { if(state.is(State.menu)){ info("Not playing a map."); @@ -750,8 +762,7 @@ public class ServerControl implements ApplicationListener{ }); mods.each(p -> p.registerServerCommands(handler)); - //TODO - //plugins.each(p -> p.registerClientCommands(netServer.clientCommands)); + mods.each(p -> p.registerClientCommands(netServer.clientCommands)); } private void readCommands(){ diff --git a/tests/src/test/java/ApplicationTests.java b/tests/src/test/java/ApplicationTests.java index dff351c59c..83f6ed971b 100644 --- a/tests/src/test/java/ApplicationTests.java +++ b/tests/src/test/java/ApplicationTests.java @@ -198,7 +198,7 @@ public class ApplicationTests{ void save(){ world.loadMap(testMap); assertTrue(state.teams.get(defaultTeam).cores.size > 0); - SaveIO.saveToSlot(0); + SaveIO.save(saveDirectory.child("0.msav")); } @Test @@ -206,9 +206,9 @@ public class ApplicationTests{ world.loadMap(testMap); Map map = world.getMap(); - SaveIO.saveToSlot(0); + SaveIO.save(saveDirectory.child("0.msav")); resetWorld(); - SaveIO.loadFromSlot(0); + SaveIO.load(saveDirectory.child("0.msav")); assertEquals(world.width(), map.width); assertEquals(world.height(), map.height); 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 5298c27fde..7fdc9ef612 100644 --- a/tests/src/test/java/power/DirectConsumerTests.java +++ b/tests/src/test/java/power/DirectConsumerTests.java @@ -32,7 +32,7 @@ public class DirectConsumerTests extends PowerTestFixture{ void testUnitFactory(int siliconAmount, int leadAmount, float producedPower, float requestedPower, float expectedSatisfaction){ Tile consumerTile = createFakeTile(0, 0, new UnitFactory("fakefactory"){{ - type = UnitTypes.spirit; + unitType = UnitTypes.spirit; produceTime = 60; consumes.power(requestedPower); consumes.items(new ItemStack(Items.silicon, 30), new ItemStack(Items.lead, 30)); diff --git a/tests/src/test/java/power/PowerTestFixture.java b/tests/src/test/java/power/PowerTestFixture.java index e7b26c3447..75f4a56854 100644 --- a/tests/src/test/java/power/PowerTestFixture.java +++ b/tests/src/test/java/power/PowerTestFixture.java @@ -5,7 +5,7 @@ import io.anuke.arc.util.*; import io.anuke.mindustry.*; import io.anuke.mindustry.content.*; import io.anuke.mindustry.core.*; -import io.anuke.mindustry.game.*; +import io.anuke.mindustry.ctype.*; import io.anuke.mindustry.world.*; import io.anuke.mindustry.world.blocks.*; import io.anuke.mindustry.world.blocks.power.*; 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()); diff --git a/tools/src/io/anuke/mindustry/Generators.java b/tools/src/io/anuke/mindustry/Generators.java index 651657070d..718f994376 100644 --- a/tools/src/io/anuke/mindustry/Generators.java +++ b/tools/src/io/anuke/mindustry/Generators.java @@ -7,8 +7,9 @@ import io.anuke.arc.math.*; import io.anuke.arc.util.*; import io.anuke.arc.util.noise.*; import io.anuke.mindustry.ImagePacker.*; -import io.anuke.mindustry.game.*; +import io.anuke.mindustry.ctype.*; import io.anuke.mindustry.type.*; +import io.anuke.mindustry.ui.*; import io.anuke.mindustry.world.*; import io.anuke.mindustry.world.blocks.*;