diff --git a/.github/workflows/gradle.yml b/.github/workflows/gradle.yml new file mode 100644 index 0000000000..b23caac61e --- /dev/null +++ b/.github/workflows/gradle.yml @@ -0,0 +1,17 @@ +name: Java CI + +on: [push] + +jobs: + build: + + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v1 + - name: Set up JDK 1.8 + uses: actions/setup-java@v1 + with: + java-version: 1.8 + - name: Run unit tests with gradle + run: ./gradlew test diff --git a/.gitignore b/.gitignore index 37631899ea..c6c812b18e 100644 --- a/.gitignore +++ b/.gitignore @@ -19,6 +19,7 @@ logs/ /tools/build/ /tests/build/ /server/build/ +changelog saves/ core/assets/saves/ /core/assets/saves/ @@ -37,6 +38,7 @@ packr-out/ config/ changelog *.gif +/core/assets/saves/ version.properties diff --git a/.travis.yml b/.travis.yml index f0586c145c..58473d0aaf 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,28 +1,43 @@ jdk: - openjdk8 +dist: trusty +android: + components: + - android-29 + - build-tools-29.0.2 + script: +- git clone --depth=1 --branch=master https://github.com/Anuken/MindustryBuilds ../MindustryBuilds +- cd ../MindustryBuilds +- echo ${TRAVIS_BUILD_NUMBER} > version.txt +- git add . +- git commit -m "Updating to build ${TRAVIS_BUILD_NUMBER}" +- 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}; fi +- cd ../Mindustry - git clone --depth=1 --branch=master https://github.com/Anuken/Arc ../Arc - "./gradlew test" - "./gradlew desktop:dist -Pbuildversion=${TRAVIS_TAG:1}" - "./gradlew server:dist -Pbuildversion=${TRAVIS_TAG:1}" - deploy: - - provider: releases - skip_cleanup: true - draft: false - api_key: - secure: Cv5wFtWt62/A24EvSEQvMow7gKPbZ3oATEFPuSghhB2TQz1dA40Zee3Qvk4LFlpLrhYo4K0ZSczCZRGpR+hCd8+Dpww52bheYEvWuh3ZQfvu/fXtEx2j5PwP1qMpmIgSxETV/gkD7l9FImdh0VzktYiAvQfmi0bEocG9/D4QwjFpNat7iwBdcMiw1MvAygpdIWRsjiw0RKlB2mWarmoHhQ7Gu7qlU3j50uaEvcrtmU0pBUPggNQwQRv32i9NPvNFxrqqlUjDLIS8JFea99zCkp8BwYqbEvBIMzd+Qip1/stLJJA3+cDUClbsDtg8rAVetzpOrdLEEBmqShFe5MDl2yEHcsgpN9CFsyTaUfvB3P3rVjizvycMm42IsUkXQiarm5xTQ/TIA8Rd8AHiSKuweNCg1Fd5SFaRtKy8JVLXuxyfUccmyje6hhz2L4lS2Wfj3mAG7sqZUCXhWP79EKdGkiPOjKv4CwXEKmuH3BMVqPlNUZJr9Eg3sV1FG0h2l+MVOOnR635qdUbb49sYojYxVruMLX0BH1c4ZCu230m8CUoWA1Em1QNI75ya7+9Y5T6AsgWDVpBvdUo9fWNbdp+VQ0GskFQsJD5wtnxbcbHeFiERAgGBm7z6qt9u9LrQpBH+dsW52ADvYsu3L4nQEa+sdMHwTTwmGY+iUvsxu0DqxGg= - file: - - desktop/build/libs/Mindustry.jar - - server/build/libs/server-release.jar - on: - repo: Anuken/Mindustry - tags: true - - provider: script - script: bash update_wiki.sh - on: - repo: Anuken/Mindustry - tags: true +- provider: releases + skip_cleanup: true + draft: false + api_key: + secure: Cv5wFtWt62/A24EvSEQvMow7gKPbZ3oATEFPuSghhB2TQz1dA40Zee3Qvk4LFlpLrhYo4K0ZSczCZRGpR+hCd8+Dpww52bheYEvWuh3ZQfvu/fXtEx2j5PwP1qMpmIgSxETV/gkD7l9FImdh0VzktYiAvQfmi0bEocG9/D4QwjFpNat7iwBdcMiw1MvAygpdIWRsjiw0RKlB2mWarmoHhQ7Gu7qlU3j50uaEvcrtmU0pBUPggNQwQRv32i9NPvNFxrqqlUjDLIS8JFea99zCkp8BwYqbEvBIMzd+Qip1/stLJJA3+cDUClbsDtg8rAVetzpOrdLEEBmqShFe5MDl2yEHcsgpN9CFsyTaUfvB3P3rVjizvycMm42IsUkXQiarm5xTQ/TIA8Rd8AHiSKuweNCg1Fd5SFaRtKy8JVLXuxyfUccmyje6hhz2L4lS2Wfj3mAG7sqZUCXhWP79EKdGkiPOjKv4CwXEKmuH3BMVqPlNUZJr9Eg3sV1FG0h2l+MVOOnR635qdUbb49sYojYxVruMLX0BH1c4ZCu230m8CUoWA1Em1QNI75ya7+9Y5T6AsgWDVpBvdUo9fWNbdp+VQ0GskFQsJD5wtnxbcbHeFiERAgGBm7z6qt9u9LrQpBH+dsW52ADvYsu3L4nQEa+sdMHwTTwmGY+iUvsxu0DqxGg= + file: + - desktop/build/libs/Mindustry.jar + - server/build/libs/server-release.jar + on: + repo: Anuken/Mindustry + tags: true +- provider: script + script: bash update_wiki.sh + on: + repo: Anuken/Mindustry + tags: true env: global: - secure: TqlUl/ojjkCMVOGbCTKz7Cnr4F08UyWzY/CiJ0vvUOGJGZ1qm7XavAlDf5XT0egU4mvr37THubFO8vojbqmrmy0oZnYh3njKFA8axgyZ8PyKkjGHOfd0i6qyEWsOr9H90/2X8r3LwEeLaDFyHpu3wljIGBjweg53g2qwmDwCFa9UR80FJZ+xDB+rD6B3cXT0DTEkCoLZXLqXm0Y3HvBdSuBL1LR/FNb2BSxNq+tNLGiz1kdQZV5erausbbZypBoGxzz63xAnyz2kkFz73A8xQYVTzGbFodTPz7HM13GVZ5s43I03Y+HYyHBgBaSLziO2hi2kzVJccOwzBp7wS4fs1MqsFY5+IeWJ9k+hm89NiYT7+6zlEgoUMlIniny1qLqWTzx7btUeuC/y/h5TVBNgaV+z0jmHycHfeSyq5I+vmX4J8qe3wmaN8TcdqYKU5nIznOTk3CM5Fzu0Bs9vkCkOxmormmcjMFW1RbdOLc/hpZWZggsBA88sNEAI8eq+r5QEeqzeCx8YKoZDjdrsqvgLMc3El3gS9oMGxkn0Y/TEcqs9Tc4BXtTkqIA68hD0DYzlAxYjVbbkAI9Hh9lHNvV3Dr/oCkGXQ/HflM143kj1L3tSBZpqeqQE2XhngB5nqpS3OZTmZbMTQ8qD2luU18yaTGMLF5tJS/fdKPRx0gQ1kL8= + - secure: TqlUl/ojjkCMVOGbCTKz7Cnr4F08UyWzY/CiJ0vvUOGJGZ1qm7XavAlDf5XT0egU4mvr37THubFO8vojbqmrmy0oZnYh3njKFA8axgyZ8PyKkjGHOfd0i6qyEWsOr9H90/2X8r3LwEeLaDFyHpu3wljIGBjweg53g2qwmDwCFa9UR80FJZ+xDB+rD6B3cXT0DTEkCoLZXLqXm0Y3HvBdSuBL1LR/FNb2BSxNq+tNLGiz1kdQZV5erausbbZypBoGxzz63xAnyz2kkFz73A8xQYVTzGbFodTPz7HM13GVZ5s43I03Y+HYyHBgBaSLziO2hi2kzVJccOwzBp7wS4fs1MqsFY5+IeWJ9k+hm89NiYT7+6zlEgoUMlIniny1qLqWTzx7btUeuC/y/h5TVBNgaV+z0jmHycHfeSyq5I+vmX4J8qe3wmaN8TcdqYKU5nIznOTk3CM5Fzu0Bs9vkCkOxmormmcjMFW1RbdOLc/hpZWZggsBA88sNEAI8eq+r5QEeqzeCx8YKoZDjdrsqvgLMc3El3gS9oMGxkn0Y/TEcqs9Tc4BXtTkqIA68hD0DYzlAxYjVbbkAI9Hh9lHNvV3Dr/oCkGXQ/HflM143kj1L3tSBZpqeqQE2XhngB5nqpS3OZTmZbMTQ8qD2luU18yaTGMLF5tJS/fdKPRx0gQ1kL8= + - secure: VEskj/0TVX2o7iUVXuVPysj/VSWmPhDl57SrT7/nBNN/P/8N5jFAvx8PMzG7qT0S5FzKxuV20psE4WylUGRKdeRtK7/QNBV7T3YqYYM6BUB1VeRpxe5hLxTeuBK3izglFO8DkdDqjUtzQSjzkoYT75ilROjhBrBUPhVek7UlbBHbaklPWYFXHnJmYS1FpZTdzqIj+Y0Gd1PSL2MzK4X74aAHl0qaDgsTwYwtKs7IAz+kFaTZBRpi9VjQHAFhDlkDR3jo9wQjH8/F6x0lCgV/FulSc37Okdb40sLFG98xcEA6gWh1NPMkz8CulUdVE7mj7SJNxLbNvoMNrWOVRjmEsn59p/9LiNC1F9ncFz9vjQjAmi7rMFFGHGxe5nn8cIAkpTvHQQkZoWHAA9SNJTDMMf09m2pRy/vvzx+a6NVxyC9iNrhLlnBg4gxAqRh0S6NU0uL+fuygKixn7rqlnb7KMT7bAbfcuV+dng6c8V7hYKDCh7sJbH8iJump1xkwoM7ecnU8fxJF/oKOr/fbk0Bfxu+Q9qYLrV1+DEdm93Vl2Thq+DBKmI66jRGSva6HeCLFo81PEiEjP1nLv75+kvVfOqVqJrZD1BrvoG2eWT/3hVLrN2kEIWWlpvQVC7FL11yWmYtAuOBh/vfhI76zKr+YTS6ccG9rqW4XeYjJytshe8M= diff --git a/README.md b/README.md index b0ec7c49e3..a2d2dda8fc 100644 --- a/README.md +++ b/README.md @@ -40,6 +40,14 @@ After building, the output .JAR file should be in `/desktop/build/libs/Mindustry ### Downloads - +[Get it on Itch.io](https://anuke.itch.io/mindustry) - +[Get it on Google Play](https://play.google.com/store/apps/details?id=io.anuke.mindustry) + +[Get it on F-Droid](https://f-droid.org/packages/io.anuke.mindustry/) diff --git a/android/build.gradle b/android/build.gradle index 5dba2016c9..75e513de2f 100644 --- a/android/build.gradle +++ b/android/build.gradle @@ -50,8 +50,8 @@ task deploy(type: Copy){ } android{ - buildToolsVersion '28.0.3' - compileSdkVersion 28 + buildToolsVersion '29.0.2' + compileSdkVersion 29 sourceSets{ main{ manifest.srcFile 'AndroidManifest.xml' @@ -70,27 +70,15 @@ android{ } defaultConfig{ - def vfile = file('../core/assets/version.properties') - - def code = 0 - def versionNameResult = "unknown" - - if(vfile.exists()){ - def props = new Properties() - props.load(new FileInputStream(vfile)) - - code = (props['androidBuildCode'] == null ? 0 : props['androidBuildCode']).toInteger() + 1 - - props['androidBuildCode'] = code.toString() - props.store(vfile.newWriter(), "Autogenerated file. Do not modify.") - versionNameResult = "$versionNumber-$versionType-${props['build'].replace(" ", "-")}" - } + Integer vcode = new Properties().with{p -> p.load(new FileInputStream(file('../core/assets/version.properties'))); return p }['androidBuildCode']?.toInteger() ?: 1 + def versionNameResult = "$versionNumber-$versionType-${getBuildVersion().replace(" ", "-")}" applicationId "io.anuke.mindustry" minSdkVersion 14 - targetSdkVersion 28 - versionCode code + targetSdkVersion 29 + versionName versionNameResult + versionCode vcode } compileOptions{ diff --git a/android/src/io/anuke/mindustry/AndroidLauncher.java b/android/src/io/anuke/mindustry/AndroidLauncher.java index 4792bd6d89..8bfba00495 100644 --- a/android/src/io/anuke/mindustry/AndroidLauncher.java +++ b/android/src/io/anuke/mindustry/AndroidLauncher.java @@ -131,7 +131,7 @@ public class AndroidLauncher extends AndroidApplication{ config.hideStatusBar = true; Net.setClientProvider(new ArcNetClient()); Net.setServerProvider(new ArcNetServer()); - initialize(new Mindustry(), config); + initialize(new ClientLauncher(), config); 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 6fed3137de..53642c7597 100644 --- a/annotations/src/main/java/io/anuke/annotations/AssetsAnnotationProcessor.java +++ b/annotations/src/main/java/io/anuke/annotations/AssetsAnnotationProcessor.java @@ -60,9 +60,12 @@ public class AssetsAnnotationProcessor extends AbstractProcessor{ void process(String classname, String path, String rtype, String loadMethod) throws Exception{ TypeSpec.Builder type = TypeSpec.classBuilder(classname).addModifiers(Modifier.PUBLIC); - MethodSpec.Builder load = MethodSpec.methodBuilder("load").addModifiers(Modifier.PUBLIC, Modifier.STATIC); + //MethodSpec.Builder load = MethodSpec.methodBuilder("load").addModifiers(Modifier.PUBLIC, Modifier.STATIC); MethodSpec.Builder dispose = MethodSpec.methodBuilder("dispose").addModifiers(Modifier.PUBLIC, Modifier.STATIC); + MethodSpec.Builder loadBegin = MethodSpec.methodBuilder("load").addModifiers(Modifier.PUBLIC, Modifier.STATIC); + + HashSet names = new HashSet<>(); Files.list(Paths.get(path)).forEach(p -> { String fname = p.getFileName().toString(); @@ -79,8 +82,16 @@ public class AssetsAnnotationProcessor extends AbstractProcessor{ name = name + "s"; } - load.addStatement(name + " = io.anuke.arc.Core.audio."+loadMethod+"(io.anuke.arc.Core.files.internal(io.anuke.arc.Core.app.getType() != io.anuke.arc.Application.ApplicationType.iOS ? $S : $S))", - path.substring(path.lastIndexOf("/") + 1) + "/" + fname, (path.substring(path.lastIndexOf("/") + 1) + "/" + fname).replace(".ogg", ".mp3")); + String filepath = path.substring(path.lastIndexOf("/") + 1) + "/" + fname; + + //load.addStatement(name + " = io.anuke.arc.Core.audio."+loadMethod+"(io.anuke.arc.Core.files.internal(io.anuke.arc.Core.app.getType() != io.anuke.arc.Application.ApplicationType.iOS ? $S : $S))", + //filepath, filepath.replace(".ogg", ".mp3")); + + loadBegin.addStatement("io.anuke.arc.Core.assets.load(io.anuke.arc.Core.app.getType() != io.anuke.arc.Application.ApplicationType.iOS ? $S : $S, "+rtype+".class, " + + "new io.anuke.arc.assets.loaders."+classname.substring(0, classname.length()-1)+"Loader."+classname.substring(0, classname.length()-1)+"Parameter((m, name, type) -> " + name + " = m.get(\"" + filepath + "\")))", + filepath, filepath.replace(".ogg", ".mp3")); + + dispose.addStatement(name + ".dispose()"); dispose.addStatement(name + " = null"); type.addField(FieldSpec.builder(ClassName.bestGuess(rtype), name, Modifier.STATIC, Modifier.PUBLIC).initializer("new io.anuke.arc.audio.mock.Mock" + rtype.substring(rtype.lastIndexOf(".") + 1)+ "()").build()); @@ -91,7 +102,8 @@ public class AssetsAnnotationProcessor extends AbstractProcessor{ type.addField(FieldSpec.builder(ClassName.bestGuess(rtype), "none", Modifier.STATIC, Modifier.PUBLIC).initializer("new io.anuke.arc.audio.mock.Mock" + rtype.substring(rtype.lastIndexOf(".") + 1)+ "()").build()); } - type.addMethod(load.build()); + //type.addMethod(load.build()); + type.addMethod(loadBegin.build()); type.addMethod(dispose.build()); JavaFile.builder(packageName, type.build()).build().writeTo(Utils.filer); } diff --git a/build.gradle b/build.gradle index 11c75a5436..57f06993b1 100644 --- a/build.gradle +++ b/build.gradle @@ -16,6 +16,8 @@ buildscript{ allprojects{ version = 'release' + apply plugin: 'maven' + group = 'com.github.Anuken' ext{ versionNumber = '4' @@ -120,6 +122,7 @@ allprojects{ props.load(new FileInputStream(pfile)) String buildid = getBuildVersion() + println("Compiling with build: '$buildid'") props["type"] = versionType props["number"] = versionNumber @@ -203,6 +206,7 @@ project(":core"){ task preGen{ generateLocales() + writeVersion() } dependencies{ @@ -233,6 +237,7 @@ project(":core"){ compileJava.dependsOn(preGen) + compile "org.lz4:lz4-java:1.4.1" compile arcModule("arc-core") compile arcModule("extensions:freetype") compile arcModule("extensions:arcnet") @@ -298,7 +303,6 @@ project(":net"){ dependencies{ compile project(":core") - compile "org.lz4:lz4-java:1.4.1" } } diff --git a/core/assets-raw/sprites/blocks/units/command-center.png b/core/assets-raw/sprites/blocks/units/command-center.png new file mode 100644 index 0000000000..767c8b8da2 Binary files /dev/null and b/core/assets-raw/sprites/blocks/units/command-center.png differ diff --git a/core/assets-raw/sprites/ui/icons/icon-command-attack.png b/core/assets-raw/sprites/ui/icons/icon-command-attack.png new file mode 100644 index 0000000000..655f819338 Binary files /dev/null and b/core/assets-raw/sprites/ui/icons/icon-command-attack.png differ diff --git a/core/assets-raw/sprites/ui/icons/icon-command-idle.png b/core/assets-raw/sprites/ui/icons/icon-command-idle.png new file mode 100644 index 0000000000..4271a5a321 Binary files /dev/null and b/core/assets-raw/sprites/ui/icons/icon-command-idle.png differ diff --git a/core/assets-raw/sprites/ui/icons/icon-command-patrol.png b/core/assets-raw/sprites/ui/icons/icon-command-patrol.png new file mode 100644 index 0000000000..acf89f181a Binary files /dev/null and b/core/assets-raw/sprites/ui/icons/icon-command-patrol.png differ diff --git a/core/assets-raw/sprites/ui/icons/icon-command-retreat.png b/core/assets-raw/sprites/ui/icons/icon-command-retreat.png new file mode 100644 index 0000000000..f40dcfe5cf Binary files /dev/null and b/core/assets-raw/sprites/ui/icons/icon-command-retreat.png differ diff --git a/core/assets-raw/sprites/units/fortress-leg.png b/core/assets-raw/sprites/units/fortress-leg.png index 258cdbf0c1..5fe3fe7b28 100644 Binary files a/core/assets-raw/sprites/units/fortress-leg.png and b/core/assets-raw/sprites/units/fortress-leg.png differ diff --git a/core/assets/zones/craters.png b/core/assets-raw/sprites/zones/craters.png similarity index 100% rename from core/assets/zones/craters.png rename to core/assets-raw/sprites/zones/craters.png diff --git a/core/assets/zones/desertWastes.png b/core/assets-raw/sprites/zones/desertWastes.png similarity index 100% rename from core/assets/zones/desertWastes.png rename to core/assets-raw/sprites/zones/desertWastes.png diff --git a/core/assets/zones/desolateRift.png b/core/assets-raw/sprites/zones/desolateRift.png similarity index 100% rename from core/assets/zones/desolateRift.png rename to core/assets-raw/sprites/zones/desolateRift.png diff --git a/core/assets/zones/frozenForest.png b/core/assets-raw/sprites/zones/frozenForest.png similarity index 100% rename from core/assets/zones/frozenForest.png rename to core/assets-raw/sprites/zones/frozenForest.png diff --git a/core/assets/zones/fungalPass.png b/core/assets-raw/sprites/zones/fungalPass.png similarity index 100% rename from core/assets/zones/fungalPass.png rename to core/assets-raw/sprites/zones/fungalPass.png diff --git a/core/assets/zones/groundZero.png b/core/assets-raw/sprites/zones/groundZero.png similarity index 100% rename from core/assets/zones/groundZero.png rename to core/assets-raw/sprites/zones/groundZero.png diff --git a/core/assets/zones/nuclearComplex.png b/core/assets-raw/sprites/zones/nuclearComplex.png similarity index 100% rename from core/assets/zones/nuclearComplex.png rename to core/assets-raw/sprites/zones/nuclearComplex.png diff --git a/core/assets/zones/overgrowth.png b/core/assets-raw/sprites/zones/overgrowth.png similarity index 100% rename from core/assets/zones/overgrowth.png rename to core/assets-raw/sprites/zones/overgrowth.png diff --git a/core/assets-raw/sprites/zones/pack.json b/core/assets-raw/sprites/zones/pack.json new file mode 100644 index 0000000000..2612f17acc --- /dev/null +++ b/core/assets-raw/sprites/zones/pack.json @@ -0,0 +1,8 @@ +{ + duplicatePadding: true, + combineSubdirectories: true, + flattenPaths: true, + maxWidth: 2048, + maxHeight: 2048, + fast: true +} diff --git a/core/assets/zones/ruinousShores.png b/core/assets-raw/sprites/zones/ruinousShores.png similarity index 100% rename from core/assets/zones/ruinousShores.png rename to core/assets-raw/sprites/zones/ruinousShores.png diff --git a/core/assets/zones/saltFlats.png b/core/assets-raw/sprites/zones/saltFlats.png similarity index 100% rename from core/assets/zones/saltFlats.png rename to core/assets-raw/sprites/zones/saltFlats.png diff --git a/core/assets/zones/stainedMountains.png b/core/assets-raw/sprites/zones/stainedMountains.png similarity index 100% rename from core/assets/zones/stainedMountains.png rename to core/assets-raw/sprites/zones/stainedMountains.png diff --git a/core/assets/zones/tarFields.png b/core/assets-raw/sprites/zones/tarFields.png similarity index 100% rename from core/assets/zones/tarFields.png rename to core/assets-raw/sprites/zones/tarFields.png diff --git a/core/assets/bundles/bundle.properties b/core/assets/bundles/bundle.properties index 2fd454ee3a..c54af0648a 100644 --- a/core/assets/bundles/bundle.properties +++ b/core/assets/bundles/bundle.properties @@ -17,6 +17,12 @@ gameover = Game Over gameover.pvp = The[accent] {0}[] team is victorious! highscore = [accent]New highscore! +load.sound = Sounds +load.map = Maps +load.image = Images +load.content = Content +load.system = System + stat.wave = Waves Defeated:[accent] {0} stat.enemiesDestroyed = Enemies Destroyed:[accent] {0} stat.built = Buildings Built:[accent] {0} @@ -25,9 +31,6 @@ stat.deconstructed = Buildings Deconstructed:[accent] {0} stat.delivered = Resources Launched: stat.rank = Final Rank: [accent]{0} -placeline = You have selected a block.\nYou can[accent] place in a line[] by[accent] holding down your finger for a few seconds[] and dragging in a direction.\n\n[scarlet]DO IT. -removearea = You have selected removal mode.\nYou can[accent] remove blocks in a rectangle[] by[accent] holding down your finger for a few seconds[] and dragging.\n\n[scarlet]DO IT. - launcheditems = [accent]Launched Items map.delete = Are you sure you want to delete the map "[accent]{0}[]"? level.highscore = High Score: [accent]{0} @@ -66,9 +69,11 @@ players.single = {0} player online server.closing = [accent]Closing server... server.kicked.kick = You have been kicked from the server! server.kicked.serverClose = Server closed. +server.kicked.vote = You have been vote-kicked. Goodbye. server.kicked.clientOutdated = Outdated client! Update your game! server.kicked.serverOutdated = Outdated server! Ask the host to update! server.kicked.banned = You are banned on this server. +server.kicked.typeMismatch = This server is not compatible with your build type. server.kicked.recentKick = You have been kicked recently.\nWait before connecting again. server.kicked.nameInUse = There is someone with that name\nalready on this server. server.kicked.nameEmpty = Your chosen name is invalid. @@ -160,6 +165,11 @@ cancel = Cancel openlink = Open Link copylink = Copy Link back = Back +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. 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? @@ -388,6 +398,7 @@ zone.impact0078.description = zone.crags.description = settings.language = Language +settings.data = Game Data settings.reset = Reset to Defaults settings.rebind = Rebind settings.controls = Controls @@ -522,6 +533,7 @@ setting.mutemusic.name = Mute Music setting.sfxvol.name = SFX Volume setting.mutesound.name = Mute Sound setting.crashreport.name = Send Anonymous Crash Reports +setting.savecreate.name = Auto-Create Saves setting.chatopacity.name = Chat Opacity setting.playerchat.name = Display In-Game Chat uiscale.reset = UI scale has been changed.\nPress "OK" to confirm this scale.\n[scarlet]Reverting and exiting in[accent] {0}[] seconds... @@ -542,6 +554,7 @@ 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.pick.name = Pick Block @@ -808,6 +821,7 @@ block.blast-mixer.name = Blast Mixer block.solar-panel.name = Solar Panel block.solar-panel-large.name = Large Solar Panel block.oil-extractor.name = Oil Extractor +block.command-center.name = Command Center block.draug-factory.name = Draug Miner Drone Factory block.spirit-factory.name = Spirit Repair Drone Factory block.phantom-factory.name = Phantom Builder Drone Factory @@ -1032,6 +1046,7 @@ block.ripple.description = An extremely powerful artillery turret. Shoots cluste 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. diff --git a/core/assets/bundles/bundle_cs.properties b/core/assets/bundles/bundle_cs.properties index 3ddb50d654..dfee68c878 100644 --- a/core/assets/bundles/bundle_cs.properties +++ b/core/assets/bundles/bundle_cs.properties @@ -43,6 +43,7 @@ newgame = New Game none = minimap = Minimap close = Zavřít +website = Website quit = Ukončit maps = Mapy continue = Pokračovat @@ -71,6 +72,7 @@ server.kicked.nameEmpty = Tvé jméno je neplatné. server.kicked.idInUse = Již jsi na tomhle serveru připojen! Připojování se dvěma účty není povoleno. server.kicked.customClient = Tento server nepodporuje vlastní verze hry. Stáhni si oficiální verzi. server.kicked.gameover = Game over! +server.versions = Your version:[accent] {0}[]\nServer version:[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 @@ -154,7 +156,10 @@ cancel = Zrušit openlink = Otevřít Odkaz copylink = Zkopírovat Odkaz back = Zpět +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 = Jsi si jistý že chceš ukončit ? +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]Načítám... saving = [accent]Ukládám... wave = [accent]Vlna {0} @@ -263,6 +268,7 @@ 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 @@ -302,6 +308,7 @@ 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 editor = Editor mapeditor = Editor map donate = Darovat @@ -315,8 +322,9 @@ bestwave = [LIGHT_GRAY]Best: {0} launch = Launch launch.title = Launch Successful launch.next = [LIGHT_GRAY]next opportunity at wave {0} -launch.unable = [scarlet]Unable to LAUNCH.[] Enemies. +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. @@ -352,6 +360,7 @@ 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. @@ -363,6 +372,7 @@ zone.overgrowth.description = This area is overgrown, closer to the source of th zone.tarFields.description = The outskirts of an oil production zone, between the mountains and desert. One of the few areas with usable tar reserves.\nAlthough abandoned, this area has some dangerous enemy forces nearby. Do not underestimate them.\n\n[lightgray]Research oil processing technology if possible. zone.desolateRift.description = An extremely dangerous zone. Plentiful resources, but little space. High risk of destruction. Leave as soon as possible. Do not be fooled by the long spacing between enemy attacks. zone.nuclearComplex.description = A former facility for the production and processing of thorium, reduced to ruins.\n[lightgray]Research the thorium and its many uses.\n\nThe enemy is present here in great numbers, constantly scouting for attackers. +zone.fungalPass.description = A transition area between high mountains and lower, spore-ridden lands. A small enemy reconnaissance base is located here.\nDestroy it.\nUse Dagger and Crawler units. Take out the two cores. zone.impact0078.description = zone.crags.description = settings.language = Jazyk @@ -417,6 +427,7 @@ 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} @@ -491,6 +502,7 @@ setting.lasers.name = Ukázat laser energie setting.pixelate.name = Pixelate [LIGHT_GRAY](may decrease performance) setting.minimap.name = Ukázat minimapu setting.musicvol.name = Hlasitost hudby +setting.ambientvol.name = Ambient Volume setting.mutemusic.name = Ztišit hudbu setting.sfxvol.name = SFX hlasitost setting.mutesound.name = Ztišit zvuky @@ -819,9 +831,10 @@ block.container.name = Kontejnér block.launch-pad.name = Launch Pad block.launch-pad-large.name = Large Launch Pad team.blue.name = modrá -team.red.name = červená +team.crux.name = red +team.sharded.name = orange team.orange.name = oranžová -team.none.name = šedá +team.derelict.name = derelict team.green.name = zelená team.purple.name = fialová unit.spirit.name = Spirit Dron @@ -839,27 +852,26 @@ unit.chaos-array.name = Chaos Array unit.eradicator.name = Eradicator unit.lich.name = Lich unit.reaper.name = Reaper -tutorial.begin = Tvá mise tady je vyhladit [LIGHT_GRAY] nepřítele[].\n\nZačneš tím že[accent] budeš těžit měd[]. Klikni na měděnou rudu poblíž tvého jádra pro těžbu. +tutorial.next = [lightgray] +tutorial.intro = You have entered the[scarlet] Mindustry Tutorial.[]\nBegin by[accent] mining copper[]. Tap a copper ore vein near your core to do this.\n\n[accent]{0}/{1} copper tutorial.drill = Manuální zěž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.[] tutorial.conveyor = [accent]Dopravníky[] jsou zapotřebí k dopravě materiálu k jádru.\nVytvoř řadu dopravníku od vrtu až k jádru. -tutorial.morecopper = Je za potřebí více mědi.\n\nBuď ho můžeš natěžit manuáně nebo polož více vrtů. +tutorial.conveyor.mobile = [accent]Conveyors[] are used to transport items to the core.\nMake a line of conveyors from the drill to the core.\n[accent] Place in a line by holding down your finger for a few seconds[] and dragging in a direction.\n\n[accent]{0}/{1} conveyors placed in line\n[accent]0/1 items delivered tutorial.turret = Defenzivní stavby musí být postaveny za účelem obrany vůči[LIGHT_GRAY] nepříteli[].\nPostav střílnu Duo blízko svého jádra. tutorial.drillturret = Duo střílny požadují[accent] měd jako střelivo []ke střelbě.\nPolož vrt blízko střílny pro zásobování mědí. +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 = [LIGHT_GRAY] nepřítel[] je přibližuje.\n\nBraň své jádro po dobu dvou vln, postav více střílen. -tutorial.lead = Více rud je zde dostupných. Najdi a těž[accent] Olovo[].\n\nPřetáhni od tvojí jednotky k jádru pro přesun materiálu. -tutorial.smelter = Měd a olovo jsou slabé materiály.\nLepší[accent] hustá slitina[] může být vytvořena v peci.\n\npostav si jednu pec. -tutorial.densealloy = Pec teď bude produkovat slitinu.\nVyráběj si ji.\nZvyš počet produkce pokud je nutno. -tutorial.siliconsmelter = Jádro teď vytvoří[accent] spirit drona[] pro těžení a opravu bloků.\n\nTovárny pro ostatní jednotky mohou být vytvořeny za pomocí [accent] Křemíku.\nPostav Křemíkovou pec. -tutorial.silicondrill = Křemík vyžaduje[accent] uhlí[] a[accent] písek[].\nZačni tím že položíš pár vrtů. -tutorial.generator = Tato technologie vyžaduje energii k provozu.\nVytvoř[accent] spalovací generátor[]k produkci energie. -tutorial.generatordrill = Spalovací generátory vyžadujou palivo.\nZásobuj ho uhlím z vrtu. -tutorial.node = Energie vyžaduje přenos.\nVytvoř[accent] energetický uzel[] vedle svého generátoru pro přenos energie. -tutorial.nodelink = Energie může být přenášena zkrz kontakt s energetickými bloky a generátory, nebo propojením zkrze energetické uzly.\n\nPropoj energii kliknutím na uzel a následným výběrem generátoru a křemíkovou pecí. -tutorial.silicon = Křemík se teď produkuje. Vyráběj si.\n\nJe doporučeno zvýšit produkci. -tutorial.daggerfactory = Postav[accent] Továrnu na Dagger mechy.[]\n\nToto bude využito pro konstrukci útočné síly. -tutorial.router = Továrny potřebujou k provozu materiál.\nPolož na dopravník směrovač pro oddělení části nákladu k továrně. -tutorial.dagger = Propoj energetické uzly s továrnou.\nJakmile jsou požadavky splněny, Mechy se začnou stavět.\n\nPokládej vrty, generátory a dopravníky dle libosti. -tutorial.battle = [LIGHT_GRAY] Nepřítel[] prozradil lokaci svého jádra.\nZnič ho svými bojovými jednotkami. +tutorial.waves.mobile = The[lightgray] enemy[] approaches.\n\nDefend the core for 2 waves. Your ship will automatically fire at enemies.\nBuild more turrets and drills. Mine more copper. +tutorial.launch = Once you reach a specific wave, you are able to[accent] launch the core[], leaving your defenses behind and[accent] obtaining all the resources in your core.[]\nThese resources can then be used to research new technology.\n\n[accent]Press the launch button. item.copper.description = Užitečný strukturální materiál. Používá se rozsáhle v ostatních typech bloků. item.lead.description = Základní počáteční materiál. Požívá se rozsáhle v elektronice a v blocích pro transport tekutin. item.metaglass.description = A super-tough glass compound. Extensively used for liquid distribution and storage. @@ -896,13 +908,9 @@ unit.crawler.description = A ground unit consisting of a stripped-down frame wit unit.titan.description = Pokročilá, obrněná pozemní jednotka. Útočí jak na pozemní tak vzdušné nepřátelské jednotky. unit.fortress.description = Težká, pozemní artilérní jednotka. 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.chaos-array.description = -unit.eradicator.description = unit.wraith.description = Rychlý, udeř a uteč stíhací letoun. unit.ghoul.description = Těžký, kobercový bombardér. unit.revenant.description = A heavy, hovering missile array. -unit.lich.description = -unit.reaper.description = block.graphite-press.description = Compresses chunks of coal into pure sheets of graphite. block.multi-press.description = An upgraded version of the graphite press. Employs water and power to process coal quickly and efficiently. block.silicon-smelter.description = Redukuje písek s vysoce čistým koksem za účelem výroby křemíku. diff --git a/core/assets/bundles/bundle_de.properties b/core/assets/bundles/bundle_de.properties index 6c937b3e0c..24f7350117 100644 --- a/core/assets/bundles/bundle_de.properties +++ b/core/assets/bundles/bundle_de.properties @@ -1,10 +1,10 @@ -credits.text = Created by [ROYAL]Anuken[] - [SKY]anukendev@gmail.com[]\n\n[GRAY](In case you can't tell, this text is currently unfinished.\nTranslators, don't edit it yet!) +credits.text = Entwickelt von [ROYAL]Anuken[] - [SKY]anukendev@gmail.com[]\n\n[GRAY] credits = Danksagungen contributors = Übersetzer und Mitwirkende discord = Trete dem Mindustry Discord bei! link.discord.description = Der offizielle Mindustry Discord Chatroom link.github.description = Quellcode des Spiels -link.changelog.description = Liste von Änderungen +link.changelog.description = Liste der Änderungen link.dev-builds.description = Entwicklungs-Builds (instabil) link.trello.description = Offizielles Trello Board für geplante Features link.itch.io.description = itch.io Seite mit Downloads und der Web-Version des Spiels @@ -21,11 +21,11 @@ stat.enemiesDestroyed = Gegner Zerstört:[accent] {0} stat.built = Gebäude Gebaut:[accent] {0} stat.destroyed = Gebäude Zerstört:[accent] {0} stat.deconstructed = Gebäude Abgebaut:[accent] {0} -stat.delivered = Resources Launched: +stat.delivered = Übertragene Ressourcen: stat.rank = Finaler Rang: [accent]{0} -placeline = Du hast einen Block ausgewählt.\nDu kannst[accent] davon eine Reihe bauen,[] indem du[accent] wenige Sekunden mit einem Finger drückst[] und ihn in eine Richtung ziehst.\nVersuch es. -removearea = Du hast den Zerstörungs Modus ausgewählt.\nDu kannst[accent] Blöcke im Rechteck zerstören,[] indem du[accent] wenige Sekunden mit einem Finger drückst[] und ihn ziehst.\nTry it. -launcheditems = [accent]Launched Items +placeline = Du hast einen Block ausgewählt.\nDu kannst[accent] davon eine Reihe bauen,[] indem du[accent] wenige Sekunden mit einem Finger drückst[] und ihn in eine Richtung ziehst.\nVersuche es. +removearea = Du hast den Zerstörungsmodus ausgewählt.\nDu kannst[accent] Blöcke im Rechteck zerstören,[] indem du[accent] wenige Sekunden mit einem Finger drückst[] und ihn ziehst.\nVersuche es. +launcheditems = [accent]Übertragene Items map.delete = Bist du sicher, dass du die Karte "[accent]{0}[]" löschen möchtest? level.highscore = Highscore: [accent]{0} level.select = Level Auswahl @@ -43,6 +43,7 @@ newgame = Neues Spiel none = minimap = Minimap close = Schließen +website = Website quit = Verlassen maps = Karten continue = Weiter @@ -51,11 +52,11 @@ about.button = Info name = Name: noname = Wähle zuerst einen[accent] Spielernamen[]. filename = Dateiname: -unlocked = Neuen Block freigeschaltet! +unlocked = Neuer Block freigeschaltet! completed = [accent]Abgeschlossen -techtree = Tech Tree +techtree = Forschung research.list = [LIGHT_GRAY]Forschung: -research = Forschung +research = Erforschen researched = [LIGHT_GRAY]{0} erforscht. players = {0} Spieler online players.single = {0} Spieler online @@ -70,7 +71,8 @@ server.kicked.nameInUse = Es ist bereits ein Spieler \nmit diesem Namen auf dem server.kicked.nameEmpty = Dein Name muss mindestens einen Buchstaben oder eine Zahl enthalten. server.kicked.idInUse = Du bist bereits auf dem Server! Anmeldungen mit zwei Accounts sind nicht gestattet. server.kicked.customClient = Der Server akzeptiert keine Custom Builds von Mindustry. Lade dir die offizielle Version herunter. -server.kicked.gameover = Game over! +server.kicked.gameover = Game Over! +server.versions = Your version:[accent] {0}[]\nServer version:[accent] {1}[] host.info = Der [accent]host[] Knopf startet einen Server auf den Ports [scarlet]6567[] und [scarlet]6568.[]\nJeder im gleichen [LIGHT_GRAY]W-Lan oder lokalem Netzwerk[] sollte deinen Server in seiner Server Liste sehen können.\n\nWenn du Leuten die Verbindung über IP ermöglichen willst, benötigst du [accent]Port-Forwarding[].\n\n[LIGHT_GRAY]Hinweis: Falls es Probleme mit der Verbindung im Netzwerk gibt, stell sicher, dass Mindustry in deinen Firewall Einstellungen Zugriff auf das lokale Netzwerk hat. join.info = Hier kannst du eine [accent]Server IP[] eingeben um dich zu verbinden oder Server im [accent]lokalem Netzwerk[] entdecken und dich mit ihnen verbinden.\nSowohl Spielen über das lokale Netzwerk als auch Spielen über das Internet werden unterstützt.\n\n[LIGHT_GRAY]Hinweis: Es gibt keine globale Server Liste; Wenn du dich mit jemand per IP verbinden willst musst du den Host nach seiner IP fragen. hostserver = Server hosten @@ -86,8 +88,8 @@ trace = Spieler verfolgen trace.playername = Spielername: [accent]{0} trace.ip = IP: [accent]{0} trace.id = Eindeutige ID: [accent]{0} -trace.mobile = Mobile Client: [accent]{0} -trace.modclient = Custom Client: [accent]{0} +trace.mobile = Mobiler Client: [accent]{0} +trace.modclient = Gemoddeter Client: [accent]{0} invalidid = Ungültige Client ID! Berichte den Bug. server.bans = Bans server.bans.none = Keine gebannten Spieler gefunden! @@ -99,7 +101,7 @@ server.edit = Server bearbeiten server.outdated = [crimson]Veralteter Server![] server.outdated.client = [crimson]Veralteter Client![] server.version = [lightgray]Version: {0} -server.custombuild = [yellow]Custom Build +server.custombuild = [yellow]Benutzerdefinierter Build confirmban = Bist du sicher, dass du diesen Spieler verbannen möchtest? confirmkick = Bist du sicher, dass du diesen Spieler kicken willst? confirmunban = Bist du sicher, dass du die Verbannung des Spielers rückgängig machen willst? @@ -154,8 +156,11 @@ cancel = Abbruch openlink = Link öffnen copylink = Kopiere Link back = Zurück +classic.export = Export Classic Data +classic.export.text = [accent]Mindustry[] has just had a major update.\nClassic (v3.5 build 40) save or map data has been detected. Would you like to export these saves to your phone's home folder, for use in the Mindustry Classic app? quit.confirm = Willst du wirklich aufhören? -loading = [accent]Wird geladen ... +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... saving = [accent]Speichere... wave = [accent]Welle {0} wave.waiting = Welle in {0} @@ -184,8 +189,8 @@ editor.author = Autor: editor.description = Beschreibung: editor.waves = Wellen: editor.rules = Regeln: -editor.generation = Generation: -editor.ingame = In-Game Bearbeiten +editor.generation = Generator: +editor.ingame = Im Spiel Bearbeiten editor.newmap = Neue Karte waves.title = Wellen waves.remove = Entfernen @@ -201,24 +206,24 @@ waves.copy = Aus der Zwischenablage kopieren waves.load = Aus der Zwischenablage laden waves.invalid = Ungültige Wellen in der Zwischenablage. waves.copied = Wellen kopiert. -waves.none = Keine Gegner definiert.\nInfo: Leere Wellen Entwürfe werden automatisch mit dem standard Entwurf ersetzt. -editor.default = [LIGHT_GRAY] +waves.none = Keine Gegner definiert.\nInfo: Leere Wellen Entwürfe werden automatisch mit dem Standard-Entwurf ersetzt. +editor.default = [LIGHT_GRAY] edit = Bearbeiten... editor.name = Name: -editor.spawn = Spawn Unit -editor.removeunit = Remove Unit +editor.spawn = Spawn Bereich +editor.removeunit = Entferne Bereich editor.teams = Teams -editor.errorload = Fehler beim laden der Datei:\n[accent]{0} -editor.errorsave = Fehler beim speichern der Datei:\n[accent]{0} +editor.errorload = Fehler beim Laden der Datei:\n[accent]{0} +editor.errorsave = Fehler beim Speichern der Datei:\n[accent]{0} editor.errorimage = Das ist ein Bild, keine Karte. Wechsel nicht den Dateityp und erwarte, dass es funktioniert.\n\nWenn du eine alte Karte importieren möchtest, benutze den 'Importiere Terrain Bild' Knopf in dem Editor. editor.errorlegacy = Diese Karte ist zu alt und benutzt ein veraltetes Karten Format, das nicht mehr unterstützt wird. editor.errorheader = Diese Karte ist entweder nicht gültig oder beschädigt. editor.errorname = Karte hat keinen Namen. -editor.update = Update +editor.update = Aktualisieren editor.randomize = Zufällig Anordnen editor.apply = Anwenden editor.generate = Generieren -editor.resize = Grösse\nanpassen +editor.resize = Größe\nanpassen editor.loadmap = Karte\nladen editor.savemap = Karte\nspeichern editor.saved = Gespeichert! @@ -227,7 +232,7 @@ editor.save.overwrite = Deine Karte überschreibt eine built-in Karte! Wähle ei editor.import.exists = [scarlet]Fehler beim Import:[] Ein built-in Karte namens '{0}' existiert bereits! editor.import = Import... editor.importmap = Importiere Karte -editor.importmap.description = Importiere von einer bestehende Karte +editor.importmap.description = Importiere von einer bestehenden Karte editor.importfile = Importiere Datei editor.importfile.description = Importiere aus einer Karten Datei editor.importimage = Importiere Terrain Bild @@ -240,7 +245,7 @@ editor.exportimage.description = Exportiere in eine Karten Bild Datei editor.loadimage = Bild\nladen editor.saveimage = Bild\nspeichern editor.unsaved = [crimson] Du hast Änderungen nicht gespeichert [] Möchtest du wirklich aufhören? -editor.resizemap = Grösse der Karte ändern +editor.resizemap = Größe der Karte ändern editor.mapname = Karten Name editor.overwrite = [accent] Warnung! Dies überschreibt eine vorhandene Karte. editor.overwrite.confirm = [scarlet]Warnung![] Eine Karte mit diesem Namen existiert bereits. Bist du sicher, dass du sie überschreiben willst? @@ -255,40 +260,41 @@ toolmode.square = Quadrat toolmode.square.description = Quadrat Pinsel. toolmode.eraseores = Erze löschen toolmode.eraseores.description = Löscht nur Erze. -toolmode.fillteams = Fill Teams -toolmode.fillteams.description = Fill teams instead of blocks. -toolmode.drawteams = Draw Teams -toolmode.drawteams.description = Draw teams instead of blocks. +toolmode.fillteams = Teams Ausfüllen +toolmode.fillteams.description = Füllt Teams aus anstatt Blöcke. +toolmode.drawteams = Teams Zeichnen +toolmode.drawteams.description = Zeichnet Teams anstatt Blöcke. filters.empty = [LIGHT_GRAY]Keine Filter! Füge einen mit dem unteren Knopf hinzu. -filter.distort = Distort -filter.noise = Noise -filter.median = Median -filter.blend = Blend +filter.distort = Verzerren +filter.noise = Rauschen +filter.median = Mittelwert +filter.oremedian = Ore Median +filter.blend = Mischen filter.defaultores = Standard Erze filter.ore = Erz -filter.rivernoise = River Noise -filter.mirror = Mirror +filter.rivernoise = Fluss Rauschen +filter.mirror = Spiegel filter.clear = Löschen -filter.option.ignore = Ignore -filter.scatter = Scatter +filter.option.ignore = Ignorieren +filter.scatter = Streuen filter.terrain = Terrain -filter.option.scale = Scale +filter.option.scale = Skalierung filter.option.chance = Wahrscheinlichkeit -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.mag = Größe +filter.option.threshold = Grenzwert +filter.option.circle-scale = Kreis Skalierung +filter.option.octaves = Oktaven +filter.option.falloff = Rückgang +filter.option.angle = Winkel filter.option.block = Block -filter.option.floor = Floor -filter.option.flooronto = Target Floor +filter.option.floor = Boden +filter.option.flooronto = Ziel Boden filter.option.wall = Wand filter.option.ore = Erz -filter.option.floor2 = Secondary Floor -filter.option.threshold2 = Secondary Threshold +filter.option.floor2 = Sekundärer Boden +filter.option.threshold2 = Sekundärer Grenzwert filter.option.radius = Radius -filter.option.percentile = Percentile +filter.option.percentile = Perzentil width = Breite: height = Höhe: menu = Menü @@ -299,36 +305,38 @@ save = Speichern fps = FPS: {0} tps = TPS: {0} ping = Ping: {0}ms -language.restart = Bitte Starte dein Spiel neu, damit die Sprach-Einstellung aktiv werden. +language.restart = Bitte Starte dein Spiel neu, damit die Sprach-Einstellung aktiv wird. settings = Einstellungen tutorial = Tutorial +tutorial.retake = Re-Take Tutorial editor = Editor mapeditor = Karten Editor donate = Spenden -abandon = Abandon +abandon = Aufgeben abandon.text = Diese Zone sowie alle Ressourcen werden dem Gegner überlassen. -locked = Locked -complete = [LIGHT_GRAY]Complete: +locked = Gesperrt +complete = [LIGHT_GRAY]Abschließen: zone.requirement = Welle {0} in Zone {1} resume = Zu Zone zurückkehren:\n[LIGHT_GRAY]{0} -bestwave = [LIGHT_GRAY]Best: {0} -launch = Launch -launch.title = Launch Successful -launch.next = [LIGHT_GRAY]nächste Möglichkeit bei Welle {0} -launch.unable = [scarlet]Unable to LAUNCH.[] Enemies. -launch.confirm = This will launch all resources in your core.\nYou will not be able to return to this base. -uncover = Uncover -configure = Configure Loadout -configure.locked = [LIGHT_GRAY]Reach wave {0}\nto configure loadout. +bestwave = [LIGHT_GRAY]Beste Welle: {0} +launch = Abschluss +launch.title = Abschluss Erfolgreich +launch.next = [LIGHT_GRAY]Nächste Möglichkeit bei Welle {0} +launch.unable2 = [scarlet]Unable to LAUNCH.[] +launch.confirm = Dies wird alle Ressourcen in deinen Kern übertragen.\nDu kannst nicht wieder zu dieser Karte zurückkehren. +launch.skip.confirm = If you skip now, you will not be able to launch until later waves. +uncover = Freischalten +configure = Startitems festlegen +configure.locked = [LIGHT_GRAY]Erreiche Welle {0}\n, um Startitems festlegen zu können. zone.unlocked = [LIGHT_GRAY]{0} freigeschaltet. zone.requirement.complete = Welle {0} erreicht:\n{1} Anforderungen der Zone erfüllt. -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 +zone.config.complete = Welle {0} erreicht:\nFestlegen von Startitems freigeschaltet. +zone.resources = Ressourcen entdeckt: +zone.objective = [lightgray]Ziel: [accent]{0} +zone.objective.survival = Überlebe +zone.objective.attack = Zerstöre den feindlichen Kern add = Hinzufügen... -boss.health = Boss Health +boss.health = Boss Lebenskraft connectfail = [crimson] Verbindung zum Server konnte nicht hergestellt werden: [accent]{0} error.unreachable = Server nicht erreichbar. error.invalidaddress = Ungültige Adresse. @@ -336,35 +344,37 @@ error.timedout = Zeitüberschreitung!\nStelle sicher, dass die Portweiterleitung error.mismatch = Paketfehler:\nClient und Server passen möglicherweise nicht zusammen.\nStelle sicher, dass du und der Host jeweils die neueste Version von Mindustry haben! error.alreadyconnected = Bereits verbunden. error.mapnotfound = Kartendatei nicht gefunden! -error.io = Network I/O error. +error.io = Netzwerk I/O Fehler. error.any = Unbekannter Netzwerkfehler. -error.bloom = Failed to initialize bloom.\nYour device may not support it. +error.bloom = Bloom konnte nicht initialisiert werden.\nEs kann sein, dass dein Gerät es nicht unterstützt. 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.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.impact0078.description = -zone.crags.description = +zone.desertWastes.name = Schrottwüste +zone.craters.name = Krater +zone.frozenForest.name = Gefrorener Wald +zone.ruinousShores.name = Verfallene Ufer +zone.stainedMountains.name = Gefleckte Berge +zone.desolateRift.name = Trostloser Riss +zone.nuclearComplex.name = Kernkraftwerk +zone.overgrowth.name = Überwucherung +zone.tarFields.name = Teerfelder +zone.saltFlats.name = Salzebenen +zone.impact0078.name = Auswirkung 0078 +zone.crags.name = Felsen +zone.fungalPass.name = Fungal Pass +zone.groundZero.description = Der optimale Ort, um anzufangen. Niedrige Bedrohung durch Gegner. Wenige Ressourcen.\nSammel so viel Kupfer und Blei wie möglich.\nMach weiter! +zone.frozenForest.description = Sogar hier, näher an den Bergen, haben sich die Sporen verbreitet. Die kalten Temperaturen können sie nicht für immer im Schach halten.\n\nStarte das Wagnis in Strom. Baue Verbrennungsgeneratoren. Lerne Heiler zu benutzen. +zone.desertWastes.description = Diese Abfälle sind riesig, unberechenbar, und durchzogen von verfallenen Sektorstrukturen.\nKohle ist in dieser Region vorhanden. Verbrenne es für Strom, oder synthetisiere Graphit.\n\n[lightgray]Dieser Landeort kann nicht garantiert werden. +zone.saltFlats.description = Am Rande der Wüste liegen die Salzebenen. In dieser Gegend können wenige Ressourcen gefunden werden.\n\nDer Feind hat hier einen Ressourcenspeicherkomplex errichtet. Zerstöre ihren Kern. Lass nichts stehen. +zone.craters.description = Wasser hat sich in diesem Krater angesammelt, ein Relikt von den alten Kriegen. Gewinne dieses Gebiet zurück. Sammle Sand. Schmelze Metaglass. Pumpe Wasser, um Geschütztürme und Bohrer zu kühlen. +zone.ruinousShores.description = Vorbei an der Wüste ist die Küste. An diesem Ort befand sich einst eine Küstenverteidigungsanlage. Davon ist aber nicht mehr viel übrig. Lediglich die einfachsten Verteidigungsstrukturen sind unversehrt, alles andere ist nur noch Schrott.\nSetzen Sie die Ausbreitung nach außen fort. Wiederentdecke die Technologie. +zone.stainedMountains.description = Weiter im Landesinneren liegen die Berge, die noch nicht von Sporen befleckt sind.\nExtrahiere das reichlich vorhandene Titan in diesem Bereich. Erlerne es zu benutzen.\n\nDie feindliche Präsenz ist größer hier. Gib ihnen nicht die Zeit ihre stärksten Einheiten zu schicken. +zone.overgrowth.description = Dieser Bereich ist bewachsen, näher an der Quelle der Sporen.\nDer Feind hat hier einen Außenposten errichtet. Baue Dagger-Einheiten. Zerstöre es. Gewinne zurück, was verloren gegangen ist. +zone.tarFields.description = Der Rand einer Ölförderzone, zwischen Bergen und Wüste. Eine der wenigen Plätze mit nutzbare Teer Reserven.\nObwohl es aufgegeben wurde, hat dieses Gebiet einige gefährliche feindliche Kräfte in der Nähe. Unterschätze sie nicht.\n\n[lightgray]Wenn möglich, erforsche Technologien zur Ölverarbeitung. +zone.desolateRift.description = Eine extrem gefährliche Zone. Reichlich Ressourcen, aber wenig Platz. Hohe Zerstörungsgefahr. Verlasse es so schnell wie möglich. Lassen Sie sich nicht von den großen Abständen zwischen feindlichen Angriffen in die Irre führen. +zone.nuclearComplex.description = Eine ehemalige Anlage zur Herstellung und Verarbeitung von Thorium, die in Trümmern liegt.\n[lightgray]Erforsche das Thorium und seine vielen Verwendungsmöglichkeiten.\n\nDer Feind ist hier in großer Zahl präsent und sucht ständig nach Angreifern. +zone.fungalPass.description = A transition area between high mountains and lower, spore-ridden lands. A small enemy reconnaissance base is located here.\nDestroy it.\nUse Dagger and Crawler units. Take out the two cores. +zone.impact0078.description = +zone.crags.description = settings.language = Sprache settings.reset = Auf Standard zurücksetzen settings.rebind = Zuweisen @@ -373,7 +383,7 @@ settings.game = Spiel settings.sound = Audio 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änig gemacht werden! +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 @@ -386,7 +396,7 @@ error.crashtitle = Ein Fehler ist aufgetreten! attackpvponly = [scarlet]Nur in Angriff oder PvP Modus verfügbar. blocks.input = Input blocks.output = Output -blocks.booster = Booster +blocks.booster = Verstärkung block.unknown = [LIGHT_GRAY]??? blocks.powercapacity = Kapazität blocks.powershot = Stromverbrauch/Schuss @@ -394,7 +404,7 @@ blocks.damage = Schaden blocks.targetsair = Visiert Luft Einheiten an blocks.targetsground = Visiert Boden Einheiten an blocks.itemsmoved = Bewegungsgeschwindigkeit -blocks.launchtime = Time Between Launches +blocks.launchtime = Zeit zwischen Starts blocks.shootrange = Reichweite blocks.size = Größe blocks.liquidcapacity = Flüssigkeitskapazität @@ -404,32 +414,33 @@ blocks.powerdamage = Stromverbrauch/Schadenspunkt blocks.itemcapacity = Materialkapazität blocks.basepowergeneration = Basis-Stromerzeugung blocks.productiontime = Produktionszeit -blocks.repairtime = Block Full Repair Time +blocks.repairtime = Block volle Reparaturzeit blocks.speedincrease = Geschwindigkeitserhöhung blocks.range = Reichweite blocks.drilltier = Abbaubare Erze blocks.drillspeed = Bohrgeschwindigkeit -blocks.boosteffect = Boost Effect -blocks.maxunits = Max Active Units +blocks.boosteffect = Verstärkungseffekt +blocks.maxunits = Max aktive Einheiten blocks.health = Lebenspunkte -blocks.buildtime = Build Time +blocks.buildtime = Baudauer blocks.inaccuracy = Ungenauigkeit blocks.shots = Schüsse blocks.reload = Schüsse/Sekunde -blocks.ammo = Ammo +blocks.ammo = Munition +bar.drilltierreq = Better Drill Required bar.drillspeed = Bohrgeschwindigkeit: {0}/s bar.efficiency = Effizienz: {0}% -bar.powerbalance = Power: {0} -bar.poweramount = Power: {0} -bar.poweroutput = Power Output: {0} +bar.powerbalance = Strom: {0} +bar.poweramount = Strom: {0} +bar.poweroutput = Strom Output: {0} bar.items = Items: {0} bar.liquid = Flüssigkeit bar.heat = Hitze -bar.power = Power -bar.progress = Build Progress -bar.spawned = Units: {0}/{1} +bar.power = Strom +bar.progress = Baufortschritt +bar.spawned = Einheiten: {0}/{1} bullet.damage = [stat]{0}[lightgray] Schaden -bullet.splashdamage = [stat]{0}[lightgray] area dmg ~[stat] {1}[lightgray] tiles +bullet.splashdamage = [stat]{0}[lightgray] Flächenschaden ~[stat] {1}[lightgray] Kacheln bullet.incendiary = [stat]entzündend bullet.homing = [stat]verfolgend bullet.shock = [stat]schock @@ -437,8 +448,8 @@ bullet.frag = [stat]explosiv bullet.knockback = [stat]{0}[lightgray] zurückstoßend bullet.freezing = [stat]gefrierend bullet.tarred = [stat]geteert -bullet.multiplier = [stat]{0}[lightgray]x ammo multiplier -bullet.reload = [stat]{0}[lightgray]x reload +bullet.multiplier = [stat]{0}[lightgray]x Munition Multiplikator +bullet.reload = [stat]{0}[lightgray]x neu laden unit.blocks = Blöcke unit.powersecond = Stromeinheiten/Sekunde unit.liquidsecond = Flüssigkeitseinheiten/Sekunde @@ -448,30 +459,30 @@ unit.powerunits = Stromeinheiten unit.degrees = Grad unit.seconds = Sekunden unit.persecond = /sec -unit.timesspeed = x speed +unit.timesspeed = x Geschwindigkeit unit.percent = % unit.items = Materialeinheiten -category.general = Generell +category.general = Allgemeines category.power = Strom category.liquids = Flüssigkeiten category.items = Materialien category.crafting = Erzeugung category.shooting = Schießen -category.optional = Optional Enhancements -setting.landscape.name = Lock Landscape +category.optional = Optionale Verbesserungen +setting.landscape.name = Landschaft sperren setting.shadows.name = Schatten -setting.linear.name = Linear Filtering +setting.linear.name = Lineare Filterung setting.animatedwater.name = Animiertes Wasser setting.animatedshields.name = Animierte Schilde -setting.antialias.name = Antialias[LIGHT_GRAY] (benötigt Neustart)[] -setting.indicators.name = Ally Indicators +setting.antialias.name = Antialias[LIGHT_GRAY] (Neustart erforderlich)[] +setting.indicators.name = Verbündeten-Indikatoren setting.autotarget.name = Auto-Zielauswahl -setting.keyboard.name = Mouse+Keyboard Controls +setting.keyboard.name = Maus+Tastatur Steuerung setting.fpscap.name = Max FPS setting.fpscap.none = kein setting.fpscap.text = {0} FPS -setting.uiscale.name = UI Scaling[lightgray] (require restart)[] -setting.swapdiagonal.name = Always Diagonal Placement +setting.uiscale.name = UI-Skalierung[lightgray] (Neustart erforderlich)[] +setting.swapdiagonal.name = Immer diagonale Platzierung setting.difficulty.training = Training setting.difficulty.easy = Leicht setting.difficulty.normal = Normal @@ -484,40 +495,41 @@ setting.sensitivity.name = Controller-Empfindlichkeit setting.saveinterval.name = Autosave Häufigkeit setting.seconds = {0} Sekunden setting.fullscreen.name = Vollbild -setting.borderlesswindow.name = Borderless Window[LIGHT_GRAY] (may require restart) +setting.borderlesswindow.name = Randloses Fenster[LIGHT_GRAY] (Neustart teilweise erforderlich) setting.fps.name = Zeige FPS setting.vsync.name = VSync setting.lasers.name = Zeige Stromlaser setting.pixelate.name = Verpixeln [LIGHT_GRAY](Könnte die Leistung beeinträchtigen) setting.minimap.name = Zeige die Minimap setting.musicvol.name = Musiklautstärke +setting.ambientvol.name = Ambient Volume setting.mutemusic.name = Musik stummschalten setting.sfxvol.name = Audioeffekt-Lautstärke setting.mutesound.name = Audioeffekte stummschalten setting.crashreport.name = Anonyme Absturzberichte senden -setting.chatopacity.name = Chat Opacity -setting.playerchat.name = Display In-Game Chat -uiscale.reset = UI scale has been changed.\nPress "OK" to confirm this scale.\n[scarlet]Reverting and exiting in[accent] {0}[] settings... -uiscale.cancel = Cancel & Exit +setting.chatopacity.name = Chat Deckkraft +setting.playerchat.name = Chat im Spiel anzeigen +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 keybind.title = Tasten zuweisen -keybinds.mobile = [scarlet]Most keybinds here are not functional on mobile. Only basic movement is supported. +keybinds.mobile = [scarlet]Die meisten Tastenzuweisungen hier funktionieren auf z.B. Handys nicht. Nur grundlegende Bewegung wird unterstützt. category.general.name = Allgemein category.view.name = Ansicht category.multiplayer.name = Mehrspieler command.attack = Angreifen command.retreat = Rückzug command.patrol = Patrouillieren -keybind.gridMode.name = Block Select +keybind.gridMode.name = Block Auswahl keybind.gridModeShift.name = Kategorie auswählen keybind.press = Drücke eine Taste... keybind.press.axis = Drücke eine Taste oder bewege eine Achse... -keybind.screenshot.name = Map Screenshot +keybind.screenshot.name = Karten Screenshot keybind.move_x.name = X-Achse keybind.move_y.name = Y-Achse keybind.select.name = Auswählen/Schießen keybind.diagonal_placement.name = Diagonal platzieren -keybind.pick.name = Pick Block +keybind.pick.name = Block Auswählen keybind.break_block.name = Block zerstören keybind.deselect.name = Auswahl aufheben keybind.shoot.name = Schießen @@ -538,41 +550,41 @@ keybind.chat_scroll.name = Chat scrollen keybind.drop_unit.name = Einheit absetzen keybind.zoom_minimap.name = Minimap-Zoom mode.help.title = Beschreibung der Modi -mode.survival.name = Survival +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.pvp.name = PvP -mode.pvp.description = Kämpfe gegen andere Spieler local. -mode.attack.name = Attack +mode.pvp.description = Kämpfe gegen andere Spieler lokal. +mode.attack.name = Angriff mode.attack.description = Keine Wellen, das Ziel ist es die gegnerische Basis zu zerstören. mode.custom = Angepasste Regeln rules.infiniteresources = Unbegrenzte Ressourcen rules.wavetimer = Wellen Timer rules.waves = Wellen -rules.attack = Attack Mode +rules.attack = Angriff-Modus rules.enemyCheat = Unbegrenzte Ressourcen für KI -rules.unitdrops = Unit Drops -rules.unitbuildspeedmultiplier = Unit Creation Speed Multiplier -rules.unithealthmultiplier = Unit Health Multiplier -rules.playerhealthmultiplier = Player Health Multiplier -rules.playerdamagemultiplier = Player Damage Multiplier -rules.unitdamagemultiplier = Unit Damage Multiplier -rules.enemycorebuildradius = Enemy Core No-Build Radius:[LIGHT_GRAY] (tiles) -rules.respawntime = Respawn Time:[LIGHT_GRAY] (sec) -rules.wavespacing = Wave Spacing:[LIGHT_GRAY] (sec) -rules.buildcostmultiplier = Build Cost Multiplier -rules.buildspeedmultiplier = Build Speed Multiplier -rules.waitForWaveToEnd = Waves wait for enemies -rules.dropzoneradius = Drop Zone Radius:[LIGHT_GRAY] (tiles) -rules.respawns = Max respawns per wave -rules.limitedRespawns = Limit Respawns -rules.title.waves = Waves +rules.unitdrops = Einheiten-Drops +rules.unitbuildspeedmultiplier = Baugeschwindigkeit-Einheit Multiplikator +rules.unithealthmultiplier = Lebenspunkte-Einheit Multiplikator +rules.playerhealthmultiplier = Spieler-Lebenspunkte Multiplikator +rules.playerdamagemultiplier = Spieler-Schaden Multiplikator +rules.unitdamagemultiplier = Schaden-Einheit Multiplikator +rules.enemycorebuildradius = Bauverbot Radius druch feindlichen Kern:[LIGHT_GRAY] (Kacheln) +rules.respawntime = Respawn Zeit:[LIGHT_GRAY] (Sek) +rules.wavespacing = Wellen Abstand:[LIGHT_GRAY] (Sek) +rules.buildcostmultiplier = Bau-Kosten Multiplikator +rules.buildspeedmultiplier = Bau-Schnelligkeit Multiplikator +rules.waitForWaveToEnd = Warten bis Welle endet +rules.dropzoneradius = Drop Zonen Radius:[LIGHT_GRAY] (Kacheln) +rules.respawns = Max Respawns pro Welle +rules.limitedRespawns = Respawn-Limit +rules.title.waves = Wellen rules.title.respawns = Respawns -rules.title.resourcesbuilding = Resources & Building -rules.title.player = Players -rules.title.enemy = Enemies -rules.title.unit = Units +rules.title.resourcesbuilding = Ressourcen & Gebäude +rules.title.player = Spieler +rules.title.enemy = Gegner +rules.title.unit = Einheiten content.item.name = Materialien content.liquid.name = Flüssigkeiten content.unit.name = Einheiten @@ -581,21 +593,21 @@ content.mech.name = Mechs item.copper.name = Kupfer item.lead.name = Blei item.coal.name = Kohle -item.graphite.name = Graphite +item.graphite.name = Graphit item.titanium.name = Titan item.thorium.name = Uran item.silicon.name = Silizium item.plastanium.name = Plastanium item.phase-fabric.name = Phasengewebe item.surge-alloy.name = Spannungsstoß-Legierung -item.spore-pod.name = Spore Pod +item.spore-pod.name = Sporen-Pod item.sand.name = Sand item.blast-compound.name = Explosive Mischung item.pyratite.name = Pyratit item.metaglass.name = Metaglass -item.scrap.name = Scrap +item.scrap.name = Schrott liquid.water.name = Wasser -liquid.slag.name = Slag +liquid.slag.name = Asche liquid.oil.name = Öl liquid.cryofluid.name = Kryoflüssigkeit mech.alpha-mech.name = Alpha @@ -625,86 +637,86 @@ item.radioactivity = [LIGHT_GRAY]Radioaktivität: {0} unit.health = [LIGHT_GRAY]Lebenskraft: {0} unit.speed = [LIGHT_GRAY]Geschwindigkeit: {0} mech.weapon = [LIGHT_GRAY]Waffe: {0} -mech.health = [LIGHT_GRAY]Health: {0} +mech.health = [LIGHT_GRAY]Lebenspunkte: {0} mech.itemcapacity = [LIGHT_GRAY]Materialkapazität: {0} mech.minespeed = [LIGHT_GRAY]Erzabbaugeschwindigkeit: {0} mech.minepower = [LIGHT_GRAY]Erzabbaukraft: {0} mech.ability = [LIGHT_GRAY]Fähigkeit: {0} -mech.buildspeed = [LIGHT_GRAY]Building Speed: {0}% +mech.buildspeed = [LIGHT_GRAY]Baugeschwindigkeit: {0}% liquid.heatcapacity = [LIGHT_GRAY]Wärmekapazität: {0} liquid.viscosity = [LIGHT_GRAY]Viskosität: {0} liquid.temperature = [LIGHT_GRAY]Temperatur: {0} -block.sand-boulder.name = Sand Boulder +block.sand-boulder.name = Sand Brocken block.grass.name = Gras block.salt.name = Salz -block.saltrocks.name = Salt Rocks -block.pebbles.name = Pebbles -block.tendrils.name = Tendrils +block.saltrocks.name = Salz Gestein +block.pebbles.name = Geröll +block.tendrils.name = Ranken block.sandrocks.name = Sandstein -block.spore-pine.name = Spore Pine -block.sporerocks.name = Spore Rocks +block.spore-pine.name = Sporen Kiefer +block.sporerocks.name = Sporen Gestein block.rock.name = Gestein -block.snowrock.name = Snow Rock -block.snow-pine.name = Snow Pine -block.shale.name = Shale -block.shale-boulder.name = Shale Boulder +block.snowrock.name = Schnee Gestein +block.snow-pine.name = Schnee Kiefer +block.shale.name = Schiefer +block.shale-boulder.name = Schiefer Geröll block.moss.name = Moos -block.shrubs.name = Shrubs -block.spore-moss.name = Spore Moss -block.shalerocks.name = Shale Rocks -block.scrap-wall.name = Scrap Wall -block.scrap-wall-large.name = Large Scrap Wall -block.scrap-wall-huge.name = Huge Scrap Wall -block.scrap-wall-gigantic.name = Gigantic Scrap Wall -block.thruster.name = Thruster -block.kiln.name = Kiln -block.graphite-press.name = Graphite Press -block.multi-press.name = Multi-Press -block.constructing = {0}\n[LIGHT_GRAY](Constructing) +block.shrubs.name = Gestrüpp +block.spore-moss.name = Sporen Moos +block.shalerocks.name = Schiefer Gestein +block.scrap-wall.name = Schrott Mauer +block.scrap-wall-large.name = Große Schrott Mauer +block.scrap-wall-huge.name = Riesige Schrott Mauer +block.scrap-wall-gigantic.name = Gigantische Schrott Mauer +block.thruster.name = Schubdüse +block.kiln.name = Brennofen +block.graphite-press.name = Graphit-Presse +block.multi-press.name = Multipresse +block.constructing = {0}\n[LIGHT_GRAY](Bauen) block.spawn.name = Gegnerischer Startpunkt -block.core-shard.name = Core: Shard -block.core-foundation.name = Core: Foundation -block.core-nucleus.name = Core: Nucleus +block.core-shard.name = Kern: Scherbe +block.core-foundation.name = Kern: Fundament +block.core-nucleus.name = Kern: Nukleus block.deepwater.name = Tiefes Wasser block.water.name = Wasser -block.tainted-water.name = Tainted Water -block.darksand-tainted-water.name = Dark Sand Tainted Water +block.tainted-water.name = Unreines Wasser +block.darksand-tainted-water.name = Dunkler Sand in unreinem Wasser block.tar.name = Teer block.stone.name = Stein block.sand.name = Sand block.darksand.name = Dunkler Sand block.ice.name = Eis block.snow.name = Schnee -block.craters.name = Craters +block.craters.name = Krater block.sand-water.name = Sandiges Wasser -block.darksand-water.name = Dark Sand Water -block.char.name = Char -block.holostone.name = Holo stone -block.ice-snow.name = Ice Snow +block.darksand-water.name = Dunkles Sandiges Wasser +block.char.name = Holzkohle +block.holostone.name = Holo Stein +block.ice-snow.name = Eisschnee block.rocks.name = Felsen -block.icerocks.name = Ice rocks -block.snowrocks.name = Snow Rocks -block.dunerocks.name = Dune Rocks -block.pine.name = Pine -block.white-tree-dead.name = White Tree Dead +block.icerocks.name = Eis Felsen +block.snowrocks.name = Schnee Felsen +block.dunerocks.name = Dünen Felsen +block.pine.name = Kiefer +block.white-tree-dead.name = Weißer Toter Baum block.white-tree.name = Weißer Baum -block.spore-cluster.name = Spore Cluster +block.spore-cluster.name = Sporen Cluster block.metal-floor.name = Metallboden block.metal-floor-2.name = Metallboden 2 block.metal-floor-3.name = Metallboden 3 block.metal-floor-5.name = Metallboden 5 block.metal-floor-damaged.name = Metallboden Beschädigt -block.dark-panel-1.name = Dark Panel 1 -block.dark-panel-2.name = Dark Panel 2 -block.dark-panel-3.name = Dark Panel 3 -block.dark-panel-4.name = Dark Panel 4 -block.dark-panel-5.name = Dark Panel 5 -block.dark-panel-6.name = Dark Panel 6 -block.dark-metal.name = Dark Metal -block.ignarock.name = Igna Rock -block.hotrock.name = Hot Rock -block.magmarock.name = Magma Rock -block.cliffs.name = Cliffs +block.dark-panel-1.name = Dunkles Panel 1 +block.dark-panel-2.name = Dunkles Panel 2 +block.dark-panel-3.name = Dunkles Panel 3 +block.dark-panel-4.name = Dunkles Panel 4 +block.dark-panel-5.name = Dunkles Panel 5 +block.dark-panel-6.name = Dunkles Panel 6 +block.dark-metal.name = Dunkles Metall +block.ignarock.name = Igna Felsen +block.hotrock.name = Heißer Felsen +block.magmarock.name = Magma Felsen +block.cliffs.name = Klippen block.copper-wall.name = Kupfermauer block.copper-wall-large.name = Große Kupfermauer block.titanium-wall.name = Titanmauer @@ -716,10 +728,10 @@ block.thorium-wall-large.name = Große Thorium-Mauer block.door.name = Tür block.door-large.name = Große Tür block.duo.name = Duo -block.scorch.name = Scorch +block.scorch.name = Flammenwerfer block.scatter.name = Scatter -block.hail.name = Hail -block.lancer.name = Lancer +block.hail.name = Streuer +block.lancer.name = Lanzer block.conveyor.name = Förderband block.titanium-conveyor.name = Titan-Förderband block.junction.name = Kreuzung @@ -733,18 +745,18 @@ block.pulverizer.name = Pulverisierer block.cryofluidmixer.name = Kryoflüssigkeitsmixer block.melter.name = Schmelzer block.incinerator.name = Verbrennungsanlage -block.spore-press.name = Spore Press -block.separator.name = Separierer -block.coal-centrifuge.name = Coal Centrifuge +block.spore-press.name = Sporen Presse +block.separator.name = Separator +block.coal-centrifuge.name = Kohlen Zentrifuge block.power-node.name = Stromknoten block.power-node-large.name = Großer Stromknoten -block.surge-tower.name = Surge Tower +block.surge-tower.name = Schwall Turm block.battery.name = Batterie block.battery-large.name = Große Batterie block.combustion-generator.name = Verbrennungsgenerator block.turbine-generator.name = Turbinengenerator -block.differential-generator.name = Differential Generator -block.impact-reactor.name = Impact Reactor +block.differential-generator.name = Differentialgenerator +block.impact-reactor.name = Schlaggenerator block.mechanical-drill.name = Mechanischer Bohrer block.pneumatic-drill.name = Pneumatischer Bohrer block.laser-drill.name = Laser-Bohrer @@ -752,9 +764,9 @@ block.water-extractor.name = Wasser-Extraktor block.cultivator.name = Kultivierer block.dart-mech-pad.name = Dart Mech Pad block.delta-mech-pad.name = Delta Mech Pad -block.javelin-ship-pad.name = Javelin Ship Pad -block.trident-ship-pad.name = Trident Ship Pad -block.glaive-ship-pad.name = Glaive Ship Pad +block.javelin-ship-pad.name = Javelin Luftschiff Pad +block.trident-ship-pad.name = Trident Luftschiff Pad +block.glaive-ship-pad.name = Glaive Luftschiff Pad block.omega-mech-pad.name = Omega Mech Pad block.tau-mech-pad.name = Tau Mech Pad block.conduit.name = Leitungsrohr @@ -777,14 +789,14 @@ block.pyratite-mixer.name = Pyratit-Mixer block.blast-mixer.name = Sprengmixer block.solar-panel.name = Solar Panel block.solar-panel-large.name = Großes Solar Panel -block.oil-extractor.name = Oil Extraktor +block.oil-extractor.name = Öl Extraktor block.draug-factory.name = Draug Miner Drone Factory block.spirit-factory.name = Spirit-Drohnenfabrik block.phantom-factory.name = Phantom-Drohnenfabrik block.wraith-factory.name = Wraith Fighter-Fabrik block.ghoul-factory.name = Ghoul Bomber-Fabrik block.dagger-factory.name = Dagger Mech-Fabrik -block.crawler-factory.name = Crawler Mech Factory +block.crawler-factory.name = Crawler Mech-Fabrik block.titan-factory.name = Titan Mech-Fabrik block.fortress-factory.name = Fortress Mech-Fabrik block.revenant-factory.name = Revenant Fighter-Fabrik @@ -801,27 +813,28 @@ block.mass-driver.name = Massenbeschleuniger block.blast-drill.name = Sprengbohrer block.thermal-pump.name = Thermische Pumpe block.thermal-generator.name = Thermischer Generator -block.alloy-smelter.name = Legierungsschmeltzer -block.mender.name = Mender -block.mend-projector.name = Reparaturprojektor +block.alloy-smelter.name = Legierungsschmelze +block.mender.name = Heiler +block.mend-projector.name = Heilprojektor block.surge-wall.name = Spannungsstoß-Mauer block.surge-wall-large.name = Große Spannungsstoß-Mauer -block.cyclone.name = Cyclone -block.fuse.name = Fuse +block.cyclone.name = Zyklon +block.fuse.name = Zünder block.shock-mine.name = Schock-Mine block.overdrive-projector.name = Beschleunigungs-Projektor block.force-projector.name = Kraftfeld-Projektor -block.arc.name = Arc +block.arc.name = Arcus block.rtg-generator.name = RTG Generator -block.spectre.name = Spectre +block.spectre.name = Phantom block.meltdown.name = Meltdown block.container.name = Container block.launch-pad.name = Launch Pad -block.launch-pad-large.name = Large Launch Pad +block.launch-pad-large.name = Großes Launch Pad team.blue.name = Blau -team.red.name = Rot +team.crux.name = red +team.sharded.name = orange team.orange.name = Orange -team.none.name = Grau +team.derelict.name = derelict team.green.name = Grün team.purple.name = Lila unit.spirit.name = Spirit Drohne @@ -839,107 +852,102 @@ unit.chaos-array.name = Chaos Array unit.eradicator.name = Eradicator unit.lich.name = Lich unit.reaper.name = Reaper -tutorial.begin = Deine Mission ist es den [LIGHT_GRAY]Gegner[] auszurotten.\n\n Beginne damit [accent] Kupfer abzubauen[]. Beginne in dem du auf ein Kupfer Vorkommen nahe deines Kerns klickst. +tutorial.next = [lightgray] +tutorial.intro = You have entered the[scarlet] Mindustry Tutorial.[]\nBegin by[accent] mining copper[]. Tap a copper ore vein near your core to do this.\n\n[accent]{0}/{1} copper tutorial.drill = Manuelles Abbauen von Ressourcen ist ineffizient.\n[accent]Bohrer[] können automatisch abbauen.\n Platziere einen auf einem Kupfer Vorkommen. +tutorial.drill.mobile = Mining manually is inefficient.\n[accent]Drills []can mine automatically.\nTap the drill tab in the bottom right.\nSelect the[accent] mechanical drill[].\nPlace it on a copper vein by tapping, then press the[accent] checkmark[] below to confirm your selection.\nPress the[accent] X button[] to cancel placement. +tutorial.blockinfo = Each block has different stats. Each drill can only mine certain ores.\nTo check a block's info and stats,[accent] tap the "?" button while selecting it in the build menu.[]\n\n[accent]Access the Mechanical Drill's stats now.[] tutorial.conveyor = [accent]Transportbänder[] werden dazu benutzt Materialien zum Kern zu transportieren.\n Erstelle eine Reihe von Transportbändern zum Kern. -tutorial.morecopper = Du brauchst [accent]mehr Kupfer[]!\n\nEntweder du baust es manuell ab, oder du platzierst weitere Bohrer. +tutorial.conveyor.mobile = [accent]Conveyors[] are used to transport items to the core.\nMake a line of conveyors from the drill to the core.\n[accent] Place in a line by holding down your finger for a few seconds[] and dragging in a direction.\n\n[accent]{0}/{1} conveyors placed in line\n[accent]0/1 items delivered tutorial.turret = Verteidigungsgebäude müssen gebaut werden um[LIGHT_GRAY] Gegner[] abzuwehren.\nBaue einen Duo Geschützturm in die Nähe deiner Basis. -tutorial.drillturret = Duo Geschütztürme benötigen[accent] Kupfermunition []um zu schießen.\nPlatziere einen Bohrer neben das Geschütz um es mit Kupfer zu versorgen. +tutorial.drillturret = Duo Geschütztürme benötigen[accent] Kupfermunition, []um schießen zu können.\nPlatziere neben das Geschütz einen Bohrer, um ihn mit Kupfer zu versorgen. +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 = Der [LIGHT_GRAY] Gegner[] greift an.\n\nVerteidige deinen Kern 2 Wellen lang. Bau mehr Türme. -tutorial.lead = Mehr Erz ist verfügbar. Finde Blei und bau es ab.\n\n Klicke auf deine Einheit und ziehe die Maus auf den Kern um Ressourcen zu übertragen. -tutorial.smelter = Kupfer und Blei sind schwache Metalle.\n Super [accent]dichte Legierung [] kann in einem Schmeltzer erzeugt werden.\n\n Bau einen. -tutorial.densealloy = Der Schmeltzer wird nun Legierung produzieren.\n Produziere einige.\n Verbessere die Produktion sofern notwendig. -tutorial.siliconsmelter = Der Kern wird nun [accent]spirit drohnen[] erstellen. Diese Bauen Rohstoffe und reparieren Blöcke.\n\nFabriken für andere Einheiten benötigen [accent]Silizium[].\n Baue ein Silizium Schmeltzer. -tutorial.silicondrill = Silizium benötigt [accent]Kohle[] und [accent]Sand[].\n Fange damit an die Bohrer zu platzieren. -tutorial.generator = Diese Technologie benötigt power.\n Erstelle einen Verbrennungs-Generator dafür. -tutorial.generatordrill = Verbrennungs Generatoren benötigen Kraftstoff.\nBenutze Kohle aus einem Bohrer als Kraftstoff. -tutorial.node = Power muss transportiert werden.\nErstelle einen [accent]Stromknoten[] nahe deinem Verbrennungs Generator um seine Power zu transportieren. -tutorial.nodelink = Power kann über verbundene Power Blocks, Generatoren oder Stromknoten transferierd werden.\n\n Verbinde die Power in dem du auf den Knoten klickst und dann den Generator und den Silizium Schmeltzer auswählst. -tutorial.silicon = Silizium wird produziert. Produziere einiges.\n\n Verbesserungen am Produktionssystem werden empfohlen. -tutorial.daggerfactory = Konstruiere eine Dagger Mech Fabrik.\n\n Diese wird verwendet um Angreifende Mechs zu erstellen. -tutorial.router = Fabriken benötigen Ressourcen um zu funktionieren.\n Platziere ein Router um Materialien auf Transportbändern aufzuteilen. -tutorial.dagger = Verbinde die Fabrik mit einem Stromknoten. Wenn alle Voraussetzungen gegeben sind, beginnt die Fabrik Mechs zu konstruieren.\n\n Platziere mehr Bohrer und Transportbänder um die Versorgung der Fabrik zu sichern. -tutorial.battle = Der[LIGHT_GRAY] Gegner[] hat seinen Kern offenbart.\nZerstöre ihn mit deiner Einheit und den Dagger Mechs. +tutorial.waves.mobile = The[lightgray] enemy[] approaches.\n\nDefend the core for 2 waves. Your ship will automatically fire at enemies.\nBuild more turrets and drills. Mine more copper. +tutorial.launch = Once you reach a specific wave, you are able to[accent] launch the core[], leaving your defenses behind and[accent] obtaining all the resources in your core.[]\nThese resources can then be used to research new technology.\n\n[accent]Press the launch button. item.copper.description = Ein nützliches Material. Wird in allen Arten von Blöcken verwendet. -item.lead.description = Ein grundliegendes Material. Häufig in Elektronik und Flüssigkeits-Transport-Blöcken verwendet. +item.lead.description = Ein grundlegendes Material. Häufig in Elektronik und Flüssigkeits-Transport-Blöcken verwendet. item.metaglass.description = Eine super harte Glasmischung. Wird zur Verteilung und Lagerung von Flüssigkeiten benutzt. -item.graphite.description = Mineralized carbon, used for ammunition and electrical insulation. +item.graphite.description = Mineralisierter Kohlenstoff Wird für Munition und elektrische Isolierung verwendet. item.sand.description = Ein gängiges Material, welches häufig in geschmolzener Form, flüssig oder als Legierung verwendet wird. item.coal.description = Ein sehr häufiger vorkommender Kraftstoff. -item.titanium.description = Ein seltenes, sehr leichtes Metall. Häufig in Flüssigkeits-Transport-Blöcken, Abbauanlagen und Flugzeugen verwendet. +item.titanium.description = Ein seltenes, sehr leichtes Metall. Häufig in Flüssigkeits-Transport-Blöcken, Abbauanlagen und Luftschiffen verwendet. item.thorium.description = Ein dichtes radioaktives Metall, welches als strukturelle Unterstützung und nuklearer Kraftstoff verwendet wird. -item.scrap.description = Überreste alter Gebäude und Einheiten. Enthalten Spuren verschiedenster Metalle. +item.scrap.description = Überreste alter Gebäude und Einheiten. Enthalten Spuren verschiedener Metalle. item.silicon.description = Ein sehr nützlicher Halbleiter. Findet Anwendung in Solaranlagen und komplexer Elektronik. -item.plastanium.description = Ein leichtes dehnbares Material welches in Flugzeugen und Splittermunition verwendet wird. +item.plastanium.description = Ein leichtes dehnbares Material, welches in Flugzeugen und Splittermunition verwendet wird. item.phase-fabric.description = Eine nahezu gewichtslose Substanz, die in fortgeschrittener Elektronik und in selbstreparierender Technologie verwendet wird. item.surge-alloy.description = Eine fortgeschrittene Legierung mit einzigartigen elektrischen Eigenschaften. -item.spore-pod.description = Used for conversion into oil, explosives and fuel. -item.blast-compound.description = Eine flüchtige Mischung, die in Bomben und Sprengstoffen Verwendung findet. Es besteht die Möglichkeit, es als Treibstoff zu verwenden, aber dies ist nicht empfehlenswert. -item.pyratite.description = Eine extrem leicht entflammbare Substanz. Findet Verwendeung in Brandwaffen. -liquid.water.description = Wird überlicherweise zum Kühlen von Maschinen und zur Müllverarbeitung verwendet. -liquid.slag.description = Various different types of molten metal mixed together. Can be separated into its constituent minerals, or sprayed at enemy units as a weapon. +item.spore-pod.description = Wird zur Umwandlung in Öl, Sprengstoff und Kraftstoff verwendet. +item.blast-compound.description = Eine flüchtige Mischung, die in Bomben und Sprengstoffen Verwendung findet. Es besteht die Möglichkeit, es als Treibstoff zu verwenden. Dies ist aber nicht empfehlenswert. +item.pyratite.description = Eine extrem leicht entflammbare Substanz. Findet Verwendung in Brandwaffen. +liquid.water.description = Wird üblicherweise zum Kühlen von Maschinen und zur Müllverarbeitung verwendet. +liquid.slag.description = Ein Gemisch aus verschiedenen Arten von Metall, welche miteinander vermischt wurden. Kann in seine Bestandteile getrennt oder als Waffe auf feindliche Einheiten gesprüht werden. liquid.oil.description = Kann verbrannt, zum explodieren gebracht, oder als Kühlung verwendet werden. liquid.cryofluid.description = Die effizienteste Flüssigkeit, um Dinge herunter zu kühlen. -mech.alpha-mech.description = Der Standard-Mech. Ist angemessen schnell und hat ordentlich Schaden. Kann für erweiterte offensive Fähigkeiten bis zu 3 Drohnen erzeugen. -mech.delta-mech.description = Ein schneller, leicht gepanzerter Mech, der für Überfälle gemacht wurde. Verursacht wenig Schaden gegen Gebäude aber tötet Gruppen von Gegnern durch seine Lichtbogen-Waffen. -mech.tau-mech.description = Der Support Mech. Kann Blöcke durch Schüsse heilen. Kann Feuer löschen und verbündete in seinem Aktionsradius heilen. +mech.alpha-mech.description = Der Standard-Mech. Ist angemessen schnell und macht ordentlich Schaden. Kann für erweiterte offensive Fähigkeiten bis zu 3 Drohnen erzeugen. +mech.delta-mech.description = Ein schneller, leicht gepanzerter Mech, der für Überfälle gemacht wurde. Verursacht wenig Schaden gegen Gebäude, aber tötet Gruppen von Gegnern durch seine Lichtbogen-Waffen. +mech.tau-mech.description = Ein Unterstützungs-Mech. Kann Blöcke durch Schüsse heilen. Kann Feuer löschen und verbündete in seinem Aktionsradius heilen. mech.omega-mech.description = Ein klobiger und gut gepanzerter Mech, der für den Angriff an der Front entwickelt wurde. Seine Rüstungsfähigkeit ermöglicht es ihm, 90% des Schadens abzuwehren. mech.dart-ship.description = Das Standard-Schiff. Einigermaßen schnell und leicht. Hat nur wenig Offensivkraft und geringe Erzabbaugeschwindigkeit. -mech.javelin-ship.description = Ein Schiff für Überfälle. Anfänglich träge, kann es auf hohe Geschwindigkeiten beschleunigen um an gegnerischen Aussenposten vorbei zu fliegen und dabei mit seinen Blitzwaffen und Raketen große Mengen an Schaden verursachen. -mech.trident-ship.description = Ein schwerer Bomber, solide gepanzert. +mech.javelin-ship.description = Ein Schiff für Überfälle. Anfänglich träge, kann es auf hohe Geschwindigkeiten beschleunigen, um an gegnerischen Außenposten vorbei zu fliegen und dabei mit seinen Blitzwaffen und Raketen große Mengen an Schaden verursachen. +mech.trident-ship.description = Ein schwerer Bomber, der solide gepanzert ist. mech.glaive-ship.description = Ein großes, gut gepanzertes Gunship. Ausgerüstet mit einer Brandwaffe. Gute Beschleunigung und maximale Geschwindigkeit. -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 = Die anfängliche Drohne. Sie wird gewöhnlich in der Basis Erz ab, sammelt Materialien und repariert Blöcke. -unit.phantom.description = Eine fortgeschrittene Drohne. Baut automatisch Erz ab, sammelt Materialien und repariert Blöcke. Deutlich effizienter als die Drohne. +unit.draug.description = Eine primitive Bergbaudrohne. Günstig herzustellen. Entbehrlich. Baut automatisch Kupfer und Blei in der Nähe ab. Bringt abgebaute Ressourcen zum nächstgelegenen Kern. +unit.spirit.description = Die anfängliche Drohne. Sie baut gewöhnlich in der Basis Erz ab, sammelt Materialien und repariert Blöcke. +unit.phantom.description = Eine fortgeschrittene Drohne. Baut automatisch Erz ab, sammelt Materialien und repariert Blöcke. Deutlich effizienter als die Standard-Drohne. unit.dagger.description = Eine Standard-Bodeneinheit. Nützlich in Schwärmen. -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.crawler.description = Eine Bodeneinheit, die aus einem abgespeckten Rahmen mit hochexplosiven Sprengstoffen besteht. Nicht besonders haltbar. Explodiert bei Kontakt mit Gegnern. unit.titan.description = Eine fortgeschrittene gepanzerte Bodeneinheit. Greift sowohl Boden- als auch Luftziele an. unit.fortress.description = Eine schwere Artillerie-Bodeneinheit. -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.chaos-array.description = -unit.eradicator.description = +unit.eruptor.description = Ein schwerer Mech, der Strukturen abbaut. Feuert einen Schlackenstrom auf feindliche Befestigungen ab, welcher flüchtige Stoffe in Brand steckt. unit.wraith.description = Eine schneller Abfangjäger. unit.ghoul.description = Ein schwerer Flächenbomber. -unit.revenant.description = A heavy, hovering missile array. -unit.lich.description = -unit.reaper.description = -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 = Eine schwere, schwebende Raketengruppe. +block.graphite-press.description = Komprimiert Kohlestücke zu reinen Graphitplatten. +block.multi-press.description = Eine aktualisierte Version der Graphitpresse. Setzt Wasser und Strom ein, um Kohle schnell und effizient zu verarbeiten. block.silicon-smelter.description = Reduziert Sand mit hochreinem Kohlenstoff, um Silizium zu produzieren. -block.kiln.description = Schmelzt Sand und Blei zu metaglass. Erfordert kleine Mengen Energie. +block.kiln.description = Schmelzt Sand und Blei zu Metaglass. Erfordert kleine Mengen Energie. block.plastanium-compressor.description = Produziert Plastanium aus Öl und Titan. block.phase-weaver.description = Produziert Phasengewebe aus radioaktivem Thorium und großen Mengen an Sand. block.alloy-smelter.description = Verarbeitet Titan, Blei, Silizium und Kupfer zu einer Stromstoßlegierung. block.cryofluidmixer.description = Verarbeitet Wasser mit Titan zu einer Kryoflüssigkeit, die viel effizienter kühlt. -block.blast-mixer.description = Verwendet Öl, um Pyratit in eine weniger enzündliche aber explosivee Mischung umzuwandeln. +block.blast-mixer.description = Verwendet Öl, um Pyratit in eine weniger enzündliche aber explosive Mischung umzuwandeln. block.pyratite-mixer.description = Vermischt Kohle, Blei und Sand zu hochentzündlichem Pyratit. block.melter.description = Erhitzt Stein auf extrem hohe Temperaturen, um Lava zu erhalten. block.separator.description = Setzt Stein Wasserdruck aus, um verschiedene Mineralien im Stein freizulegen. -block.spore-press.description = Compresses spore pods into oil. +block.spore-press.description = Komprimiert Sporenhülsen zu Öl. block.pulverizer.description = Zertrümmert Stein zu Sand. Nützlich, wenn kein natürlicher Sand verfügbar ist. -block.coal-centrifuge.description = Solidifes oil into chunks of coal. +block.coal-centrifuge.description = Verfestigt Öl zu Kohlenstücken. block.incinerator.description = Vernichtet beliebige überschüssige Materialien oder Flüssigkeiten. -block.power-void.description = Verschlingt den kompletten übrigen Strom. Nur im Sandkasten verfügbar. -block.power-source.description = Erzeugt unendlich viel Strom. Nur im Sandkasten verfügbar. -block.item-source.description = Produziert unendlich items. Nur im Sandkasten verfügbar. -block.item-void.description = Zerstört Materialien, die hereingegeben werden, ohne Strom zu verbrauchen. Nur im Sandkasten verfügbar. -block.liquid-source.description = Produziert unendlich Flüssigkeiten. Nur im Sandkasten verfügbar. +block.power-void.description = Verschlingt den kompletten übrigen Strom. Nur im Sandkasten-Modus verfügbar. +block.power-source.description = Erzeugt unendlich viel Strom. Nur im Sandkasten-Modus verfügbar. +block.item-source.description = Produziert unendlich items. Nur im Sandkasten-Modus verfügbar. +block.item-void.description = Zerstört Materialien, die hereingegeben werden, ohne Strom zu verbrauchen. Nur im Sandkasten-Modus verfügbar. +block.liquid-source.description = Produziert unendlich Flüssigkeiten. Nur im Sandkasten-Modus verfügbar. block.copper-wall.description = Ein günstiger Verteidigungsblock.\nNützlich, um die Basis und Türme in den ersten Wellen zu beschützen. 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 = A moderately strong defensive block.\nProvides moderate protection from enemies. -block.titanium-wall-large.description = A moderately strong defensive block.\nProvides moderate protection from enemies.\nSpans multiple tiles. -block.thorium-wall.description = Ein starker Verteidigungsblock.\nGuter Schutz vor Feinden. -block.thorium-wall-large.description = Ein starker Verteidigungsblock.\nGuter 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. -block.phase-wall-large.description = Nicht so stark wie eine Thorium-Mauer, aber reflektiert Schüsse bis zu einer gewissen Stärke.\nBenötigt mehrere Kacheln. -block.surge-wall.description = Der stärkste Verteidigungsblock.\nHat eine kleine Chance, bei einem Schuss einen Lichtbogen in Richtung angreifer auszulösen. -block.surge-wall-large.description = Der stärkste Verteidigungsblock.\nHat eine kleine Chance, bei einem Schuss einen Lichtbogen in Richtung angreifer auszulösen.\nBenötigt mehrere Kacheln. -block.door.description = Eine kleine Tür, die durch darauf tippen geöffnet und geschlossen werden kann.\nGegner können durch geöffnete Türen schießen und laufen. -block.door-large.description = Eine kleine Tür, die durch darauf tippen geöffnet und geschlossen werden kann.\nGegner können durch geöffnete Türen schießen und laufen.\nBenötigt mehrere Kacheln. -block.mender.description = Periodically repairs blocks in its vicinity. Keeps defenses repaired in-between waves.\nOptionally uses silicon to boost range and efficiency. +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.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. +block.phase-wall-large.description = Nicht so stark, wie eine Thorium-Mauer, aber reflektiert Schüsse bis zu einer gewissen Stärke.\nBenötigt mehrere Kacheln. +block.surge-wall.description = Der stärkste Verteidigungsblock.\nHat eine kleine Chance, bei einem Schuss einen Lichtbogen in Richtung Angreifer auszulösen. +block.surge-wall-large.description = Der stärkste Verteidigungsblock.\nHat eine kleine Chance, bei einem Schuss einen Lichtbogen in Richtung Angreifer auszulösen.\nBenötigt mehrere Kacheln. +block.door.description = Eine kleine Tür, die durch Tippen geöffnet und geschlossen werden kann.\nGegner können durch geöffnete Türen schießen und laufen. +block.door-large.description = Eine kleine Tür, die durch Tippen geöffnet und geschlossen werden kann.\nGegner können durch geöffnete Türen schießen und laufen.\nBenötigt mehrere Kacheln. +block.mender.description = Repariert regelmäßig Blöcke in der Nähe. Hält die Abwehrkräfte zwischen den Wellen instand.\nVerwendet optional Silizium, um Reichweite und Effizienz zu steigern. block.mend-projector.description = Heilt zyklisch Blöcke in seiner Umgebung. -block.overdrive-projector.description = Erhöht die Geschwindigkeit von nahegelegenen Blöcken wie Bohrer und Förderbänder. -block.force-projector.description = Erzeugt ein sechseckiges Kraftfeld um sich selbst, durch das Blöcke und Einheiten vor Schaden beschützt werden. +block.overdrive-projector.description = Erhöht die Geschwindigkeit von nahegelegenen Blöcken, wie Bohrer und Förderbänder. +block.force-projector.description = Erzeugt ein sechseckiges Kraftfeld um sich herum, das Blöcke und Einheiten vor Schaden schützt. block.shock-mine.description = Beschädigt Gegner, die auf die Mine laufen. Für Gegener schwer zu sehen. block.conveyor.description = Basis-Transportblock. Bewegt Materialien vorwärts und lädt sie automatisch in Geschütztürme oder Verarbeitungsanlagen. Rotierbar. block.titanium-conveyor.description = Verbesserter Transportblock. Bewegt Materialien schneller als Standard-Förderbänder. @@ -948,10 +956,10 @@ block.bridge-conveyor.description = Verbesserter Transportblock. Erlaubt es, Mat 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.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 Router, der Materialien in bis zu sieben Richtungen gleichmäßig verteilt. +block.distributor.description = Ein weiterentwickelter Verteiler, der Materialien in bis zu sieben Richtungen gleichmäßig verteilt. block.overflow-gate.description = Ein Verteiler, der nur Materialien nach links oder rechts ausgibt, falls der Weg gerade aus blockiert ist. block.mass-driver.description = Ultimativer Transportblock. Sammelt mehrere Materialien und schießt sie zu einem verbundenen Massenbeschleuniger über eine große Reichweite. -block.mechanical-pump.description = Eine günstige, langsame Punkte, die keine Strom benötigt. +block.mechanical-pump.description = Eine günstige, langsame Pumpe, die keine Strom benötigt. block.rotary-pump.description = Eine fortgeschrittene Pumpe, die mithilfe von Strom doppelt so schnell pumpt. block.thermal-pump.description = Die ultimative Pumpe, dreimal so schnell wie eine mechanische Pumpe und die einzige Pumpe, die Lava fördern kann. block.conduit.description = Standard Flüssigkeits-Transportblock. Funktioniert wie ein Förderband, nur für Flüssigkeiten. Wird am Besten mit Extraktoren, Pumpen oder anderen Kanälen benutzt. @@ -961,20 +969,20 @@ block.liquid-tank.description = Speichert eine große Menge an Flüssigkeiten. V block.liquid-junction.description = Fungiert als Brücke über zwei kreuzende Kanäle. Nützlich in Situationen, in denen sich zwei Kanäle mit verschiedenen Flüssigkeiten kreuzen. block.bridge-conduit.description = Verbesserter Flüssigkeits-Transportblock. Erlaubt es, Flüssigkeiten über bis zu 3 Kacheln beliebigen Terrains oder Inhalts zu transportieren. block.phase-conduit.description = Verbesserter Flüssigkeits-Transportblock. Verwendet Strom, um Flüssigkeiten zu einem verbundenen Phasenkanal zu teleportieren. -block.power-node.description = Überträgt Strom zu verbundenen Knoten. Bis zu vier Stromquellen, -verbraucher oder -knoten können verbunden werden. Der Knoten erhält Strom von benachbarten Knoten und gibt Strom benachbarte Blöcke weiter. +block.power-node.description = Überträgt Strom zu verbundenen Knoten. Bis zu vier Stromquellen, -verbraucher oder -knoten können verbunden werden. Der Knoten erhält Strom von benachbarten Knoten und gibt Strom an benachbarte Blöcke weiter. block.power-node-large.description = Hat einen größeren Radius als der normale Stromknoten und verbindet bis zu sechs Stromquellen, -verbraucher oder -knoten. -block.surge-tower.description = An extremely long-range power node with fewer available connections. +block.surge-tower.description = Ein extrem weitreichender Netzknoten mit weniger verfügbaren Verbindungen. block.battery.description = Speichert Strom, solange ein Überschuss besteht, und gibt ihn bei Knappheit ab, solange Kapazität vorhanden ist. block.battery-large.description = Speichert sehr viel mehr Strom als eine normale Batterie. -block.combustion-generator.description = Generiert Stromg, indem Öl oder entzündliche Materialien verbrannt werden. +block.combustion-generator.description = Generiert Strom, indem Öl oder entzündliche Materialien verbrannt werden. block.thermal-generator.description = Erzeugt große Mengen Strom aus Lava. block.turbine-generator.description = Effizienter als ein Verbrennungsgenerator, benötigt jedoch zusätzlich Wasser. -block.differential-generator.description = Generates large amounts of energy. Utilizes the temperature difference between cryofluid and burning pyratite. +block.differential-generator.description = Erzeugt große Mengen an Energie. Nutzt den Temperaturunterschied zwischen Kryofluid und brennendem Pyratit. block.rtg-generator.description = Ein Radioisotopengenerator, der keine Kühlung benötigt, aber weniger Strom als ein Thorium-Reaktor liefert. block.solar-panel.description = Erzeugt kleine Mengen an Strom aus Sonnenenergie. block.solar-panel-large.description = Erzeugt viel mehr Strom als ein normales Solar Panel, ist aber auch sehr viel teurer in der Anschaffung. block.thorium-reactor.description = Erzeugt riesige Mengen Strom aus radioaktivem Thorium. Benötigt konstante Kühlung. Explodiert verheerend, wenn unzureichende Mengen an Kühlung vorhanden sind. -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.impact-reactor.description = Ein fortschrittlicher Generator, der in der Lage ist, bei höchster Effizienz enorme Mengen an Leistung zu erzeugen. Erfordert eine erhebliche Leistungsaufnahme, um den Prozess zu starten. block.mechanical-drill.description = Ein günstiger Bohrer. Wenn er auf passende Kacheln gesetzt wird, baut er unbegrenzt Erze des entsprechenden Typs mit geringer Geschwindigkeit ab. block.pneumatic-drill.description = Ein verbesserter Bohrer, der schneller ist und in der Lage ist, härtere Erze abzubauen, indem er von Luftdruck gebrauch macht. block.laser-drill.description = Erlaubt es, durch Lasertechnologie noch schneller zu bohren, benötigt aber Strom. Erlaubt zusätzlich das Abbauen von radioaktivem Thorium. @@ -982,17 +990,17 @@ block.blast-drill.description = Der ultimative Bohrer. Benötigt große Mengen a block.water-extractor.description = Extrahiert Wasser aus dem Boden. Verwende ihn, wenn es keinen See in der Nähe gibt. block.cultivator.description = Kultiviert den Boden mit Wasser, um Biomasse zu erzeugen. block.oil-extractor.description = Verwendet große Mengen an Strom, um Öl aus Sand zu extrahieren. Verwende ihn, wenn es keine direkte Ölquelle gibt. -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.core-shard.description = Die erste Version der Kernkapsel. Einmal zerstört, ist jeglicher Kontakt zur Region verloren. Lass das nicht zu. +block.core-foundation.description = Die zweite Version des Kerns. Besser gepanzert. Speichert mehr Ressourcen. +block.core-nucleus.description = Die dritte und letzte Version der Kernkapsel. Sehr gut gepanzert. Speichert enorme Mengen an Ressourcen. block.vault.description = Speichert eine große Menge an Materialien pro Typ. Benachbarte Container, Tresore und Basen werden zu einem Behälter zusammengefasst. Ein[LIGHT_GRAY] Entlader[] kann verwendet werden, um Materialien auszuladen. block.container.description = Speichert eine kleine Menge an Materialien pro Typ. Benachbarte Container, Tresore und Basen werden zu einem Behälter zusammengefasst. Ein[LIGHT_GRAY] Entlader[] kann verwendet werden, um Materialien auszuladen. block.unloader.description = Entlädt Materialien aus einem Container, Tresor oder einer Basis auf ein Förderband oder direkt in einen benachbarten Block. Der Typ des auszuladenden Materials kann durch darauf tippen verändert werden. -block.launch-pad.description = Launches batches of items without any need for a core launch. Unfinished. -block.launch-pad-large.description = An improved version of the launch pad. Stores more items. Launches more frequently. +block.launch-pad.description = Startet Stapel von Items, ohne dass ein Kernstart erforderlich ist. Unvollendet. +block.launch-pad-large.description = Eine verbesserte Version des Launchpads. Speichert weitere Items. Wird häufiger gestartet. block.duo.description = Ein kleiner, günstiger Geschützturm. -block.scatter.description = A medium-sized 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.scatter.description = Ein mittelgroßer Anti-Luft-Turm. Sprüht Blei- oder Schrottklumpen auf feindliche Einheiten. +block.scorch.description = Verbrennt alle Bodenfeinde in der Nähe. Hochwirksam im Nahbereich. block.hail.description = Ein kleiner Artillerie-Geschützturm. block.wave.description = Ein mittelgroßer Geschützturm, der flüssige Kugeln verschießt. block.lancer.description = Ein mittelgroßer Geschützturm, der sich auflädt und Elektrizitätsstrahlen verschießt. @@ -1004,7 +1012,7 @@ block.ripple.description = Ein großer Artillerie-Geschützturm, der mehrere Sch block.cyclone.description = Ein großer Schnellfeuer-Geschützturm. block.spectre.description = Ein großer Geschützturm, der zwei starke Schüsse gleichzeitig abfeuert. block.meltdown.description = Ein großer Geschützturm, der starke Strahlen mit großer Reichweite abfeuert. -block.draug-factory.description = Produces Draug mining drones. +block.draug-factory.description = Produziert Draug-Mining-Drohnen. block.spirit-factory.description = Produziert leichte Drohnen, die Erz abbauen und Blöcke reparieren können. block.phantom-factory.description = Produziert erweiterte Drohnen, die deutlich effizienter sind als Spirit-Drohnen. block.wraith-factory.description = Produziert schnelle Abfangjäger. @@ -1015,7 +1023,7 @@ block.crawler-factory.description = Produces fast self-destructing swarm units. block.titan-factory.description = Produziert fortgeschrittene, gepanzerte Bodeneinheiten. block.fortress-factory.description = Produziert schwere Artillerie-Bodeneinheiten. block.repair-point.description = Heilt durchgehend die nächste befreundete, beschädigte Einheit in der Umgebung. -block.dart-mech-pad.description = Provides transformation into a basic attack mech.\nUse by tapping while standing on it. +block.dart-mech-pad.description = Bietet die Umwandlung in einen einfachen Angriffs-Mech.\nVerwende es, indem du im Stehen darauf tippst. block.delta-mech-pad.description = Wechsle in einen schnellen, leicht gepanzerten Mech, der für Überfälle gemacht ist.\nVerwende das Pad, indem du doppelt darauf tippst, während du darauf bist. block.tau-mech-pad.description = Wechsle in einen Support-Mech, der befreundete Blöcke und Einheiten heilen kann.\nVerwende das Pad, indem du doppelt darauf tippst, während du darauf bist. block.omega-mech-pad.description = Wechsle in einen klobigen und gut gepanzerten Mech, der für Frontangriffe gemacht ist.\nVerwende das Pad, indem du doppelt darauf tippst, während du darauf bist. diff --git a/core/assets/bundles/bundle_es.properties b/core/assets/bundles/bundle_es.properties index cac68fda24..3c1cfd75d4 100644 --- a/core/assets/bundles/bundle_es.properties +++ b/core/assets/bundles/bundle_es.properties @@ -43,6 +43,7 @@ newgame = New Game none = minimap = Minimap close = Cerrar +website = Website quit = Salir maps = Mapas continue = Continuar @@ -71,6 +72,7 @@ server.kicked.nameEmpty = Tu nombre debe por lo menos contener un carácter o n server.kicked.idInUse = ¡Ya estás en el servidor! Conectarse con dos cuentas no está permitido. server.kicked.customClient = Este servidor no soporta versiones personalizadas. Descarga una versión oficial. server.kicked.gameover = Game over! +server.versions = Your version:[accent] {0}[]\nServer version:[accent] {1}[] host.info = El botón [accent]host[] hostea un servidor en el puerto [scarlet]6567[]. \nCualquier persona en la misma [LIGHT_GRAY]wifi o red local[] debería poder ver tu servidor en la lista de servidores.\n\nSi quieres que cualquier persona se pueda conectar de cualquier lugar por IP, la [accent]asignación de puertos[] es requerida.\n\n[LIGHT_GRAY]Nota: Si alguien experimenta problemas conectándose a tu partida LAN, asegúrate de permitir a Mindustry acceso a tu red local mediante la configuración de tu firewall. join.info = Aquí, puedes escribir la [accent]IP de un server[] para conectarte, o descubrir servidores de [accent]red local[] para conectarte.\nLAN y WAN es soportado para jugar en multijugador.\n\n[LIGHT_GRAY]Nota: No hay una lista automática global de servidores; si quieres conectarte por IP, tendrás que preguntarle al anfitrión por la IP. hostserver = Hostear Servidor @@ -154,7 +156,10 @@ cancel = Cancelar openlink = Abrir Enlace copylink = Copiar Enlace back = Atrás +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 = ¿Estás seguro de querer salir de la partida? +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]Cargando... saving = [accent]Guardando... wave = [accent]Horda {0} @@ -263,6 +268,7 @@ 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 @@ -302,6 +308,7 @@ ping = Ping: {0} ms language.restart = Por favor reinicie el juego para que los cambios del lenguaje surjan efecto. settings = Ajustes tutorial = Tutorial +tutorial.retake = Re-Take Tutorial editor = Editor mapeditor = Editor de Mapa donate = Donar @@ -315,8 +322,9 @@ bestwave = [LIGHT_GRAY]Best: {0} launch = Launch launch.title = Launch Successful launch.next = [LIGHT_GRAY]next opportunity at wave {0} -launch.unable = [scarlet]Unable to LAUNCH.[] Enemies. +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. @@ -352,6 +360,7 @@ 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. @@ -363,6 +372,7 @@ zone.overgrowth.description = This area is overgrown, closer to the source of th zone.tarFields.description = The outskirts of an oil production zone, between the mountains and desert. One of the few areas with usable tar reserves.\nAlthough abandoned, this area has some dangerous enemy forces nearby. Do not underestimate them.\n\n[lightgray]Research oil processing technology if possible. zone.desolateRift.description = An extremely dangerous zone. Plentiful resources, but little space. High risk of destruction. Leave as soon as possible. Do not be fooled by the long spacing between enemy attacks. zone.nuclearComplex.description = A former facility for the production and processing of thorium, reduced to ruins.\n[lightgray]Research the thorium and its many uses.\n\nThe enemy is present here in great numbers, constantly scouting for attackers. +zone.fungalPass.description = A transition area between high mountains and lower, spore-ridden lands. A small enemy reconnaissance base is located here.\nDestroy it.\nUse Dagger and Crawler units. Take out the two cores. zone.impact0078.description = zone.crags.description = settings.language = Lenguaje @@ -417,6 +427,7 @@ blocks.inaccuracy = Imprecisión blocks.shots = Disparos blocks.reload = Recarga blocks.ammo = Ammo +bar.drilltierreq = Better Drill Required bar.drillspeed = Drill Speed: {0}/s bar.efficiency = Efficiency: {0}% bar.powerbalance = Power: {0} @@ -491,6 +502,7 @@ setting.lasers.name = Mostrar Energía de los Láseres setting.pixelate.name = Pixelate [LIGHT_GRAY](may decrease performance) setting.minimap.name = Mostrar Minimapa setting.musicvol.name = Volumen de la Música +setting.ambientvol.name = Ambient Volume setting.mutemusic.name = Silenciar Musica setting.sfxvol.name = Volumen de los efectos de sonido setting.mutesound.name = Silenciar Sonido @@ -819,9 +831,10 @@ block.container.name = Contenedor block.launch-pad.name = Launch Pad block.launch-pad-large.name = Large Launch Pad team.blue.name = Azul -team.red.name = Rojo +team.crux.name = red +team.sharded.name = orange team.orange.name = Naranja -team.none.name = Gris +team.derelict.name = derelict team.green.name = Verde team.purple.name = Púrpura unit.spirit.name = Dron Espíritu @@ -839,27 +852,26 @@ unit.chaos-array.name = Chaos Array unit.eradicator.name = Eradicator unit.lich.name = Lich unit.reaper.name = Reaper -tutorial.begin = Tu objetivo aquí es erradicar el[LIGHT_GRAY] enemy[].\n\nComienza[accent]minando copper[]. Toca una veta de cobre cerca de tu núcleo para hacer esto. +tutorial.next = [lightgray] +tutorial.intro = You have entered the[scarlet] Mindustry Tutorial.[]\nBegin by[accent] mining copper[]. Tap a copper ore vein near your core to do this.\n\n[accent]{0}/{1} copper tutorial.drill = Minar manualmente es ineficiente.\nLos [accent]taladros pueden minar automáticamente.\nColoca uno en una veta de cobre. +tutorial.drill.mobile = Mining manually is inefficient.\n[accent]Drills []can mine automatically.\nTap the drill tab in the bottom right.\nSelect the[accent] mechanical drill[].\nPlace it on a copper vein by tapping, then press the[accent] checkmark[] below to confirm your selection.\nPress the[accent] X button[] to cancel placement. +tutorial.blockinfo = Each block has different stats. Each drill can only mine certain ores.\nTo check a block's info and stats,[accent] tap the "?" button while selecting it in the build menu.[]\n\n[accent]Access the Mechanical Drill's stats now.[] tutorial.conveyor = Los [accent]Conveyors[] se usan para transportar objetos al núcleo.\nConstruye una línea de transportadores del taladro al núcleo. -tutorial.morecopper = Se requiere más cobre.\n\nMínalo manualmente o coloca más taladros. +tutorial.conveyor.mobile = [accent]Conveyors[] are used to transport items to the core.\nMake a line of conveyors from the drill to the core.\n[accent] Place in a line by holding down your finger for a few seconds[] and dragging in a direction.\n\n[accent]{0}/{1} conveyors placed in line\n[accent]0/1 items delivered tutorial.turret = Se tiene que construir estructuras defensivas para repeler el [LIGHT_GRAY]enemy[].\nConstruye una torreta dúo cerca de tu base. tutorial.drillturret = Los dúos requieren[accent] copper ammo[]para disparar.\nColoca un taladro junto a la torre para darle cobre. +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 = El[LIGHT_GRAY] enemy[] se acerca.\n\nDefiende tu núcleo 2 hordas. Construye más torretas. -tutorial.lead = Hay más minerales disponibles. Explora y mna[accent] lead[].\n\n Desliza de tu unidad al núcleo para transferir recursos. -tutorial.smelter = El cobre y el plomo son metales débiles. Una[accent] Dense Alloy[] superior puede ser creada en una fundición.\n\nConstruye una. -tutorial.densealloy = La fundición ahora producirá la aleación.\nObtén algunas.\nMejora la producción si es necesario. -tutorial.siliconsmelter = El núcleo creará ahora un[accent] spirit drone[] para minar y reparar bloques.\n\nHay fábricas que crean otras unidades con[accent] silicona.\nCrea una fundición de silicona. -tutorial.silicondrill = La silicona requiere[accent] coal[] y[accent]sand[].\nEmpieza haciendo taladros. -tutorial.generator = Esta tecnología requiere energía.\nCrea un[accent] combustion generator[] para generarla. -tutorial.generatordrill = Los generadores de combustión requieren combustible.\nProporciónalo carbón de un taladro. -tutorial.node = La energía requiere ser transportada.\nCrea un[accent] power node[] junto al generador de combustión para transferir su energía. -tutorial.nodelink = La energía puede ser transferida mediante colocando bloques de energía y generadores juntos, o por nodos conectados.\n\nConecta energía tocando el nodo y seleccionando el generador y la fundición de silicona. -tutorial.silicon = La silicona está siendo producida. Obtén algo de silicona.\n\nEs recomendado mejorar la producción. -tutorial.daggerfactory = Construye una[accent] dagger mech factory[].\n\nEsto se usará para crear unidades terrestres de ataque. -tutorial.router = Las fábricas necesitan recursos para funcionar.\nCrea un enrutador para separar recursos del transportador. -tutorial.dagger = Conecta nodos de energía a la fábrica.\nUna vez las necesidades se cumplan, una unidad será creada.\n\nCrea taladros, generadores y transportadores según necesites. -tutorial.battle = El[LIGHT_GRAY] enemy[] ha revelado su núcleo.\nDestrúyelo con tu nave y tus unidades de combate. +tutorial.waves.mobile = The[lightgray] enemy[] approaches.\n\nDefend the core for 2 waves. Your ship will automatically fire at enemies.\nBuild more turrets and drills. Mine more copper. +tutorial.launch = Once you reach a specific wave, you are able to[accent] launch the core[], leaving your defenses behind and[accent] obtaining all the resources in your core.[]\nThese resources can then be used to research new technology.\n\n[accent]Press the launch button. item.copper.description = 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 = A super-tough glass compound. Extensively used for liquid distribution and storage. @@ -896,13 +908,9 @@ unit.crawler.description = A ground unit consisting of a stripped-down frame wit unit.titan.description = Una unidad blindada de terreno, avanzada. Ataca blancos de aire y de terreno. unit.fortress.description = Una unidad terrestre pesada de artillería. 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.chaos-array.description = -unit.eradicator.description = unit.wraith.description = Una unidad interceptora rápida. unit.ghoul.description = Una unidad bombardera pesada. Usa compuesto explosivo o pirotita como munición. unit.revenant.description = A heavy, hovering missile array. -unit.lich.description = -unit.reaper.description = block.graphite-press.description = Compresses chunks of coal into pure sheets of graphite. block.multi-press.description = An upgraded version of the graphite press. Employs water and power to process coal quickly and efficiently. block.silicon-smelter.description = Reduce arena con coque de alta pureza para producir silicona. diff --git a/core/assets/bundles/bundle_et.properties b/core/assets/bundles/bundle_et.properties index 8c7c1cf081..fe226ace03 100644 --- a/core/assets/bundles/bundle_et.properties +++ b/core/assets/bundles/bundle_et.properties @@ -4,6 +4,7 @@ contributors = Tõlkijad ja panustajad discord = Liituge Mindustry Discordi serveriga! link.discord.description = Mindustry ametlik Discordi server link.github.description = Github mängu koodiga +link.changelog.description = List of update changes link.dev-builds.description = Selle mängu pooleli olevad versioonid link.trello.description = Ametlik Trello leht plaanitud funktsioonide listiga link.itch.io.description = itch.io leht selle mängu arvuti versioonidega @@ -15,7 +16,6 @@ screenshot.invalid = Maailm liiga suur, tõenäoliselt pole piisavalt mälu salv gameover = Mäng Läbi gameover.pvp = [accent] {0}[] tiim võitis! highscore = [accent]Uus rekord! - stat.wave = Raund:[accent] {0} stat.enemiesDestroyed = Vaenlasi hävitatud:[accent] {0} stat.built = Ehitisi ehitatud:[accent] {0} @@ -23,10 +23,8 @@ stat.destroyed = Ehitisi hävitatud:[accent] {0} stat.deconstructed = Ehitisi lahtivõetud:[accent] {0} stat.delivered = Materjale kaasa võetud: stat.rank = Lõplik Hinne: [accent]{0} - placeline = Sa valisid ehitise\nSa saad[accent] panna neid sirges reas[] hoides näpuga all ja, siis viibates mõnes suunas.\n\n[scarlet] TEE SEDA removearea = Sa valisid hävitamise funktsiooni.\nsa saad[accent] hävitada[]hoides oma sõrme all mõne sekundi ja, siis viibates mõnele poole.\n\n[scarlet]TEE SEDA - launcheditems = [accent]Kaasa võetud materjalid map.delete = Kas oled kindel, et soovid kustutada "[accent]{0}[]". level.highscore = Rekord: [accent]{0} @@ -35,7 +33,6 @@ level.mode = Mänguviisi valik: showagain = Ära näita järgmine kord coreattack = < TUUMA RÜNNATAKSE! >\nMAYDAY MAYDAY nearpoint = [[ [scarlet]LAHKU VAENLASTE LANGEMISE ALALT VIIVITAMATA[] ]\npeatselt hävinemine -outofbounds = [[ PIIRIDEST VÄLJAS ]\n[]enese hävitamine {0} database = Tuuma Andmebaas savegame = Salvesta loadgame = Lae Mäng @@ -46,6 +43,7 @@ newgame = Uus Mäng none = minimap = Kaart close = Sule +website = Website quit = Lahku maps = Maailmad continue = Jätka @@ -74,6 +72,7 @@ server.kicked.nameEmpty = Sinu valitud nimi ei sobi. server.kicked.idInUse = Sa juba oled selles serveris! Kahe kasutajaga liitumine on keelatud. server.kicked.customClient = See server ei luba modifitseeritud mängu versioone. Lae alla ametlik versioon. server.kicked.gameover = Mäng läbi! +server.versions = Your version:[accent] {0}[]\nServer version:[accent] {1}[] host.info = [accent]Hosti[] nupp avab serveri pordil [scarlet]6567[]. \nIgaüks samas [LIGHT_GRAY]wifis või kohtvõrgus[] peaks nägema sinu serverit enda serverite nimekirjas.\n\nKui sa tahad, et inimesed saaksid kõikjalt IP aadressi abil liituda, [accent]portide edasisuunamine[] on vajalik.\n\n[LIGHT_GRAY]Märkus: Kui kellelgi on probleeme sinu LAN-mänguga liitumisel, siis tee kindlaks, et sul on Mindustry lubatud oma kohtvõrgus tulemüüri seadetes. join.info = Siin saad lisada [accent]serveri IP aadressi[] millega liituda, või leida [accent]kohtvõrgu[] servereid millega liituda.\nNii LAN kui ka WAN mitmikmängu toetatakse.\n\n[LIGHT_GRAY]Märkus: Ei ole olemas automaatset üldist serverite listi; kui sa tahad kellegagi liituda IP-aadressiga on sul vaja omaniku IP-aadressi. hostserver = Hosti Mäng @@ -98,7 +97,6 @@ server.admins = Administraatorid server.admins.none = Administraatoreid ei leitud! server.add = Lisa Server server.delete = Oled kindel, et soovid serveri kustutada? -server.hostname = Omanik: {0} server.edit = Kohanda Serverit server.outdated = [crimson]Aegunud Server![] server.outdated.client = [crimson]Aegunud Versioon[] @@ -158,14 +156,10 @@ cancel = Tühista openlink = Ava Link copylink = Kopeeri Link back = Tagasi +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 = Oled kindel, et soovid lahkuda? -changelog.title = Muudatused -changelog.loading = Getting changelog... -changelog.error.android = [accent]Note that the changelog sometimes does not work on Android 4.4 and below!\nThis is due to an internal Android bug. -changelog.error.ios = [accent]The changelog is currently not supported in iOS. -changelog.error = [scarlet]Error getting changelog!\nCheck your internet connection. -changelog.current = [yellow][[Current version] -changelog.latest = [accent][[Latest version] +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]Laadimine... saving = [accent]Salvestamine... wave = [accent]Raund {0} @@ -195,7 +189,9 @@ editor.author = Autor: editor.description = Kirjeldus: editor.waves = Raundid: editor.rules = Rules: +editor.generation = Generation: editor.ingame = Edit In-Game +editor.newmap = New Map waves.title = Raundid waves.remove = Eemalda waves.never = @@ -210,13 +206,13 @@ waves.copy = Copy to Clipboard waves.load = Load from Clipboard waves.invalid = Invalid waves in clipboard. waves.copied = Raundid kopeeritud. +waves.none = No enemies defined.\nNote that empty wave layouts will automatically be replaced with the default layout. editor.default = [LIGHT_GRAY] edit = Muuda... editor.name = Nimi: editor.spawn = Spawn Unit editor.removeunit = Remove Unit editor.teams = Tiimid -editor.elevation = Elevation 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. @@ -254,11 +250,32 @@ 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.selectmap = Select a map to load: +toolmode.replace = Replace +toolmode.replace.description = Draws only on solid blocks. +toolmode.replaceall = Replace All +toolmode.replaceall.description = Replace all blocks in map. +toolmode.orthogonal = Orthogonal +toolmode.orthogonal.description = Draws only orthogonal lines. +toolmode.square = Square +toolmode.square.description = Square brush. +toolmode.eraseores = Erase Ores +toolmode.eraseores.description = Erase only ores. +toolmode.fillteams = Fill Teams +toolmode.fillteams.description = Fill teams instead of blocks. +toolmode.drawteams = Draw Teams +toolmode.drawteams.description = Draw teams instead of blocks. filters.empty = [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 = Maak filter.rivernoise = River Noise +filter.mirror = Mirror +filter.clear = Clear +filter.option.ignore = Ignore filter.scatter = Scatter filter.terrain = Terrain filter.option.scale = Scale @@ -268,16 +285,21 @@ 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 = Plokk filter.option.floor = Põrand +filter.option.flooronto = Target Floor filter.option.wall = Sein filter.option.ore = Maak filter.option.floor2 = Teine Korrus filter.option.threshold2 = Secondary Threshold +filter.option.radius = Radius +filter.option.percentile = Percentile width = Laius: height = Kõrgus: menu = Menüü play = Mängi +campaign = Campaign load = Lae save = Salvesta fps = FPS: {0} @@ -286,6 +308,7 @@ ping = Ping: {0}ms language.restart = Please restart your game for the language settings to take effect. settings = Sätted tutorial = Õpetus +tutorial.retake = Re-Take Tutorial editor = Editor mapeditor = Map Editor donate = Anneta @@ -299,8 +322,9 @@ bestwave = [LIGHT_GRAY]Best Wave: {0} launch = < LAUNCH > launch.title = Launch Successful launch.next = [LIGHT_GRAY]next opportunity at wave {0} -launch.unable = [scarlet]Unable to LAUNCH.[] {0} Enemies. +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]Unlock configuring loadout: Wave {0}. @@ -308,6 +332,9 @@ 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 = Lisa... boss.health = Bossi Elud connectfail = [crimson]Failed to connect to server:\n\n[accent]{0} @@ -319,6 +346,7 @@ 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 @@ -329,7 +357,24 @@ zone.desolateRift.name = Desolate Rift zone.nuclearComplex.name = Nuclear Production Complex zone.overgrowth.name = Overgrowth zone.tarFields.name = Tar Fields - +zone.saltFlats.name = Salt Flats +zone.impact0078.name = Impact 0078 +zone.crags.name = Crags +zone.fungalPass.name = Fungal Pass +zone.groundZero.description = The optimal location to begin once more. Low enemy threat. Few resources.\nGather as much lead and copper as possible.\nMove on. +zone.frozenForest.description = Even here, closer to mountains, the spores have spread. The frigid temperatures cannot contain them forever.\n\nBegin the venture into power. Build combustion generators. Learn to use menders. +zone.desertWastes.description = These wastes are vast, unpredictable, and criss-crossed with derelict sector structures.\nCoal is present in the region. Burn it for power, or synthesize graphite.\n\n[lightgray]This landing location cannot be guaranteed. +zone.saltFlats.description = On the outskirts of the desert lie the Salt Flats. Few resources can be found in this location.\n\nThe enemy has erected a resource storage complex here. Eradicate their core. Leave nothing standing. +zone.craters.description = Water has accumulated in this crater, relic of the old wars. Reclaim the area. Collect sand. Smelt metaglass. Pump water to cool turrets and drills. +zone.ruinousShores.description = Past the wastes, is the shoreline. Once, this location housed a coastal defense array. Not much of it remains. Only the most basic defense structures have remained unscathed, everything else reduced to scrap.\nContinue the expansion outwards. Rediscover the technology. +zone.stainedMountains.description = Further inland lie the mountains, yet untainted by spores.\nExtract the abundant titanium in this area. Learn how to use it.\n\nThe enemy presence is greater here. Do not give them time to send their strongest units. +zone.overgrowth.description = This area is overgrown, closer to the source of the spores.\nThe enemy has established an outpost here. Build Titan units. Destroy it. Reclaim that which was lost. +zone.tarFields.description = The outskirts of an oil production zone, between the mountains and desert. One of the few areas with usable tar reserves.\nAlthough abandoned, this area has some dangerous enemy forces nearby. Do not underestimate them.\n\n[lightgray]Research oil processing technology if possible. +zone.desolateRift.description = An extremely dangerous zone. Plentiful resources, but little space. High risk of destruction. Leave as soon as possible. Do not be fooled by the long spacing between enemy attacks. +zone.nuclearComplex.description = A former facility for the production and processing of thorium, reduced to ruins.\n[lightgray]Research the thorium and its many uses.\n\nThe enemy is present here in great numbers, constantly scouting for attackers. +zone.fungalPass.description = A transition area between high mountains and lower, spore-ridden lands. A small enemy reconnaissance base is located here.\nDestroy it.\nUse Dagger and Crawler units. Take out the two cores. +zone.impact0078.description = +zone.crags.description = settings.language = Keel settings.reset = Reset to Defaults settings.rebind = Rebind @@ -343,17 +388,19 @@ settings.clearall.confirm = [scarlet]WARNING![]\nThis will clear all data, inclu settings.clearunlocks = Clear Unlocks settings.clearall = Clear All paused = [accent]< Paused > -yes =Jah +yes = Jah no = Ei 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 = Sisend blocks.output = Väljund blocks.booster = Booster block.unknown = [LIGHT_GRAY]??? blocks.powercapacity = Power Capacity blocks.powershot = Power/Shot +blocks.damage = Damage blocks.targetsair = Targets Air blocks.targetsground = Targets Ground blocks.itemsmoved = Move Speed @@ -380,7 +427,7 @@ blocks.inaccuracy = Inaccuracy blocks.shots = Shots blocks.reload = Shots/Second blocks.ammo = Laskemoon - +bar.drilltierreq = Better Drill Required bar.drillspeed = Drill Speed: {0}/s bar.efficiency = Efficiency: {0}% bar.powerbalance = Power: {0}/s @@ -393,7 +440,6 @@ bar.power = Energia bar.progress = Build Progress bar.spawned = Units: {0}/{1} bullet.damage = [stat]{0}[lightgray] damage - bullet.splashdamage = [stat]{0}[lightgray] area dmg ~[stat] {1}[lightgray] tiles bullet.incendiary = [stat]incendiary bullet.homing = [stat]homing @@ -404,7 +450,6 @@ bullet.freezing = [stat]freezing bullet.tarred = [stat]tarred bullet.multiplier = [stat]{0}[lightgray]x ammo multiplier bullet.reload = [stat]{0}[lightgray]x fire rate - unit.blocks = blocks unit.powersecond = power units/second unit.liquidsecond = liquid units/second @@ -426,14 +471,17 @@ category.shooting = Tulistamine category.optional = Optional Enhancements setting.landscape.name = Lock Landscape setting.shadows.name = Varjud +setting.linear.name = Linear Filtering setting.animatedwater.name = Animeeritud Vesi setting.animatedshields.name = Animeeritud Kilbid setting.antialias.name = Antialias[LIGHT_GRAY] (requires restart)[] setting.indicators.name = Enemy/Ally Indicators setting.autotarget.name = Auto-Target +setting.keyboard.name = Mouse+Keyboard Controls setting.fpscap.name = Max FPS setting.fpscap.none = None setting.fpscap.text = {0} FPS +setting.uiscale.name = UI Scaling[lightgray] (require restart)[] setting.swapdiagonal.name = Always Diagonal Placement setting.difficulty.training = Treening setting.difficulty.easy = Lihtne @@ -454,13 +502,18 @@ setting.lasers.name = Näita Energia Lasereid setting.pixelate.name = Pixelate[LIGHT_GRAY] (disables animations) setting.minimap.name = Näita Kaarti setting.musicvol.name = Heli tase +setting.ambientvol.name = Ambient Volume setting.mutemusic.name = Vaigista muusika setting.sfxvol.name = SFX Volume setting.mutesound.name = Mute Sound setting.crashreport.name = Send Anonymous Crash Reports setting.chatopacity.name = Chat Opacity setting.playerchat.name = Display In-Game Chat +uiscale.reset = UI scale has been changed.\nPress "OK" to confirm this scale.\n[scarlet]Reverting and exiting in[accent] {0}[] seconds... +uiscale.cancel = Cancel & Exit +setting.bloom.name = Bloom keybind.title = Rebind Keys +keybinds.mobile = [scarlet]Most keybinds here are not functional on mobile. Only basic movement is supported. category.general.name = General category.view.name = View category.multiplayer.name = Multiplayer @@ -506,10 +559,10 @@ mode.pvp.description = Fight against other players locally. mode.attack.name = Attack mode.attack.description = Destroy the enemy's base. No waves. mode.custom = Kohandatud Reeglid - rules.infiniteresources = Infinite Resources rules.wavetimer = Wave Timer rules.waves = Raundi +rules.attack = Attack Mode rules.enemyCheat = Infinite AI (Red Team) Resources rules.unitdrops = Unit Drops rules.unitbuildspeedmultiplier = Unit Production Speed Multiplier @@ -532,43 +585,27 @@ rules.title.resourcesbuilding = Resources & Building rules.title.player = Mängijad rules.title.enemy = Vastased rules.title.unit = Units - content.item.name = Asjad content.liquid.name = Vedelikud content.unit.name = Units content.block.name = Plokid content.mech.name = Mechs item.copper.name = Vask -item.copper.description = A useful structure material. Used extensively in all types of blocks. item.lead.name = Plii -item.lead.description = A basic starter material. Used extensively in electronics and liquid transportation blocks. item.coal.name = Süsi -item.coal.description = A common and readily available fuel. item.graphite.name = Grafiit item.titanium.name = Titaanium -item.titanium.description = A rare super-light metal used extensively in liquid transportation, drills and aircraft. item.thorium.name = Toorium -item.thorium.description = A dense, radioactive metal used as structural support and nuclear fuel. item.silicon.name = Silikoon -item.silicon.description = An extremely useful semiconductor, with applications in solar panels and many complex electronics. item.plastanium.name = Plastaanium -item.plastanium.description = A light, ductile material used in advanced aircraft and fragmentation ammunition. item.phase-fabric.name = Faasriie -item.phase-fabric.description = A near-weightless substance used in advanced electronics and self-repairing technology. item.surge-alloy.name = Surge Alloy -item.surge-alloy.description = An advanced alloy with unique electrical properties. item.spore-pod.name = Spore Pod -item.spore-pod.description = Used for conversion into oil, explosives and fuel. item.sand.name = Liiv -item.sand.description = A common material that is used extensively in smelting, both in alloying and as a flux. item.blast-compound.name = Blast Compound -item.blast-compound.description = A volatile compound used in bombs and explosives. While it can burned as fuel, this is not advised. item.pyratite.name = Pyratite -item.pyratite.description = An extremely flammable substance used in incendiary weapons. item.metaglass.name = Metaglass -item.metaglass.description = A super-tough glass compound. Extensively used for liquid distribution and storage. item.scrap.name = Scrap -item.scrap.description = Leftover remnants of old structures and units. Contains trace amounts of many different metals. liquid.water.name = Vesi liquid.slag.name = Slag liquid.oil.name = Nafta @@ -576,31 +613,23 @@ liquid.cryofluid.name = Cryofluid mech.alpha-mech.name = Alpha mech.alpha-mech.weapon = Heavy Repeater mech.alpha-mech.ability = Regeneration -mech.alpha-mech.description = The standard mech. Has decent speed and damage output. mech.delta-mech.name = Delta mech.delta-mech.weapon = Arc Generator mech.delta-mech.ability = Discharge -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.name = Tau mech.tau-mech.weapon = Restruct Laser mech.tau-mech.ability = Repair Burst -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.name = Omega mech.omega-mech.weapon = Swarm Missiles mech.omega-mech.ability = Armored Configuration -mech.omega-mech.description = A bulky and well-armored mech, made for front-line assaults. Its armor ability can block up to 90% of incoming damage. mech.dart-ship.name = Dart mech.dart-ship.weapon = Repeater -mech.dart-ship.description = The standard ship. Reasonably fast and light, but has little offensive capability and low mining speed. mech.javelin-ship.name = Javelin -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 ability and missiles. mech.javelin-ship.weapon = Burst Missiles mech.javelin-ship.ability = Discharge Booster mech.trident-ship.name = Trident -mech.trident-ship.description = A heavy bomber. Reasonably well armored. mech.trident-ship.weapon = Bomb Bay mech.glaive-ship.name = Glaive -mech.glaive-ship.description = A large, well-armored gunship. Equipped with an incendiary repeater. Good acceleration and maximum speed. mech.glaive-ship.weapon = Flame Repeater item.explosiveness = [LIGHT_GRAY]Explosiveness: {0}% item.flammability = [LIGHT_GRAY]Flammability: {0}% @@ -617,7 +646,7 @@ mech.buildspeed = [LIGHT_GRAY]Building Speed: {0}% liquid.heatcapacity = [LIGHT_GRAY]Heat Capacity: {0} liquid.viscosity = [LIGHT_GRAY]Viscosity: {0} liquid.temperature = [LIGHT_GRAY]Temperature: {0} - +block.sand-boulder.name = Sand Boulder block.grass.name = Grass block.salt.name = Salt block.saltrocks.name = Salt Rocks @@ -628,6 +657,7 @@ block.spore-pine.name = Spore Pine block.sporerocks.name = Spore Rocks block.rock.name = Kivi block.snowrock.name = Lumekivi +block.snow-pine.name = Snow Pine block.shale.name = Shale block.shale-boulder.name = Shale Boulder block.moss.name = Moss @@ -640,7 +670,6 @@ block.scrap-wall-huge.name = Huge Scrap Wall block.scrap-wall-gigantic.name = Gigantic Scrap Wall block.thruster.name = Thruster block.kiln.name = Kiln -block.kiln.description = Smelts sand and lead into metaglass. Requires small amounts of power. block.graphite-press.name = Graphite Press block.multi-press.name = Multi-Press block.constructing = {0} [LIGHT_GRAY](Constructing) @@ -709,9 +738,7 @@ block.junction.name = Junction block.router.name = Router block.distributor.name = Distributor block.sorter.name = Sorter -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.overflow-gate.name = Overflow Gate -block.overflow-gate.description = A combination splitter and router that only outputs to the left and right if the front path is blocked. block.silicon-smelter.name = Silicon Smelter block.phase-weaver.name = Phase Weaver block.pulverizer.name = Pulverizer @@ -763,6 +790,7 @@ block.blast-mixer.name = Blast Mixer block.solar-panel.name = Solar Panel block.solar-panel-large.name = Large Solar Panel block.oil-extractor.name = Oil Extractor +block.draug-factory.name = Draug Miner Drone Factory block.spirit-factory.name = Spirit Drone Factory block.phantom-factory.name = Phantom Drone Factory block.wraith-factory.name = Wraith Fighter Factory @@ -801,58 +829,113 @@ block.spectre.name = Spectre block.meltdown.name = Meltdown block.container.name = Container block.launch-pad.name = Launch Pad -block.launch-pad.description = Launches batches of items without any need for a core launch. Unfinished. block.launch-pad-large.name = Large Launch Pad team.blue.name = sinine -team.red.name = punane +team.crux.name = red +team.sharded.name = orange team.orange.name = oranž -team.none.name = hall +team.derelict.name = derelict team.green.name = roheline team.purple.name = lilla unit.spirit.name = Spirit Drone -unit.spirit.description = The starter drone unit. Spawns in the core by default. Automatically mines ores and repairs blocks. +unit.draug.name = Draug Miner Drone unit.phantom.name = Phantom Drone -unit.phantom.description = An advanced drone unit. Automatically mines ores and repairs blocks. Significantly more effective than a spirit drone. unit.dagger.name = Dagger -unit.dagger.description = A basic ground unit. Useful in swarms. unit.crawler.name = Crawler unit.titan.name = Titan -unit.titan.description = An advanced, armored ground unit. Attacks both ground and air targets. unit.ghoul.name = Ghoul Bomber -unit.ghoul.description = A heavy carpet bomber. unit.wraith.name = Wraith Fighter -unit.wraith.description = A fast, hit-and-run interceptor unit. unit.fortress.name = Fortress -unit.fortress.description = A heavy artillery ground unit. unit.revenant.name = Revenant unit.eruptor.name = Eruptor unit.chaos-array.name = Chaos Array unit.eradicator.name = Eradicator unit.lich.name = Lich unit.reaper.name = Reaper -tutorial.begin = Your mission here is to eradicate the[LIGHT_GRAY] enemy[].\n\nBegin by[accent] mining copper[]. Tap a copper ore vein near your core to do this. +tutorial.next = [lightgray] +tutorial.intro = You have entered the[scarlet] Mindustry Tutorial.[]\nBegin by[accent] mining copper[]. Tap a copper ore vein near your core to do this.\n\n[accent]{0}/{1} copper tutorial.drill = Mining manually is inefficient.\n[accent]Drills []can mine automatically.\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.[] tutorial.conveyor = [accent]Conveyors[] are used to transport items to the core.\nMake a line of conveyors from the drill to the core. -tutorial.morecopper = More copper is required.\n\nEither mine it manually, or place more drills. +tutorial.conveyor.mobile = [accent]Conveyors[] are used to transport items to the core.\nMake a line of conveyors from the drill to the core.\n[accent] Place in a line by holding down your finger for a few seconds[] and dragging in a direction.\n\n[accent]{0}/{1} conveyors placed in line\n[accent]0/1 items delivered tutorial.turret = Defensive structures must be built to repel the[LIGHT_GRAY] enemy[].\nBuild a duo turret near your base. tutorial.drillturret = Duo turrets require[accent] copper ammo []to shoot.\nPlace a drill next to the turret to supply it with mined copper. +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[LIGHT_GRAY] enemy[] approaches.\n\nDefend your core for 2 waves. Build more turrets. -tutorial.lead = More ores are available. Explore and mine[accent] lead[].\n\nDrag from your unit to the core to transfer resources. -tutorial.smelter = Copper and lead are weak metals.\nSuperior[accent] Dense Alloy[] can be created in a smelter.\n\nBuild one. -tutorial.densealloy = The smelter will now produce alloy.\nGet some.\nImprove the production if necessary. -tutorial.siliconsmelter = The core will now create a[accent] spirit drone[] for mining and repairing blocks.\n\nFactories for other units can be created with [accent] silicon.\nMake a silicon smelter. -tutorial.silicondrill = Silicon requires[accent] coal[] and[accent] sand[].\nStart by making drills. -tutorial.generator = This technology requires power.\nCreate a[accent] combustion generator[] for it. -tutorial.generatordrill = Combustion generators need fuel.\nFuel it with coal from a drill. -tutorial.node = Power requires transport.\nCreate a[accent] power node[] next to your combustion generator to transfer its power. -tutorial.nodelink = Power can be transferred through contacting power blocks and generators, or by linked power nodes.\n\nLink power by tapping the node and selecting the generator and silicon smelter. -tutorial.silicon = Silicon is being produced. Get some.\n\nImproving the production system is advised. -tutorial.daggerfactory = Construct a[accent] dagger mech factory.[]\n\nThis will be used to create attack mechs. -tutorial.router = Factories need resources to function.\nCreate a router to split conveyor resources. -tutorial.dagger = Link power nodes to the factory.\nOnce requirements are met, a mech will be created.\n\nCreate more drills, generators and conveyors as necessary. -tutorial.battle = The[LIGHT_GRAY] enemy[] has revealed their core.\nDestroy it with your unit and dagger mechs. +tutorial.waves.mobile = The[lightgray] enemy[] approaches.\n\nDefend the core for 2 waves. Your ship will automatically fire at enemies.\nBuild more turrets and drills. Mine more copper. +tutorial.launch = Once you reach a specific wave, you are able to[accent] launch the core[], leaving your defenses behind and[accent] obtaining all the resources in your core.[]\nThese resources can then be used to research new technology.\n\n[accent]Press the launch button. +item.copper.description = A useful structure material. Used extensively in all types of blocks. +item.lead.description = A basic starter material. Used extensively in electronics and liquid transportation blocks. +item.metaglass.description = A super-tough glass compound. Extensively used for liquid distribution and storage. +item.graphite.description = Mineralized carbon, used for ammunition and electrical insulation. +item.sand.description = A common material that is used extensively in smelting, both in alloying and as a flux. +item.coal.description = A common and readily available fuel. +item.titanium.description = A rare super-light metal used extensively in liquid transportation, drills and aircraft. +item.thorium.description = A dense, radioactive metal used as structural support and nuclear fuel. +item.scrap.description = Leftover remnants of old structures and units. Contains trace amounts of many different metals. +item.silicon.description = An extremely useful semiconductor, with applications in solar panels and many complex electronics. +item.plastanium.description = A light, ductile material used in advanced aircraft and fragmentation ammunition. +item.phase-fabric.description = A near-weightless substance used in advanced electronics and self-repairing technology. +item.surge-alloy.description = An advanced alloy with unique electrical properties. +item.spore-pod.description = Used for conversion into oil, explosives and fuel. +item.blast-compound.description = A volatile compound used in bombs and explosives. While it can burned as fuel, this is not advised. +item.pyratite.description = An extremely flammable substance used in incendiary weapons. +liquid.water.description = Sageli kasutatud jahutamiseks ja jäätme töötluseks. +liquid.slag.description = Various different types of molten metal mixed together. Can be separated into its constituent minerals, or sprayed at enemy units as a weapon. +liquid.oil.description = Seda saab põleteda, õhku lasta või kasutada jahutamiseks. +liquid.cryofluid.description = Kõige efektiivsem vedelik asjade maha jahutamiseks. +mech.alpha-mech.description = The standard mech. Has decent speed and damage output. +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 ability can block up to 90% of incoming damage. +mech.dart-ship.description = The standard 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 ability and missiles. +mech.trident-ship.description = A heavy bomber. Reasonably well armored. +mech.glaive-ship.description = A large, well-armored gunship. Equipped with an incendiary repeater. Good acceleration and maximum speed. +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 = The starter drone unit. Spawns in the core by default. Automatically mines ores and repairs blocks. +unit.phantom.description = An advanced drone unit. Automatically mines ores and repairs blocks. Significantly more effective than a spirit drone. +unit.dagger.description = A basic ground unit. Useful 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. +unit.fortress.description = A heavy artillery ground unit. +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. +unit.ghoul.description = A heavy carpet bomber. +unit.revenant.description = A heavy, hovering missile array. +block.graphite-press.description = Compresses chunks of coal into pure sheets of graphite. +block.multi-press.description = An upgraded version of the graphite press. Employs water and power to process coal quickly and efficiently. +block.silicon-smelter.description = Reduces sand with highly pure coal in order to produce silicon. +block.kiln.description = Smelts sand and lead into metaglass. Requires small amounts of power. +block.plastanium-compressor.description = Produces plastanium from oil and titanium. +block.phase-weaver.description = Produces phase fabric from radioactive thorium and high amounts of sand. +block.alloy-smelter.description = Produces surge alloy from titanium, lead, silicon and copper. +block.cryofluidmixer.description = Combines water and titanium into cryofluid which is much more efficient for cooling. +block.blast-mixer.description = Uses oil for transforming pyratite into the less flammable but more explosive blast compound. +block.pyratite-mixer.description = Mixes coal, lead and sand into highly flammable pyratite. +block.melter.description = Melts down scrap into slag for further processing or usage in turrets. +block.separator.description = Extracts useful minerals from slag. +block.spore-press.description = Compresses spore pods into oil. +block.pulverizer.description = Crushes scrap into sand. Useful when there is a lack of natural sand. +block.coal-centrifuge.description = Solidifes oil into chunks of coal. +block.incinerator.description = Gets rid of any excess item or liquid. +block.power-void.description = Hävitab kõik materjalid, mis sinna lähevad. Ainult liivakastis. +block.power-source.description = Annab välja lõpmatult elektrit. Ainult liivakastis. +block.item-source.description = Annab välja lõpmatult materjale. Ainult liivakastis. +block.item-void.description = Hävitab kõik materjalid, mis sinna lähevad elektrit kasutamata. Ainult liivakastis. +block.liquid-source.description = Annab välja lõpmatult vedelikke. Ainult liivakastis. block.copper-wall.description = A cheap defensive block.\nUseful for protecting the core and turrets in the first few waves. block.copper-wall-large.description = A cheap defensive block.\nUseful for protecting the core and turrets in the first few waves.\nSpans multiple tiles. +block.titanium-wall.description = A moderately strong defensive block.\nProvides moderate protection from enemies. +block.titanium-wall-large.description = A moderately strong defensive block.\nProvides moderate protection from enemies.\nSpans multiple tiles. block.thorium-wall.description = A strong defensive block.\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. @@ -861,54 +944,45 @@ block.surge-wall.description = The strongest defensive block.\nHas a small chanc block.surge-wall-large.description = The strongest defensive block.\nHas a small chance of triggering lightning towards the attacker.\nSpans multiple tiles. block.door.description = A small door that can be opened and closed by tapping on it.\nIf opened, enemies can shoot and move through. block.door-large.description = A large door that can be opened and closed by tapping on it.\nIf opened, enemies can shoot and move through.\nSpans multiple tiles. +block.mender.description = Periodically repairs blocks in its vicinity. Keeps defenses repaired in-between waves.\nOptionally uses silicon to boost range and efficiency. block.mend-projector.description = Periodically heals blocks in its vicinity. block.overdrive-projector.description = Increases the speed of nearby buildings like drills and conveyors. block.force-projector.description = Creates a hexagonal force field around itself, protecting buildings and units inside from damage through bullets. block.shock-mine.description = Damages enemies stepping on the mine. Nearly invisible to the enemy. -block.duo.description = A small, cheap turret. Useful against ground units. -block.scatter.description = A medium-sized anti-air turret. Sprays clumps of lead or scrap flak at enemy units. -block.arc.description = A small close-range turret which shoots electricity in a random arc towards the enemy. -block.hail.description = A small artillery turret. -block.lancer.description = A medium-sized turret which shoots charged electricity beams. -block.wave.description = A medium-sized rapid-fire turret which shoots liquid bubbles. -block.salvo.description = A medium-sized turret which fires shots in salvos. -block.swarmer.description = A medium-sized turret which shoots burst missiles. -block.ripple.description = A large artillery turret which fires several shots simultaneously. -block.cyclone.description = A large rapid fire turret. -block.fuse.description = A large turret which shoots powerful short-range beams. -block.spectre.description = A large turret which shoots two powerful bullets at once. -block.meltdown.description = A large turret which shoots powerful long-range beams. block.conveyor.description = Basic item transport block. Moves items forward and automatically deposits them into turrets or crafters. Rotatable. block.titanium-conveyor.description = Advanced item transport block. Moves items faster than standard conveyors. -block.phase-conveyor.description = Advanced item transport block. Uses power to teleport items to a connected phase conveyor over several tiles. 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 = Arenenud transpordi ehitis. Lubab transportida materjale üle iga pinnase ja ehitise 3 ruudu kaugusele. +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 = Võtab vastu materjale ühest suunast ja annab neid võrdselt välja kolmes suunas. Kasulik ühest allikast tulevate materjalide jagamisel mitmeks. +block.distributor.description = Arenenud jagaja, mis jagab materjale kuni 7 suunas. +block.overflow-gate.description = A combination splitter and router that only outputs to the left and right if the front path is blocked. block.mass-driver.description = Ultimate item transport block. Collects several items and then shoots them to another mass driver over a long range. -block.silicon-smelter.description = Reduces sand with highly pure coal in order to produce silicon. -block.plastanium-compressor.description = Produces plastanium from oil and titanium. -block.phase-weaver.description = Produces phase fabric from radioactive thorium and high amounts of sand. -block.alloy-smelter.description = Produces surge alloy from titanium, lead, silicon and copper. -block.pulverizer.description = Crushes scrap into sand. Useful when there is a lack of natural sand. -block.pyratite-mixer.description = Mixes coal, lead and sand into highly flammable pyratite. -block.blast-mixer.description = Uses oil for transforming pyratite into the less flammable but more explosive blast compound. -block.cryofluidmixer.description = Combines water and titanium into cryofluid which is much more efficient for cooling. -block.melter.description = Melts down scrap into slag for further processing or usage in turrets. -block.incinerator.description = Gets rid of any excess item or liquid. -block.spore-press.description = Compresses spore pods into oil. -block.separator.description = Extracts useful minerals from slag. +block.mechanical-pump.description = Odav ja aeglane pump, mis ei vaja elektrit. +block.rotary-pump.description = Kahekordistab kiiruse kasutades elektrit. +block.thermal-pump.description = Ülim pump. +block.conduit.description = Basic liquid transport block. Works like a conveyor, but with liquids. Best used with extractors, pumps or other conduits. +block.pulse-conduit.description = 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 = Hoiustab suure hulga vedelikke. Use it for creating buffers when there is a non-constant demand of materials or as a safeguard for cooling vital blocks. +block.liquid-junction.description = Töötab kui sild kahele ristuvale torule. Kasulik situatsioonides kui kaks erinevat toru viivad kahte erinevat vedelikku eri kohtadesse. +block.bridge-conduit.description = Arenenud vedeliku transport. Lubab transportida vedelikke üle iga pinnase ja ehitise 3 ruudu kaugusele. +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. Up to four power sources, sinks or nodes can be connected. The node will receive power from or supply power to any adjacent blocks. block.power-node-large.description = Has a larger radius than the power node and connects to up to six power sources, sinks or nodes. +block.surge-tower.description = An extremely long-range power node with fewer available connections. block.battery.description = Stores power whenever there is an abundance and provides power whenever there is a shortage, as long as there is capacity left. block.battery-large.description = Stores much more power than a regular battery. block.combustion-generator.description = Generates power by burning oil or flammable materials. -block.turbine-generator.description = More efficient than a combustion generator, but requires additional water. block.thermal-generator.description = Generates power when placed in hot locations. +block.turbine-generator.description = More efficient than a combustion generator, but requires additional water. +block.differential-generator.description = Generates large amounts of energy. Utilizes the temperature difference between cryofluid and burning pyratite. +block.rtg-generator.description = A radioisotope thermoelectric generator which does not require cooling but provides less power than a thorium reactor. block.solar-panel.description = Provides a small amount of power from the sun. block.solar-panel-large.description = Provides much better power supply than a standard solar panel, but is also much more expensive to build. block.thorium-reactor.description = Generates huge amounts of power from highly radioactive 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.rtg-generator.description = A radioisotope thermoelectric generator which does not require cooling but provides less power than a thorium reactor. -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 on the unloader. -block.container.description = Stores a small amount of items of each type. An[LIGHT_GRAY] unloader[] can be used to retrieve items from the container. -block.vault.description = Stores a large amount of items of each type. An[LIGHT_GRAY] unloader[] can be used to retrieve items from the vault. +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. block.pneumatic-drill.description = An improved drill which is faster and able to process harder materials by making use of air pressure. block.laser-drill.description = Allows drilling even faster through laser technology, but requires power. Additionally, radioactive thorium can be retrieved with this drill. @@ -916,40 +990,43 @@ block.blast-drill.description = The ultimate drill. Requires large amounts of po block.water-extractor.description = Extracts water from the ground. Use it when there is no lake nearby. block.cultivator.description = Cultivates tiny concentrations of spores into industry-ready pods. block.oil-extractor.description = Uses large amounts of power in order to extract oil from sand. Use it when there is no direct source of oil nearby. -block.trident-ship-pad.description = Leave your current vessel and change into a reasonably well armored heavy bomber.\nUse the pad by double tapping while standing on it. -block.javelin-ship-pad.description = Leave your current vessel and change into a strong and fast interceptor with lightning weapons.\nUse the pad by double tapping while standing on it. -block.glaive-ship-pad.description = Leave your current vessel and change into a large, well-armored gunship.\nUse the pad by double tapping while standing on it. -block.tau-mech-pad.description = Leave your current vessel and change into a support mech which can heal friendly buildings and units.\nUse the pad by double tapping while standing on it. -block.delta-mech-pad.description = Leave your current vessel and change into a fast, lightly-armored mech made for hit-and-run attacks.\nUse the pad by double tapping while standing on it. -block.omega-mech-pad.description = Leave your current vessel and change into a bulky and well-armored mech, made for front-line assaults.\nUse the pad by double tapping while standing on it. +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[LIGHT_GRAY] unloader[] can be used to retrieve items from the vault. +block.container.description = Stores a small amount of items of each type. An[LIGHT_GRAY] unloader[] 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 on the unloader. +block.launch-pad.description = Launches batches of items without any need for a core launch. Unfinished. +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 = A medium-sized 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 artillery turret. +block.wave.description = A medium-sized rapid-fire turret which shoots liquid bubbles. +block.lancer.description = A medium-sized turret which shoots charged electricity beams. +block.arc.description = A small close-range turret which shoots electricity in a random arc towards the enemy. +block.swarmer.description = A medium-sized turret which shoots burst missiles. +block.salvo.description = A medium-sized turret which fires shots in salvos. +block.fuse.description = A large turret which shoots powerful short-range beams. +block.ripple.description = A large artillery turret which fires several shots simultaneously. +block.cyclone.description = A large rapid fire turret. +block.spectre.description = A large turret which shoots two powerful bullets at once. +block.meltdown.description = A large turret which shoots powerful long-range beams. +block.draug-factory.description = Produces Draug mining drones. block.spirit-factory.description = Produces light drones which mine ore and repair blocks. block.phantom-factory.description = Produces advanced drone units which are significantly more effective than a spirit drone. block.wraith-factory.description = Produces fast, hit-and-run interceptor units. block.ghoul-factory.description = Produces heavy carpet bombers. -block.dagger-factory.description = Produces basic ground units. -block.titan-factory.description = Produces advanced, armored ground units. - -block.fortress-factory.description = Produces heavy artillery ground units. block.revenant-factory.description = Produces heavy laser air 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.conduit.description = Basic liquid transport block. Works like a conveyor, but with liquids. Best used with extractors, pumps or other conduits. -block.pulse-conduit.description = Advanced liquid transport block. Transports liquids faster and stores more than standard conduits. -block.phase-conduit.description = Advanced liquid transport block. Uses power to teleport liquids to a connected phase conduit over several tiles. -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 = Hoiustab suure hulga vedelikke. Use it for creating buffers when there is a non-constant demand of materials or as a safeguard for cooling vital blocks. -block.liquid-junction.description = Töötab kui sild kahele ristuvale torule. Kasulik situatsioonides kui kaks erinevat toru viivad kahte erinevat vedelikku eri kohtadesse. -block.bridge-conduit.description = Arenenud vedeliku transport. Lubab transportida vedelikke üle iga pinnase ja ehitise 3 ruudu kaugusele. -block.mechanical-pump.description = Odav ja aeglane pump, mis ei vaja elektrit. -block.rotary-pump.description = Kahekordistab kiiruse kasutades elektrit. -block.thermal-pump.description = Ülim pump. -block.router.description = Võtab vastu materjale ühest suunast ja annab neid võrdselt välja kolmes suunas. Kasulik ühest allikast tulevate materjalide jagamisel mitmeks. -block.distributor.description = Arenenud jagaja, mis jagab materjale kuni 7 suunas. -block.bridge-conveyor.description = Arenenud transpordi ehitis. Lubab transportida materjale üle iga pinnase ja ehitise 3 ruudu kaugusele. -block.item-source.description = Annab välja lõpmatult materjale. Ainult liivakastis. -block.liquid-source.description = Annab välja lõpmatult vedelikke. Ainult liivakastis. -block.item-void.description = Hävitab kõik materjalid, mis sinna lähevad elektrit kasutamata. Ainult liivakastis. -block.power-source.description = Annab välja lõpmatult elektrit. Ainult liivakastis. -block.power-void.description = Hävitab kõik materjalid, mis sinna lähevad. Ainult liivakastis. -liquid.water.description = Sageli kasutatud jahutamiseks ja jäätme töötluseks. -liquid.oil.description = Seda saab põleteda, õhku lasta või kasutada jahutamiseks. -liquid.cryofluid.description = Kõige efektiivsem vedelik asjade maha jahutamiseks. +block.dart-mech-pad.description = Provides transformation into a basic attack mech.\nUse by tapping while standing on it. +block.delta-mech-pad.description = Leave your current vessel and change into a fast, lightly-armored mech made for hit-and-run attacks.\nUse the pad by double tapping while standing on it. +block.tau-mech-pad.description = Leave your current vessel and change into a support mech which can heal friendly buildings and units.\nUse the pad by double tapping while standing on it. +block.omega-mech-pad.description = Leave your current vessel and change into a bulky and well-armored mech, made for front-line assaults.\nUse the pad by double tapping while standing on it. +block.javelin-ship-pad.description = Leave your current vessel and change into a strong and fast interceptor with lightning weapons.\nUse the pad by double tapping while standing on it. +block.trident-ship-pad.description = Leave your current vessel and change into a reasonably well armored heavy bomber.\nUse the pad by double tapping while standing on it. +block.glaive-ship-pad.description = Leave your current vessel and change into a large, well-armored gunship.\nUse the pad by double tapping while standing on it. diff --git a/core/assets/bundles/bundle_fr.properties b/core/assets/bundles/bundle_fr.properties index 8ca1bedd86..2af6ae122e 100644 --- a/core/assets/bundles/bundle_fr.properties +++ b/core/assets/bundles/bundle_fr.properties @@ -43,6 +43,7 @@ newgame = Nouvelle partie none = minimap = Minimap close = Fermer +website = Website quit = Quitter maps = Cartes continue = Continuer @@ -71,6 +72,7 @@ server.kicked.nameEmpty = Votre nom doit contenir au moins une lettre ou un chif server.kicked.idInUse = Vous êtes déjà sur ce serveur ! Se connecter avec deux comptes n'est pas permis ! server.kicked.customClient = Ce serveur ne supporte pas les versions personnalisées (Custom builds). Téléchargez une version officielle. server.kicked.gameover = Game over! +server.versions = Your version:[accent] {0}[]\nServer version:[accent] {1}[] host.info = Le bouton [accent]Héberger[] héberge un serveur sur le port [scarlet]6567[]. \nN'importe qui sur le même [LIGHT_GRAY]wifi ou réseau local []devrait voir votre serveur sur leur liste des serveurs.\n\nSi vous voulez que les gens puissent s'y connecter de partout à l'aide de votre IP, [accent]le transfert de port (port forwarding)[] est demandé.\n\n[LIGHT_GRAY]Note: Si quelqu'un a des problèmes de connexion à votre partie LAN, vérifiez que vous avez autorisé l'accès à Mindustry sur votre réseau local dans les paramètres de votre pare-feu. join.info = Ici vous pouvez entrez [accent]l'IP d'un serveur []pour s'y connecter, ou découvrir un serveur en [accent]réseau local[].\nLe multijoueur en LAN ainsi qu'en WAN est supporté.\n\n[LIGHT_GRAY]Note: Il n'y a pas de liste de serveurs globaux automatiques; Si vous voulez vous connectez à quelqu'un par IP, il faudra d'abord demander à l'hébergeur leur IP. hostserver = Héberger une partie @@ -154,7 +156,10 @@ cancel = Annuler openlink = Ouvrir le lien copylink = Copier le lien back = Retour +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 = Êtes-vous sûr de partir? +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... saving = [accent]Sauvegarde... wave = [accent]Vague {0} @@ -263,6 +268,7 @@ filters.empty = [LIGHT_GRAY]Aucun filtre! Ajoutez-en un avec les boutons ci-dess filter.distort = Déformation filter.noise = Bruit filter.median = Median +filter.oremedian = Ore Median filter.blend = Blend filter.defaultores = Default Ores filter.ore = Minerai @@ -302,6 +308,7 @@ ping = Ping: {0}ms language.restart = Veuillez redémarrez votre jeu pour le changement de langage prenne effet. settings = Paramètres tutorial = Tutoriel +tutorial.retake = Re-Take Tutorial editor = Éditeur mapeditor = Éditeur de carte donate = Faire un\ndon @@ -315,8 +322,9 @@ bestwave = [LIGHT_GRAY]Meilleur: {0} launch = Lancement launch.title = Lancement réussi launch.next = [LIGHT_GRAY] Prochaine opportunité à la vague {0} -launch.unable = [scarlet]Impossible d'effectuer le lancement.[] Ennemis. +launch.unable2 = [scarlet]Unable to LAUNCH.[] launch.confirm = Cela va transférer tous tes ressources dans votre coeur.\nTu ne vas pas pouvoir retourner à cette base. +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. configure.locked = [LIGHT_GRAY]Atteigner la vague {0}\npour configurer le transfert des ressources @@ -352,6 +360,7 @@ 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. @@ -363,6 +372,7 @@ zone.overgrowth.description = This area is overgrown, closer to the source of th zone.tarFields.description = The outskirts of an oil production zone, between the mountains and desert. One of the few areas with usable tar reserves.\nAlthough abandoned, this area has some dangerous enemy forces nearby. Do not underestimate them.\n\n[lightgray]Research oil processing technology if possible. zone.desolateRift.description = An extremely dangerous zone. Plentiful resources, but little space. High risk of destruction. Leave as soon as possible. Do not be fooled by the long spacing between enemy attacks. zone.nuclearComplex.description = A former facility for the production and processing of thorium, reduced to ruins.\n[lightgray]Research the thorium and its many uses.\n\nThe enemy is present here in great numbers, constantly scouting for attackers. +zone.fungalPass.description = A transition area between high mountains and lower, spore-ridden lands. A small enemy reconnaissance base is located here.\nDestroy it.\nUse Dagger and Crawler units. Take out the two cores. zone.impact0078.description = zone.crags.description = settings.language = Langage @@ -417,6 +427,7 @@ blocks.inaccuracy = Précision blocks.shots = Tir blocks.reload = Tirs/Seconde blocks.ammo = Munitions +bar.drilltierreq = Better Drill Required bar.drillspeed = Vitesse de forage: {0}/s bar.efficiency = Efficacité: {0}% bar.powerbalance = Énergie: {0} @@ -491,6 +502,7 @@ setting.lasers.name = Afficher les rayons des lasers setting.pixelate.name = Pixeliser[LIGHT_GRAY] (disables animations) setting.minimap.name = Montrer la minimap setting.musicvol.name = Volume de la musique +setting.ambientvol.name = Ambient Volume setting.mutemusic.name = Couper la musique setting.sfxvol.name = Volume des SFX setting.mutesound.name = Couper les SFX @@ -819,9 +831,10 @@ block.container.name = Conteneur block.launch-pad.name = Plateforme de lancement block.launch-pad-large.name = Grande plateforme de lancement team.blue.name = Bleu -team.red.name = Rouge +team.crux.name = red +team.sharded.name = orange team.orange.name = Orange -team.none.name = Gris +team.derelict.name = derelict team.green.name = Vert team.purple.name = Violet unit.spirit.name = Drone spirituel @@ -839,27 +852,26 @@ unit.chaos-array.name = Chaos Array unit.eradicator.name = Eradicator unit.lich.name = Lich unit.reaper.name = Reaper -tutorial.begin = Votre mission, si vous l'acceptez est de détruire [LIGHT_GRAY]l'ennemi[].\n\nCommencez par [accent] miner du cuivre[]. Appuyer sur un filon de cuivre proche de votre base pour faire ceci. +tutorial.next = [lightgray] +tutorial.intro = You have entered the[scarlet] Mindustry Tutorial.[]\nBegin by[accent] mining copper[]. Tap a copper ore vein near your core to do this.\n\n[accent]{0}/{1} copper tutorial.drill = Le minage manuel est inefficace.\n[accent]Des foreuses[]peuvent miner automatiquement.\nPlacez-en une sur un filon de cuivre. +tutorial.drill.mobile = Mining manually is inefficient.\n[accent]Drills []can mine automatically.\nTap the drill tab in the bottom right.\nSelect the[accent] mechanical drill[].\nPlace it on a copper vein by tapping, then press the[accent] checkmark[] below to confirm your selection.\nPress the[accent] X button[] to cancel placement. +tutorial.blockinfo = Each block has different stats. Each drill can only mine certain ores.\nTo check a block's info and stats,[accent] tap the "?" button while selecting it in the build menu.[]\n\n[accent]Access the Mechanical Drill's stats now.[] tutorial.conveyor = [accent]Les Tapis roulants[] sont utilisés pour transporter des objets jusqu'à la base.\nFaites une ligne de tapis roulants de la foreuse à la base . -tutorial.morecopper = Plus de cuivre est demandé .\n\nRécupérez le soit manuellement soit construisez plus de foreuses. +tutorial.conveyor.mobile = [accent]Conveyors[] are used to transport items to the core.\nMake a line of conveyors from the drill to the core.\n[accent] Place in a line by holding down your finger for a few seconds[] and dragging in a direction.\n\n[accent]{0}/{1} conveyors placed in line\n[accent]0/1 items delivered tutorial.turret = Des constructions défensives doivent être construites pour repousser [LIGHT_GRAY]les ennemis[].Construisez une tourelle "duo" près de votre base. tutorial.drillturret = Les tourelles "Duo" ont besoin de [accent]munitions en cuivre[] pour tirer.\nPlacez une foreuse à côté de la tourelle pour l'approvisionner avec du cuivre. +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 = Les [LIGHT_GRAY]ennemies[] approchent.\n\nDéfendez votre base pour 2 vagues. Construisez plus de tourelles. -tutorial.lead = Plus de minerais sont forables. Explorez et minez du[accent] Plomb[].\n\nRamenez votre unité à la base pour transférer les ressources. -tutorial.smelter = Le cuivre et le plomb sont des métaux fragiles.\nUn alliage de qualité supérieure peut être créé dans une fonderie, l'[accent] alliage lourd [].\n\n Construisez-en un. -tutorial.densealloy = La fonderie va maintenant produire de l'alliage lourd.\nObtenez-en .\nVous pouvez aussi améliorer la production si nécessaire . -tutorial.siliconsmelter = La base va maintenant créer un[accent] drone spirituel[] pour miner et réparer les blocs.\n\nDes usines pour faire d'autres unités peuvent être faites avec du [accent] silicone.\nFaites une fonderie de silicone . -tutorial.silicondrill = Faire du silicone demande [accent] du charbon[] et[accent] du sable [].\nCommencez par construire des foreuses . -tutorial.generator = Cette technologie requiert de l'énergie pour fonctionner.\nFaites un [accent]générateur à combustion[] pour en produire. -tutorial.generatordrill = Les générateurs à combustion ont besoin de carburant.\n Donnez-lui du charbon comme carburant avec une foreuse. -tutorial.node = L'énergie doit être transportée .\nCréez un [accent] Transmetteur energétique[] à côté de votre générateur à combustion pour transférer son énergie. -tutorial.nodelink = L'énergie peut être transféré à l'aide de blocs utilisant de l'énergie ou des générateurs, ou encore par des Transmetteurs énergétiques reliés.\n\nReliez des transmetteurs en appuyant dessus puis en sélectionnant le générateur et la fonderie de silicone. -tutorial.silicon = Du silicone est maintenant produit. Obtenez-en.\n\nAugmenter la production est recommandé. -tutorial.daggerfactory = Construire [accent]une usine de "Poignards" []est recommandé .\n\nElle sera utilisée pour produire des unités d'attaque. -tutorial.router = Les usines ont besoin de ressources pour fonctionner.\nCréez un routeur pour séparer les objets. -tutorial.dagger = Reliez des transmetteurs énergétiques à l'usine.\nUne fois que les conditions seront remplies , un mécha sera créé.\nConstruisez autant de foreuses, de générateurs et de tapis roulants que nécessaire. -tutorial.battle = [LIGHT_GRAY]L'Ennemi[] a révélé sa base .\nDétruisez la avec votre unité et des méchas "Poignard". +tutorial.waves.mobile = The[lightgray] enemy[] approaches.\n\nDefend the core for 2 waves. Your ship will automatically fire at enemies.\nBuild more turrets and drills. Mine more copper. +tutorial.launch = Once you reach a specific wave, you are able to[accent] launch the core[], leaving your defenses behind and[accent] obtaining all the resources in your core.[]\nThese resources can then be used to research new technology.\n\n[accent]Press the launch button. item.copper.description = Un matériau de construction utile. Utilisé intensivement dans tout les blocs. item.lead.description = Un matériau de départ. Utilisé intensivement en électronique et pour le transport de blocs. item.metaglass.description = Un composé de vitre super-résistant. Utilisé largement pour le transport et le stockage de liquides. @@ -896,13 +908,9 @@ unit.crawler.description = A ground unit consisting of a stripped-down frame wit unit.titan.description = Une unité terrestre cuirassée avancée. Attaque les unités terrestres comme aériennes. unit.fortress.description = Une unité terrestre d'artillerie lourde . 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.chaos-array.description = -unit.eradicator.description = unit.wraith.description = Une unité volante rapide harcelant les ennemis .Utilise du plomb comme munitions. unit.ghoul.description = Un bombardier lourd . Utilise de la pyratite ou des explosifs comme munitions. unit.revenant.description = A heavy, hovering missile array. -unit.lich.description = -unit.reaper.description = block.graphite-press.description = Compresses chunks of coal into pure sheets of graphite. block.multi-press.description = An upgraded version of the graphite press. Employs water and power to process coal quickly and efficiently. block.silicon-smelter.description = Utilise du sable, du charbon et de l'énergie afin de produire du silicone. diff --git a/core/assets/bundles/bundle_fr_BE.properties b/core/assets/bundles/bundle_fr_BE.properties index 882ac251f7..9b2ddba709 100644 --- a/core/assets/bundles/bundle_fr_BE.properties +++ b/core/assets/bundles/bundle_fr_BE.properties @@ -4,7 +4,7 @@ contributors = Traducteurs et contributeurs discord = Rejoignez le discord de Mindustry ! link.discord.description = Le discord officiel de Mindustry link.github.description = Code source du jeu -link.changelog.description = List of update changes +link.changelog.description = Liste des modifications de mise à jour link.dev-builds.description = Versions instables de développement link.trello.description = Planning Trello officiel pour les fonctionnalités planifiées. link.itch.io.description = Page web itch.io avec les versions ordinateurs téléchargeables et la version web @@ -43,6 +43,7 @@ newgame = Nouvelle partie none = minimap = Minimap close = Fermer +website = Website quit = Quitter maps = Cartes continue = Continue @@ -71,6 +72,7 @@ server.kicked.nameEmpty = Votre nom doit contenir au moins une lettre ou un chif server.kicked.idInUse = Vous êtes déjà sur ce serveur ! Se connecter avec deux comptes n'est pas permis ! server.kicked.customClient = Ce serveur ne supporte pas les versions personnalisées (Custom builds). Télécharger une version officielle. server.kicked.gameover = Vous avez perdu ! +server.versions = Your version:[accent] {0}[]\nServer version:[accent] {1}[] host.info = Le bouton [accent]héberger[] héberge un serveur sur les ports [scarlet]6567[] et [scarlet]6568.[]\nN'importe qui sur le même [LIGHT_GRAY]réseau wifi ou local[] devrait pouvoir voir votre serveur dans sa liste de serveurs.\n\nSi vous voulez que les gens puissent se connecter de n'importe où grâce à l'IP, [accent]rediriger les ports[] est requis.\n\n[LIGHT_GRAY]Note:Si quelqu'un éprouve des difficultés à se connecter à votre partie LAN, assurez-vous que vous avez autorisé Mindustry à accéder à votre réseau local dans les paramètres de votre pare-feu. join.info = Ici, vous pouvez entrer l' [accent]IP d'un serveur[] pour s'y connecter, ou découvrir les serveurs[accent]sur votre réseau local[] pour s'y connecter.\nLes parties multijoueur LAN et WAN sont toutes deux supportées.\n\n[LIGHT_GRAY]Note: Aucune liste globale des serveurs n'est génerée automatiquement: si vous voulez vous connecter à un serveur par IP, vous devrez demander l'IP à l'hébergeur. hostserver = Héberger un serveur @@ -154,7 +156,10 @@ cancel = Annuler openlink = Ouvrir le lien copylink = Copier le lien back = Retour +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 = Ê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... saving = [accent]Sauvegarde... wave = [accent]Vague {0} @@ -186,7 +191,7 @@ editor.waves = Vagues: editor.rules = Règles: editor.generation = Generation: editor.ingame = Modifier en jeu -editor.newmap = New Map +editor.newmap = Nouvelle carte waves.title = Vagues waves.remove = Retirer waves.never = @@ -201,7 +206,7 @@ waves.copy = Copier dans le Presse-papiers waves.load = Coller depuis le Presse-papiers waves.invalid = Vagues invalides dans le Presse-papiers. waves.copied = Vagues copiées. -waves.none = No enemies defined.\nNote that empty wave layouts will automatically be replaced with the default layout. +waves.none = Aucun ennemi défini.\nNotez que les dispositions vides seront automatiquement remplacées par la dispositions par défaut. editor.default = [LIGHT_GRAY] edit = Modifier... editor.name = Nom: @@ -245,31 +250,32 @@ editor.mapname = Nom de la carte: editor.overwrite = [accent]Attention!\nCela écrasera une carte existante. editor.overwrite.confirm = [scarlet]Attention ![] Une carte avec ce nom existe déjà. Êtes-vous sûr de vouloir la réécrire? editor.selectmap = Sélectionnez une carte à charger: -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. +toolmode.replace = Remplacer +toolmode.replace.description = Dessine uniquement sur des blocs pleins. +toolmode.replaceall = Remplacer tout +toolmode.replaceall.description = Remplacez tous les blocs de la carte. +toolmode.orthogonal = Orthogonale +toolmode.orthogonal.description = Dessine uniquement des lignes orthogonales. +toolmode.square = Carré +toolmode.square.description = Pinceau carré. +toolmode.eraseores = Effacer les minerais +toolmode.eraseores.description = N'effacez que les minerais. +toolmode.fillteams = Remplir les équipes +toolmode.fillteams.description = Remplissez les équipes au lieu de blocs. +toolmode.drawteams = Tirage au sort des équipes +toolmode.drawteams.description = Dessinez des équipes au lieu de blocs. filters.empty = [LIGHT_GRAY]Aucun filtre! Ajoutez-en un avec les boutons ci-dessous. filter.distort = Déformation filter.noise = Bruit filter.median = Median -filter.blend = Blend -filter.defaultores = Default Ores +filter.oremedian = Ore Median +filter.blend = Mélange +filter.defaultores = Minerais par défaut filter.ore = Minerai filter.rivernoise = Bruit des rivières -filter.mirror = Mirror -filter.clear = Clear -filter.option.ignore = Ignore +filter.mirror = Miroir +filter.clear = Nettoyer +filter.option.ignore = Ignorer filter.scatter = Dispersement filter.terrain = Terrain filter.option.scale = Échelle @@ -282,7 +288,7 @@ filter.option.falloff = Diminution filter.option.angle = Angle filter.option.block = Bloc filter.option.floor = Sol -filter.option.flooronto = Target Floor +filter.option.flooronto = Sible au sol filter.option.wall = Mur filter.option.ore = Minerai filter.option.floor2 = Sol secondaire @@ -293,7 +299,7 @@ width = Largeur: height = Hauteur: menu = Menu play = Jouer -campaign = Campaign +campaign = Campagne load = Charger save = Sauvegarder fps = FPS: {0} @@ -302,6 +308,7 @@ ping = Ping: {0}ms language.restart = Veuillez redémarrez votre jeu pour le changement de langage prenne effet. settings = Paramètres tutorial = Tutoriel +tutorial.retake = Re-Take Tutorial editor = Éditeur mapeditor = Éditeur de carte donate = Faire un\ndon @@ -315,8 +322,9 @@ bestwave = [LIGHT_GRAY]Meilleur: {0} launch = Lancement launch.title = Lancement réussi launch.next = [LIGHT_GRAY]Prochaine opportunité à la vague {0} -launch.unable = [scarlet]Impossible d'effectuer le lancement.[] Ennemis. +launch.unable2 = [scarlet]Unable to LAUNCH.[] launch.confirm = Cela lancera toutes les ressources dans votre noyau.\nVous ne pourrez pas revenir à cette base. +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. configure.locked = [LIGHT_GRAY]Atteigner la vague {0}\npour configurer le transfert des ressources. @@ -326,7 +334,7 @@ zone.config.complete = Vague {0} atteinte:\nConfiguration du transfert débloqu zone.resources = Ressources détectées: zone.objective = [lightgray]Objective: [accent]{0} zone.objective.survival = Survive -zone.objective.attack = Destroy Enemy Core +zone.objective.attack = Détruire la base ennemi add = Ajouter... boss.health = Vie du BOSS connectfail = [crimson]Échec de la connexion au serveur: [accent]{0} @@ -338,7 +346,7 @@ error.alreadyconnected = Déjà connecté. error.mapnotfound = Fichier de carte introuvable ! error.io = Network I/O error. error.any = Erreur réseau inconnue. -error.bloom = Failed to initialize bloom.\nYour device may not support it. +error.bloom = Échec d'initialisation de la floraison.\nVotre appareil peut ne pas le supporter. zone.groundZero.name = Première Bataille zone.desertWastes.name = Déchets du désert zone.craters.name = Les Cratères @@ -349,22 +357,24 @@ zone.desolateRift.name = Fissure abandonnée zone.nuclearComplex.name = Complexe nucléaire zone.overgrowth.name = Surcroissance zone.tarFields.name = Champs de goudron -zone.saltFlats.name = Salt Flats +zone.saltFlats.name = Salière zone.impact0078.name = Impact 0078 zone.crags.name = Crags -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.impact0078.description = -zone.crags.description = +zone.fungalPass.name = Fungal Pass +zone.groundZero.description = L'emplacement optimal pour recommencer. Faible menace ennemie. Peu de ressources.\nRassemblez autant de plomb et de cuivre que possible.\nAllons-y +zone.frozenForest.description = Même ici, plus près des montagnes, les spores se sont propagées. Les températures glaciales ne peuvent pas les contenir pour toujours.\n\nCommencez l'aventure au pouvoir. Construire des générateurs de combustion. Apprenez à utiliser les réparations. +zone.desertWastes.description = Ces déchets sont vastes, imprévisibles, et sillonné de structures du secteur désaffectés.\nLe charbon est présent dans la région. Brulez-le pour obtenir de l'énergie ou synthétisez du graphite.\n\n[lightgray]Ce lieu d'atterrissage ne peut être garanti. +zone.saltFlats.description = Aux abords du désert se trouvent les marais salants. Peu de ressources peuvent être trouvées à cet endroit.\n\nL'ennemi a érigé un complexe de stockage de ressources ici. Éradiquer leur base. Ne laisser rien debout. +zone.craters.description = L'eau s'est accumulée dans ce cratère, vestige des guerres anciennes. Récupérer la zone. Recueillir du sable. Créé du Métaverre. Pomper de l'eau pour refroidir les tourelles et les perceuses. +zone.ruinousShores.description = Passé les déchets, c'est le rivage. Une fois, cet endroit a abrité un réseau de défense côtière. Il n'en reste pas beaucoup. Seules les structures de défense les plus élémentaires restent indemnes, tout le reste étant réduit à néant.\nContinuer l'expansion vers l'extérieur. Redécouvrez la technologie. +zone.stainedMountains.description = Plus à l'intérieur des terres se trouvent les montagnes, non polluées par les spores.\nExtraire le titane abondant dans cette zone. Et apprennez comment l'utiliser.\n\nLa présence de l'ennemi est plus grande ici. Ne leur donnez pas le temps d'envoyer leurs unités les plus fortes. +zone.overgrowth.description = Cette zone est envahie par la végétation, plus proche de la source des spores.\nL'ennemi a établi un avant-poste ici. Construire des unités de poignard. Detruis-le. Et repprennez ce qui a été perdu ! +zone.tarFields.description = La périphérie d'une zone de production de pétrole, entre les montagnes et le désert. Une des rares zones avec des réserves de goudron utilisables.\nBien qu'abandonnée, cette zone a des forces ennemies dangereuses à proximité. Ne les sous-estimez pas.\n\n[lightgray]Rechercher la technologie de traitement de pétrole si possible. +zone.desolateRift.description = Une zone extrêmement dangereuse. Ressources abondantes, mais peu d'espace. Risque élevé de destruction. Pars le plus vite possible.\nNe vous laissez pas berner par le long espacement entre les attaques ennemies. +zone.nuclearComplex.description = Une ancienne installation de production et de traitement de thorium, réduite à néant.\n[lightgray]Recherche sur le thorium et ses nombreuses utilisations.\n\nL'ennemi est présent ici en grand nombre, recherchant constamment des assaillants. +zone.fungalPass.description = A transition area between high mountains and lower, spore-ridden lands. A small enemy reconnaissance base is located here.\nDestroy it.\nUse Dagger and Crawler units. Take out the two cores. +zone.impact0078.description = +zone.crags.description = settings.language = Langage settings.reset = Valeur par défaut. settings.rebind = Réatttribuer @@ -383,7 +393,7 @@ no = Non info.title = Info error.title = [crimson]Une erreur s'est produite error.crashtitle = Une erreur s'est produite -attackpvponly = [scarlet]Only available in Attack/PvP modes +attackpvponly = [scarlet]Uniquement disponible dans les modes Attaque/PvP blocks.input = Ressource(s) requise(s) blocks.output = Ressource(s) produite(s) blocks.booster = Booster @@ -417,6 +427,7 @@ blocks.inaccuracy = Précision blocks.shots = Tirs blocks.reload = Tirs/Seconde blocks.ammo = Munition +bar.drilltierreq = Better Drill Required bar.drillspeed = Vitesse de forage: {0}/s bar.efficiency = Efficacité: {0}% bar.powerbalance = Énergie: {0} @@ -436,7 +447,7 @@ bullet.shock = [stat]choc bullet.frag = [stat]frag bullet.knockback = [stat]{0}[lightgray]recul bullet.freezing = [stat]gel -bullet.tarred = [stat]tarred +bullet.tarred = [stat]goudronné bullet.multiplier = [stat]{0}[lightgray]x multiplicateur de munitions bullet.reload = [stat]{0}[lightgray]x vitesse de rechargement unit.blocks = Blocs @@ -466,11 +477,11 @@ setting.animatedshields.name = Boucliers Animés setting.antialias.name = Antialias[LIGHT_GRAY] (demande le redémarrage de l'appareil)[] setting.indicators.name = Indicateurs d'alliés setting.autotarget.name = Visée automatique -setting.keyboard.name = Mouse+Keyboard Controls +setting.keyboard.name = Contrôles Souris + Clavier setting.fpscap.name = Max FPS setting.fpscap.none = Vide setting.fpscap.text = {0} FPS -setting.uiscale.name = UI Scaling[lightgray] (require restart)[] +setting.uiscale.name = Mise à l'échelle de l'interface[lightgray] (nécessite un redémarrage)[] setting.swapdiagonal.name = Autoriser le placement des blocs en diagonal setting.difficulty.training = Entraînement setting.difficulty.easy = Facile @@ -491,17 +502,18 @@ setting.lasers.name = Afficher les rayons des lasers setting.pixelate.name = Pixélisé [LIGHT_GRAY](peut diminuer les performances)[] setting.minimap.name = Montrer la minimap setting.musicvol.name = Volume de la musique +setting.ambientvol.name = Ambient Volume setting.mutemusic.name = Couper la musique setting.sfxvol.name = Volume des SFX setting.mutesound.name = Couper les SFX setting.crashreport.name = Envoyer des rapports d'incident anonymement. setting.chatopacity.name = Opacité du tchat setting.playerchat.name = Afficher le tchat en jeu -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 +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 = Floraison keybind.title = Paramétrer les touches -keybinds.mobile = [scarlet]Most keybinds here are not functional on mobile. Only basic movement is supported. +keybinds.mobile = [scarlet]La plupart des raccourcis clavier ne sont pas fonctionnelles sur les appareils mobiles. Seul le mouvement de base est pris en charge. category.general.name = Général category.view.name = Voir category.multiplayer.name = Multijoueur @@ -634,7 +646,7 @@ mech.buildspeed = [LIGHT_GRAY]Building Speed: {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 = Sand Boulder +block.sand-boulder.name = Sable rocheux block.grass.name = Herbe block.salt.name = Sel block.saltrocks.name = Roches de sel @@ -744,7 +756,7 @@ block.battery-large.name = Batterie large block.combustion-generator.name = Générateur à combustion block.turbine-generator.name = Générateur à turbine block.differential-generator.name = Générateur différentiel -block.impact-reactor.name = Impact Reactor +block.impact-reactor.name = Réacteur à impact block.mechanical-drill.name = Foreuse mécanique block.pneumatic-drill.name = Foreuse à vérin block.laser-drill.name = Foreuse Laser @@ -778,7 +790,7 @@ block.blast-mixer.name = Mixeur à explosion block.solar-panel.name = Panneau solaire block.solar-panel-large.name = Grand panneau solaire block.oil-extractor.name = Extracteur de pétrol -block.draug-factory.name = Draug Miner Drone Factory +block.draug-factory.name = Usine de "Drones draug miner" block.spirit-factory.name = Usine de "Drones spirituels" block.phantom-factory.name = Usine de "Drones fantômes" block.wraith-factory.name = Usine de "Combattants spectraux" @@ -819,13 +831,14 @@ block.container.name = Conteneur block.launch-pad.name = Rampe de lancement block.launch-pad-large.name = Grande rampe de lancement team.blue.name = Bleu -team.red.name = Rouge +team.crux.name = red +team.sharded.name = orange team.orange.name = Orange -team.none.name = Gris +team.derelict.name = derelict team.green.name = Vert team.purple.name = Violet unit.spirit.name = Drone spirituel -unit.draug.name = Draug Miner Drone +unit.draug.name = Drone draug miner unit.phantom.name = Drone Fantôme unit.dagger.name = Poignard unit.crawler.name = Chenille @@ -839,31 +852,30 @@ unit.chaos-array.name = Chaos Array unit.eradicator.name = Eradicator unit.lich.name = Lich unit.reaper.name = Reaper -tutorial.begin = Votre mission, si vous l'acceptez est de détruire [LIGHT_GRAY]l'ennemi[].\n\nCommencez par [accent] miner du cuivre[]. Appuyer sur un filon de cuivre proche de votre base pour faire ceci. +tutorial.next = [lightgray] +tutorial.intro = You have entered the[scarlet] Mindustry Tutorial.[]\nBegin by[accent] mining copper[]. Tap a copper ore vein near your core to do this.\n\n[accent]{0}/{1} copper tutorial.drill = Le minage manuel est inefficace.\n[accent]Des foreuses[]peuvent miner automatiquement.\nPlacez-en une sur un filon de cuivre. +tutorial.drill.mobile = Mining manually is inefficient.\n[accent]Drills []can mine automatically.\nTap the drill tab in the bottom right.\nSelect the[accent] mechanical drill[].\nPlace it on a copper vein by tapping, then press the[accent] checkmark[] below to confirm your selection.\nPress the[accent] X button[] to cancel placement. +tutorial.blockinfo = Each block has different stats. Each drill can only mine certain ores.\nTo check a block's info and stats,[accent] tap the "?" button while selecting it in the build menu.[]\n\n[accent]Access the Mechanical Drill's stats now.[] tutorial.conveyor = [accent]Les Tapis roulants[] sont utilisés pour transporter des objets jusqu'à la base.\nFaites une ligne de tapis roulants de la foreuse à la base . -tutorial.morecopper = Plus de cuivre est demandé .\n\nRécupérez le soit manuellement soit construisez plus de foreuses. +tutorial.conveyor.mobile = [accent]Conveyors[] are used to transport items to the core.\nMake a line of conveyors from the drill to the core.\n[accent] Place in a line by holding down your finger for a few seconds[] and dragging in a direction.\n\n[accent]{0}/{1} conveyors placed in line\n[accent]0/1 items delivered tutorial.turret = Des constructions défensives doivent être construites pour repousser [LIGHT_GRAY]les ennemis[].Construisez une tourelle "duo" près de votre base. tutorial.drillturret = Les tourelles "Duo" ont besoin de [accent]munitions en cuivre[] pour tirer.\nPlacez une foreuse à côté de la tourelle pour l'approvisionner avec du cuivre. +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 = Les [LIGHT_GRAY]ennemies[] approchent.\n\nDéfendez votre base pour 2 vagues. Construisez plus de tourelles. -tutorial.lead = Plus de minerais sont forables. Explorez et minez du[accent] Plomb[].\n\nRamenez votre unité à la base pour transférer les ressources. -tutorial.smelter = Le cuivre et le plomb sont des métaux fragiles.\nUn alliage de qualité supérieure peut être créé dans une fonderie, l'[accent] alliage lourd [].\n\n Construisez-en un. -tutorial.densealloy = La fonderie va maintenant produire de l'alliage lourd.\nObtenez-en .\nVous pouvez aussi améliorer la production si nécessaire . -tutorial.siliconsmelter = La base va maintenant créer un[accent] drone spirituel[] pour miner et réparer les blocs.\n\nDes usines pour faire d'autres unités peuvent être faites avec du [accent] silicone.\nFaites une fonderie de silicone . -tutorial.silicondrill = Faire du silicone demande [accent] du charbon[] et[accent] du sable [].\nCommencez par construire des foreuses . -tutorial.generator = Cette technologie requiert de l'énergie pour fonctionner.\nFaites un [accent]générateur à combustion[] pour en produire. -tutorial.generatordrill = Les générateurs à combustion ont besoin de carburant.\n Donnez-lui du charbon comme carburant avec une foreuse. -tutorial.node = L'énergie doit être transportée .\nCréez un [accent] Transmetteur energétique[] à côté de votre générateur à combustion pour transférer son énergie. -tutorial.nodelink = L'énergie peut être transféré à l'aide de blocs utilisant de l'énergie ou des générateurs, ou encore par des Transmetteurs énergétiques reliés.\n\nReliez des transmetteurs en appuyant dessus puis en sélectionnant le générateur et la fonderie de silicone. -tutorial.silicon = Du silicone est maintenant produit. Obtenez-en.\n\nAugmenter la production est recommandé. -tutorial.daggerfactory = Construire [accent]une usine de "Poignards" []est recommandé .\n\nElle sera utilisée pour produire des unités d'attaque. -tutorial.router = Les usines ont besoin de ressources pour fonctionner.\nCréez un routeur pour séparer les objets. -tutorial.dagger = Reliez des transmetteurs énergétiques à l'usine.\nUne fois que les conditions seront remplies , un mécha sera créé.\nConstruisez autant de foreuses, de générateurs et de tapis roulants que nécessaire. -tutorial.battle = [LIGHT_GRAY]L'Ennemi[] a révélé sa base.\nDétruisez la avec votre unité et des méchas "Poignard". +tutorial.waves.mobile = The[lightgray] enemy[] approaches.\n\nDefend the core for 2 waves. Your ship will automatically fire at enemies.\nBuild more turrets and drills. Mine more copper. +tutorial.launch = Once you reach a specific wave, you are able to[accent] launch the core[], leaving your defenses behind and[accent] obtaining all the resources in your core.[]\nThese resources can then be used to research new technology.\n\n[accent]Press the launch button. item.copper.description = Un matériau de construction utile. Utilisé intensivement dans tout les blocs. item.lead.description = Un matériau de départ. Utilisé intensivement en électronique et pour le transport de blocs. item.metaglass.description = Un composé de verre très résistant. Utilisation intensive pour la distribution et le stockage de liquides. -item.graphite.description = Mineralized carbon, used for ammunition and electrical insulation. +item.graphite.description = Carbone minéralisé, utilisé pour les munitions et l’isolation électrique. item.sand.description = Un matériau commun utilisé largement dans la fonte, à la fois dans l'alliage et comme un flux. item.coal.description = Un carburant commun et facile à obtenir. item.titanium.description = Un métal rare super-léger largement utilisé dans le transport de liquides et d'objets ainsi que dans les foreuses de haut-niveau et l'aviation @@ -877,7 +889,7 @@ item.spore-pod.description = Utilisé pour l'obtention d'huile, d'explosifs et d item.blast-compound.description = Un composé volatile utilisé dans les bombes et les explosifs. Bien qu'il puisse être utilisé comme carburant, ce n'est pas conseillé. item.pyratite.description = Une substance extrêmement inflammable utilisée dans les armes incendiaires. liquid.water.description = Couramment utilisé pour les machines de refroidissement et le traitement des déchets. -liquid.slag.description = Various different types of molten metal mixed together. Can be separated into its constituent minerals, or sprayed at enemy units as a weapon. +liquid.slag.description = Différents types de métaux en fusion mélangés. Peut être séparé en ses minéraux constitutifs ou pulvérisé sur les unités ennemies comme une arme. liquid.oil.description = Peut être brûlé, explosé ou utilisé comme liquide de refroidissement. liquid.cryofluid.description = Le liquide de refroidissement le plus efficace. mech.alpha-mech.description = Le mécha standard. A une vitesse et des dégâts décents; Il peut aussi créer jusqu'à 3 drones pour des faire des dégâts supplémentaires. @@ -888,23 +900,19 @@ mech.dart-ship.description = Le vaisseau standard. Raisonnablement rapide et lé mech.javelin-ship.description = Un vaisseau qui bien que lent au départ peut accélerer pour atteindre de très grandes vitesses et voler jusqu'au avant-postes ennemis, faisant d'énormes dégâts avec ses arc électriques obtenus à vitesse maximum et ses missiles. mech.trident-ship.description = Un bombardier lourd raisonnablement cuirassé mech.glaive-ship.description = Un grand vaisseau de combat cuirassé. Equipé avec un fusil automatique à munitions incendiaires. Il a aussi une bonne accéleration ainsi qu'une bonne vitesse maximale. -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.draug.description = Un drone minier primitif. Pas cher à produire. Consommable. Extraction automatique de cuivre et de plomb dans les environs. Fournit les ressources minées à la base la plus proche. unit.spirit.description = L'unité de soutien de départ. Apparaît dans la base par défaut. Mine automatiquement les minerais, récupère les objets au sol et répare les blocs. unit.phantom.description = Une unité de soutien avancée. Mine automatiquement les minerais, récupère les objets au sol et répare les blocs. Bien plus efficace qu'un drone spirituel. unit.dagger.description = Une unité terrestre de base. Utile en essaims. -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.crawler.description = Unité au sol composée d’un cadre dépouillé sur lequel sont fixés des explosifs puissants. Pas particulièrement durable. Explose au contact des ennemis. unit.titan.description = Une unité terrestre cuirassée avancée. Utilise de l'alliage lourd pour munition. Attaque les unités aérinnes comme terrestres. unit.fortress.description = Une unité terrestre d'artillerie lourde. -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.chaos-array.description = -unit.eradicator.description = +unit.eruptor.description = Un mech lourd conçu pour abattre des structures. Tire un flot de scories sur les fortifications ennemies, les fait fondre et met le feu aux volatiles. unit.wraith.description = Une unité volante rapide harcelant les ennemis. Utilise du plomb comme munitions. unit.ghoul.description = Un bombardier lourd. Utilise de la pyratite ou des explosifs comme munitions. -unit.revenant.description = A heavy, hovering missile array. -unit.lich.description = -unit.reaper.description = -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 = Un arsenal de missiles lourd et planant. +block.graphite-press.description = Compresse des morceaux de charbon en feuilles de graphite. +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 coke* très pur afin de produire du silicium. (*Coke produit à partir de charbon:REF) block.kiln.description = Fait fondre le sable et le plomb en métaverre. Nécessite de petites quantités d'énergie. block.plastanium-compressor.description = Produit du plastanium à partir de pétrole et de titane. @@ -917,7 +925,7 @@ block.melter.description = Chauffe la pierre à des températures très élevée block.separator.description = Exposer la pierre à la pression de l'eau afin d'obtenir différents minéraux contenus dans la pierre. block.spore-press.description = Comprime les gousses de spores en huile. block.pulverizer.description = Brise la pierre en sable. Utile en cas de manque de sable naturel. -block.coal-centrifuge.description = Solidifes oil into chunks of coal. +block.coal-centrifuge.description = Solidifie le pétrole en morceaux de charbon. block.incinerator.description = Se débarrasse de tout article ou liquide en excès. block.power-void.description = Annule toute l'énergie qui y est introduite. Bac à sable seulement. block.power-source.description = Débit infini d'énergie. Bac à sable seulement. @@ -926,17 +934,17 @@ block.item-void.description = Détruit tous les objets qui y entrent sans utilis block.liquid-source.description = Débit infini de liquides. Bac à sable seulement. block.copper-wall.description = Un bloc défensif bon marché.\nUtile pour protéger le noyau et les tourelles lors des premières vagues. 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 = 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.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.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. block.phase-wall-large.description = Pas aussi fort qu'un mur de thorium, mais détournera les balles à moins qu'elles ne soient trop puissantes.\nS'étend sur plusieurs tuiles. block.surge-wall.description = Le bloc défensif le plus puissant.\nPeu de chances de déclencher des éclairs en direction de l'attaquant. block.surge-wall-large.description = Le bloc défensif le plus puissant.\nPeu de chances de déclencher des éclairs en direction de l'attaquant.\nS'étend sur plusieurs tuiles. -block.door.description = Une petite porte qui peut être ouverte et fermée en tapotant dessus.\nSi elle est ouverte, les ennemis peuvent tirer et se déplacer. -block.door-large.description = Une grande porte qui peut être ouverte et fermée en tapotant dessus.\nSi elle est ouverte, les ennemis peuvent tirer et se déplacer.\nS'étend sur plusieurs tuiles. -block.mender.description = Periodically repairs blocks in its vicinity. Keeps defenses repaired in-between waves.\nOptionally uses silicon to boost range and efficiency. +block.door.description = Une petite porte qui peut être ouverte et fermée en cliquant dessus.\nSi elle est ouverte, les ennemis peuvent tirer et se déplacer. +block.door-large.description = Une grande porte qui peut être ouverte et fermée en cliquant dessus.\nSi elle est ouverte, les ennemis peuvent tirer et se déplacer.\nS'étend sur plusieurs tuiles. +block.mender.description = Répare périodiquement des blocs à proximité. Garder les défenses réparées entre les vagues.\nUtilise éventuellement du silicium pour augmenter la portée et l'efficacité. block.mend-projector.description = Guérit périodiquement les bâtiments situés à proximité. block.overdrive-projector.description = Augmente la vitesse des bâtiments à proximité, comme les foreuses et les convoyeurs. block.force-projector.description = Crée un champ de force hexagonal autour de lui-même, protégeant les bâtiments et les unités internes des dommages causés par les balles. @@ -963,18 +971,18 @@ block.bridge-conduit.description = Bloc de transport de liquide avancé. Permet block.phase-conduit.description = Bloc de transport de liquide avancé. Utilise le pouvoir de téléporter des liquides vers un conduit de phase connecté sur plusieurs carreaux. block.power-node.description = Transmet la puissance à des noeuds connectés. Il est possible de connecter jusqu'à quatre sources d'alimentation, puits ou nœuds.\nLe nœud recevra de l’alimentation ou fournira l’alimentation à tous les blocs adjacents. block.power-node-large.description = Son rayon d'action est supérieur à celui du nœud d'alimentation et peut être connecté à six sources d'alimentation, puits ou nœuds au maximum. -block.surge-tower.description = An extremely long-range power node with fewer available connections. +block.surge-tower.description = Un nœud d'alimentation extrêmement longue portée avec moins de connexions disponibles. block.battery.description = Stocke l’énergie chaque fois qu’il ya abondance et en cas de pénurie, tant qu’il reste de la capacité. block.battery-large.description = Stocke beaucoup plus d'énergie qu'une batterie ordinaire. block.combustion-generator.description = Génère de l'énergie en brûlant du pétrole ou des matériaux inflammables. block.thermal-generator.description = Génère une grande quantité d'énergie grâce à la lave. block.turbine-generator.description = Plus efficace qu'un générateur de combustion, mais nécessite de l'eau supplémentaire. -block.differential-generator.description = Generates large amounts of energy. Utilizes the temperature difference between cryofluid and burning pyratite. +block.differential-generator.description = Génère de grandes quantités d'énergie. Utilise la différence de température entre le cryofluide et la pyratite en combustion. block.rtg-generator.description = Générateur thermoélectrique à radio-isotopes ne nécessitant pas de refroidissement mais fournissant moins d'énergie qu'un réacteur à thorium. block.solar-panel.description = Fournit une petite quantité d'énergie grâce au soleil. block.solar-panel-large.description = Fournit une bien meilleure alimentation qu'un panneau solaire standard, mais coûte également beaucoup plus cher à construire. block.thorium-reactor.description = Génère d'énormes quantités d'énergie à partir de thorium hautement radioactif. Nécessite un refroidissement constant.\nExplose violemment si des quantités insuffisantes de liquide de refroidissement ne sont pas fournies. -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.impact-reactor.description = Un groupe électrogène avancé, capable de générer d’énormes quantités d’énergie avec une efficacité maximale.\nNécessite une entrée de puissance significative pour relancer le processus. block.mechanical-drill.description = Un extracteur bon marché. Lorsqu'il est placé sur des carreaux appropriés, les objets sortent à un rythme lent et indéfiniment. block.pneumatic-drill.description = Un extracteur améliorée, plus rapide et capable de traiter des matériaux plus durs en utilisant la pression atmosphérique. block.laser-drill.description = Permet de forer encore plus rapidement grâce à la technologie laser, mais nécessite de l'énergie. De plus, le thorium radioactif peut être récupéré avec cet extracteur. @@ -982,17 +990,17 @@ block.blast-drill.description = L'extracteur ultime. Nécessite de grandes quant block.water-extractor.description = Extrait l'eau du sol. Utilisez-le quand il n'y a pas de lac à proximité. block.cultivator.description = Cultiver le sol avec de l'eau afin d'obtenir du biomatter. block.oil-extractor.description = Utilise de grandes quantités d'énergie pour extraire le pétrole du sable. Utilisez-le lorsqu'il n'y a pas de source directe de pétrole à proximité. -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.core-shard.description = La première version de la base centrale. Une fois détruit, tout contact avec la région est perdu. Ne laissez pas cela arriver. +block.core-foundation.description = La deuxième version de la base centrale. Mieux blindé. Stocke plus de ressources. +block.core-nucleus.description = La troisième et dernière version de la base centrale. Extrêmement bien blindé. Stocke des quantités massives de ressources. block.vault.description = Stocke une grande quantité d'objets. Utilisez-le pour créer des tampons lorsqu'il existe une demande non constante de matériaux. [LIGHT_GRAY]Un déchargeur[] peut être utilisé pour récupérer des éléments du coffre-fort. block.container.description = Stocke une petite quantité d'objets. Utilisez-le pour créer des tampons lorsqu'il existe une demande non constante de matériaux. [LIGHT_GRAY]Un déchargeur[] peut être utilisé pour récupérer des éléments du conteneur. block.unloader.description = Décharge des articles d'un conteneur, d'une chambre forte ou d'un noyau sur un convoyeur ou directement dans un bloc adjacent.\nLe type d'élément à décharger peut être modifié en tapotant sur le déchargeur. block.launch-pad.description = Lance des lots d'articles sans qu'il soit nécessaire de procéder à un lancement de base. Inachevé. -block.launch-pad-large.description = An improved version of the launch pad. Stores more items. Launches more frequently. +block.launch-pad-large.description = Une version améliorée de la rampe de lancement. Stocke plus d'articles. Lancements plus fréquemment. block.duo.description = Une petite tourelle pas chère. block.scatter.description = Une tourelle anti-air de taille moyenne. Pulvérise des amas de plomb ou de ferraille sur les unités ennemies. -block.scorch.description = Burns any ground enemies close to it. Highly effective at close range. +block.scorch.description = Brûle les ennemis au sol les plus proches. Très efficace à courte portée. block.hail.description = Une petite tourelle d'artillerie. block.wave.description = Une tourelle de taille moyenne à tir rapide qui tire des bulles de liquide. block.lancer.description = Une tourelle de taille moyenne qui tire des faisceaux d’électricité chargés. @@ -1006,19 +1014,19 @@ block.spectre.description = Une grande tourelle qui tire deux balles puissantes block.meltdown.description = Une grande tourelle qui tire de puissants faisceaux à longue portée. block.draug-factory.description = Produces Draug mining drones. block.spirit-factory.description = Produit des drones légers qui extraient du minerai et réparent des blocs. -block.phantom-factory.description = Produit des unités de drones avancées qui sont nettement plus efficaces qu'un drone spirituel. +block.phantom-factory.description = Produit des drones avancés qui sont bien plus efficaces que les drones spirituels. block.wraith-factory.description = Produit des intercepteurs rapides qui harcèlent l'ennemi. -block.ghoul-factory.description = Produit des tapis de bombardiers lourds. -block.revenant-factory.description = Produit des unités terrestres laser lourdes. -block.dagger-factory.description = Produit des unités terrestres de base. -block.crawler-factory.description = Produces fast self-destructing swarm units. +block.ghoul-factory.description = Produit des bombardiers lourds. +block.revenant-factory.description = Produit des unités terrestres lourdes avec des lasers. +block.dagger-factory.description = Produit des unités terrestres basiques. +block.crawler-factory.description = Produit des unités autodestructrices rapides. block.titan-factory.description = Produit des unités terrestres avancées et blindées. block.fortress-factory.description = Produit des unités terrestres d'artillerie lourde. block.repair-point.description = Soigne en permanence l'unité endommagée la plus proche à proximité. -block.dart-mech-pad.description = Provides transformation into a basic attack mech.\nUse by tapping while standing on it. -block.delta-mech-pad.description = Quittez votre vaisseau actuel et changez-vous en un méchant rapide, légèrement blindé, conçu pour les attaques à la volée.\nUtilisez la plate-forme en tapotant deux fois dessus. -block.tau-mech-pad.description = Quittez votre vaisseau actuel et changez-vous en un centre de support capable de soigner les bâtiments et unités amis.\nUtilisez la plate-forme en tapotant deux fois dessus. -block.omega-mech-pad.description = Quittez votre vaisseau actuel et changez-vous en un mech encombrant et bien blindé, conçu pour les assauts de première ligne.\nUtilisez la plate-forme en tapotant deux fois dessus. -block.javelin-ship-pad.description = Quittez votre vaisseau actuel et changez-vous en un intercepteur puissant et rapide doté d’armes légères.\nUtilisez la plate-forme en tapotant deux fois dessus. -block.trident-ship-pad.description = Quittez votre vaisseau actuel et changez-vous en un bombardier lourd raisonnablement bien blindé.\nUtilisez la plate-forme en tapotant deux fois dessus. -block.glaive-ship-pad.description = Quittez votre vaisseau actuel et changez-vous en un grand vaisseau de combat bien blindé.\nUtilisez la plate-forme en tapotant deux fois dessus. +block.dart-mech-pad.description = Fournit la transformation en un mech d'attaque de base.\nUtilisez en cliquant deux fois dessus. +block.delta-mech-pad.description = Quittez votre vaisseau actuel et changez-vous en un méchant rapide, légèrement blindé, conçu pour les attaques à la volée.\nUtilisez la plate-forme en cliquant deux fois dessus. +block.tau-mech-pad.description = Quittez votre vaisseau actuel et changez-vous en un centre de support capable de soigner les bâtiments et unités amis.\nUtilisez la plate-forme en cliquant deux fois dessus. +block.omega-mech-pad.description = Quittez votre vaisseau actuel et changez-vous en un mech encombrant et bien blindé, conçu pour les assauts de première ligne.\nUtilisez la plate-forme en cliquant deux fois dessus. +block.javelin-ship-pad.description = Quittez votre vaisseau actuel et changez-vous en un intercepteur puissant et rapide doté d’armes légères.\nUtilisez la plate-forme en cliquant deux fois dessus. +block.trident-ship-pad.description = Quittez votre vaisseau actuel et changez-vous en un bombardier lourd raisonnablement bien blindé.\nUtilisez la plate-forme en cliquant deux fois dessus. +block.glaive-ship-pad.description = Quittez votre vaisseau actuel et changez-vous en un grand vaisseau de combat bien blindé.\nUtilisez la plate-forme en cliquant deux fois dessus. diff --git a/core/assets/bundles/bundle_in_ID.properties b/core/assets/bundles/bundle_in_ID.properties index 0d44ae0d4a..3c44b1c5e9 100644 --- a/core/assets/bundles/bundle_in_ID.properties +++ b/core/assets/bundles/bundle_in_ID.properties @@ -43,6 +43,7 @@ newgame = Permainan Baru none = minimap = Peta Kecil close = Tutup +website = Website quit = Keluar maps = Maps continue = Lanjutkan @@ -71,6 +72,7 @@ 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}[] 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 @@ -154,7 +156,10 @@ cancel = Batal openlink = Buka Tautan copylink = Salin Tautan back = Kembali +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 = 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... saving = [accent]Menyimpan... wave = [accent]Gelombang {0} @@ -263,6 +268,7 @@ filters.empty = [LIGHT_GRAY]Tidak ada filter! Tambahkan dengan tombol dibawah. filter.distort = Rusakkan filter.noise = Kebisingan filter.median = Median +filter.oremedian = Ore Median filter.blend = Blend filter.defaultores = Default Ores filter.ore = Sumber Daya @@ -302,6 +308,7 @@ ping = Ping: {0}ms language.restart = Silahkan mengulang kembali permainan agar pengaturan bahasa berpengaruh. settings = Pengaturan tutorial = Tutorial +tutorial.retake = Re-Take Tutorial editor = Penyunting mapeditor = Penyunting Peta donate = Donasi @@ -315,8 +322,9 @@ bestwave = [LIGHT_GRAY]Gelombang Terbaik: {0} launch = < MELUNCUR > launch.title = Berhasil Meluncur launch.next = [LIGHT_GRAY]kesempatan berikutnya di gelombang {0} -launch.unable = [scarlet]Tidak bisa MELUNCUR.[] {0} Musuh. +launch.unable2 = [scarlet]Unable to LAUNCH.[] launch.confirm = Ini akan meluncurkan semua sumber daya di inti.\nAnta tidak bisa kembali lagi ke base ini. +launch.skip.confirm = If you skip now, you will not be able to launch until later waves. uncover = Buka configure = Konfigurasi Muatan configure.locked = [LIGHT_GRAY]Buka konfigurasi muatan: Gelombang {0}. @@ -352,6 +360,7 @@ zone.tarFields.name = Lahan Ter 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. @@ -363,6 +372,7 @@ zone.overgrowth.description = This area is overgrown, closer to the source of th zone.tarFields.description = The outskirts of an oil production zone, between the mountains and desert. One of the few areas with usable tar reserves.\nAlthough abandoned, this area has some dangerous enemy forces nearby. Do not underestimate them.\n\n[lightgray]Research oil processing technology if possible. zone.desolateRift.description = An extremely dangerous zone. Plentiful resources, but little space. High risk of destruction. Leave as soon as possible. Do not be fooled by the long spacing between enemy attacks. zone.nuclearComplex.description = A former facility for the production and processing of thorium, reduced to ruins.\n[lightgray]Research the thorium and its many uses.\n\nThe enemy is present here in great numbers, constantly scouting for attackers. +zone.fungalPass.description = A transition area between high mountains and lower, spore-ridden lands. A small enemy reconnaissance base is located here.\nDestroy it.\nUse Dagger and Crawler units. Take out the two cores. zone.impact0078.description = zone.crags.description = settings.language = Bahasa @@ -417,6 +427,7 @@ blocks.inaccuracy = Jarak Melenceng blocks.shots = Tembakan blocks.reload = Tembakan/Detik blocks.ammo = Amunisi +bar.drilltierreq = Better Drill Required bar.drillspeed = Kecepatan Bor: {0}/s bar.efficiency = Daya Guna: {0}% bar.powerbalance = Tenaga: {0}/s @@ -491,6 +502,7 @@ setting.lasers.name = Tunjukkan Laser setting.pixelate.name = Mode Pixel[LIGHT_GRAY] (menonaktifkan animasi) setting.minimap.name = Tunjukkan Peta kecil setting.musicvol.name = Volume Musik +setting.ambientvol.name = Ambient Volume setting.mutemusic.name = Diamkan Musik setting.sfxvol.name = Volume SFX setting.mutesound.name = Diamkan Suara @@ -819,9 +831,10 @@ block.container.name = Kontainer block.launch-pad.name = Pad Peluncur block.launch-pad-large.name = Pad Peluncur Besar team.blue.name = biru -team.red.name = merah +team.crux.name = red +team.sharded.name = orange team.orange.name = jingga -team.none.name = abu-abu +team.derelict.name = derelict team.green.name = hijau team.purple.name = ungu unit.spirit.name = Drone Spirit @@ -839,27 +852,26 @@ unit.chaos-array.name = Satuan Kekacauan unit.eradicator.name = Pemusnah unit.lich.name = Lich unit.reaper.name = Maut -tutorial.begin = Misi Anda untuk memusnahkan[LIGHT_GRAY] musuh[].\n\nMulai dengan[accent] menambang tembaga[]. Ketuk sekumpulan tembaga didekat inti untuk melakukannya. +tutorial.next = [lightgray] +tutorial.intro = You have entered the[scarlet] Mindustry Tutorial.[]\nBegin by[accent] mining copper[]. Tap a copper ore vein near your core to do this.\n\n[accent]{0}/{1} copper tutorial.drill = 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.[] tutorial.conveyor = [accent]Pengantar[] digunakan untuk transportasi item ke inti.\nJejerlah pengantar dari bor ke inti. -tutorial.morecopper = Butuh lebih banyak tembaga.\n\nBisa menambang dengan manual, atau menambah banyaknya bor. +tutorial.conveyor.mobile = [accent]Conveyors[] are used to transport items to the core.\nMake a line of conveyors from the drill to the core.\n[accent] Place in a line by holding down your finger for a few seconds[] and dragging in a direction.\n\n[accent]{0}/{1} conveyors placed in line\n[accent]0/1 items delivered tutorial.turret = Struktur Pertahanan harus dibuat untuk menangkal [LIGHT_GRAY] musuh[].\nBangun menara "duo" dekat basemu. tutorial.drillturret = Menara "duo" membutuhkan[accent] amunisi tembaga []untuk menembak.\nTaruh bor didekat menara untuk mengisinya dengan tembaga. +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 = [LIGHT_GRAY] Musuh[] mendatang.\n\nLindungi intimu selama 2 gelombang. Bangun lebih banyak menara. -tutorial.lead = Banyak Sumber daya yang telah terbuka. Jelajah dan tambang[accent] timah[].\n\nTarik dari unitmu ke inti untuk mengirim sumber daya. -tutorial.smelter = Tambang dan timah adalah logam lemah.\n[accent] Paduan padat[] yang lebih unggul dibuat di peleburan.\n\nBangun satu. -tutorial.densealloy = Peleburan sekarang akan menghasilkan paduan.\nTingkatkan Produktivitas jika dibutuhkan. -tutorial.siliconsmelter = inti sekarang akan membuat[accent] drone spirit[] untuk menambang dan memperbaiki blok.\n\nPabrik untuk unit lain bisa dibuat dengan [accent] silikon.\nbuatlah pelebur silikon. -tutorial.silicondrill = Silikon membutuhkan[accent] batu bara[] dan[accent] pasir[].\nMulai dengan membuat bor. -tutorial.generator = Teknologi ini membutuhkan tenaga (listrik).\nBuatlah [accent] generator pembakar[] untuk itu. -tutorial.generatordrill = Generator pembahan membutuhkan bahan bakar.\nIsi dengan batu bara dari bor. -tutorial.node = listrik membutuhkan transportasi.\nBuatlah[accent] tiang listrik[] disebelah generator pembakarmu untuk mentransfer listrik. -tutorial.nodelink = Listrik bisa ditransfer melewati blok kondusif dan generators, atau disambungkan dengan tiang listrik.\n\nSambung listrik dengan menekan salah satu tiang listrik dan menekan generator serta pelebur silikon. -tutorial.silicon = Silikon diproduksi.\n\nDisarankan Meningkatkan produktivitas. -tutorial.daggerfactory = Bangun[accent] pabrik robot "dagger".[]\n\nIni akan berguna untuk membuat robot penyerang. -tutorial.router = Pabrik butuh sumber daya untuk berfungsi.\nBuatlah pengalih untuk mengalihkan pengantar sumber daya. -tutorial.dagger = Sambungkan tiang listrik ke pabrik.\nSaat kebutuhan dicapai, robot akan diciptakan.\n\nBuatlah bor, generator dan pengantar secukupnya. -tutorial.battle = [LIGHT_GRAY] musuh[] telah mengungkapkan inti mereka.\nHancurkan dengan unitmu dan robot dagger. +tutorial.waves.mobile = The[lightgray] enemy[] approaches.\n\nDefend the core for 2 waves. Your ship will automatically fire at enemies.\nBuild more turrets and drills. Mine more copper. +tutorial.launch = Once you reach a specific wave, you are able to[accent] launch the core[], leaving your defenses behind and[accent] obtaining all the resources in your core.[]\nThese resources can then be used to research new technology.\n\n[accent]Press the launch button. item.copper.description = Bahan struktur yang berguna. Digunakan di semua tipe blok. item.lead.description = Bahan dasar di awal permainan. Digunakan di elektronik dan blok transportasi zat cair. item.metaglass.description = Kaca yang super-kuat. Digunakan untuk distribusi zar cair dan penyimpanan. @@ -896,13 +908,9 @@ unit.crawler.description = A ground unit consisting of a stripped-down frame wit 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.chaos-array.description = -unit.eradicator.description = unit.wraith.description = Unit tabrak-lari yang cepat. unit.ghoul.description = Pengebom kelas berat. unit.revenant.description = A heavy, hovering missile array. -unit.lich.description = -unit.reaper.description = block.graphite-press.description = Compresses chunks of coal into pure sheets of graphite. block.multi-press.description = An upgraded version of the graphite press. Employs water and power to process coal quickly and efficiently. block.silicon-smelter.description = Mengubah pasir dengan batu bara untuk memproduksi silikon. diff --git a/core/assets/bundles/bundle_it.properties b/core/assets/bundles/bundle_it.properties index bbeacb640e..a68ddd8082 100644 --- a/core/assets/bundles/bundle_it.properties +++ b/core/assets/bundles/bundle_it.properties @@ -43,6 +43,7 @@ newgame = Nuova partita none = minimap = Minimapa close = Chiuso +website = Website quit = Esci maps = Mappe continue = Continua @@ -71,6 +72,7 @@ server.kicked.nameEmpty = Il tuo nome deve contenere almeno un carattere. server.kicked.idInUse = Sei già su questo server! Non è permesso connettersi con due account. server.kicked.customClient = Questo server non supporta le build personalizzate. Scarica la versione ufficiale dal sito. server.kicked.gameover = Game over! +server.versions = Your version:[accent] {0}[]\nServer version:[accent] {1}[] host.info = Il pulsante [accent]hos [] ospita un server sulle porte [scarlet]6567[] e [scarlet]656.[] 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. join.info = Qui è possibile inserire un [accent]IP del server[] a cui connettersi, o scoprire [accento]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 = Host Server @@ -154,7 +156,10 @@ cancel = Annulla openlink = Apri Link copylink = Copia link back = Indietro +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 = Sei sicuro di voler uscire? +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]Caricamento in corso ... saving = [accent]Salvando . . . wave = [accent]Ondata {0} @@ -263,6 +268,7 @@ filters.empty = [LIGHT_GRAY]No filters! Add one with the button below. filter.distort = Modifica filter.noise = Interferenza filter.median = Median +filter.oremedian = Ore Median filter.blend = Blend filter.defaultores = Default Ores filter.ore = Minerali @@ -302,6 +308,7 @@ ping = Ping: {0}ms language.restart = Riavvia il gioco affinché il cambiamento della lingua abbia effetto. settings = Impostazioni tutorial = Tutorial +tutorial.retake = Re-Take Tutorial editor = Editor mapeditor = Editor Mappe donate = Dona @@ -315,8 +322,9 @@ bestwave = [LIGHT_GRAY]Best: {0} launch = Launch launch.title = Launch Successful launch.next = [LIGHT_GRAY]next opportunity at wave {0} -launch.unable = [scarlet]Unable to LAUNCH.[] Enemies. +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. @@ -352,6 +360,7 @@ 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. @@ -363,6 +372,7 @@ zone.overgrowth.description = This area is overgrown, closer to the source of th zone.tarFields.description = The outskirts of an oil production zone, between the mountains and desert. One of the few areas with usable tar reserves.\nAlthough abandoned, this area has some dangerous enemy forces nearby. Do not underestimate them.\n\n[lightgray]Research oil processing technology if possible. zone.desolateRift.description = An extremely dangerous zone. Plentiful resources, but little space. High risk of destruction. Leave as soon as possible. Do not be fooled by the long spacing between enemy attacks. zone.nuclearComplex.description = A former facility for the production and processing of thorium, reduced to ruins.\n[lightgray]Research the thorium and its many uses.\n\nThe enemy is present here in great numbers, constantly scouting for attackers. +zone.fungalPass.description = A transition area between high mountains and lower, spore-ridden lands. A small enemy reconnaissance base is located here.\nDestroy it.\nUse Dagger and Crawler units. Take out the two cores. zone.impact0078.description = zone.crags.description = settings.language = Lingua @@ -417,6 +427,7 @@ blocks.inaccuracy = Inaccuratezza blocks.shots = Colpi blocks.reload = Ricarica blocks.ammo = Ammo +bar.drilltierreq = Better Drill Required bar.drillspeed = Drill Speed: {0}/s bar.efficiency = Efficiency: {0}% bar.powerbalance = Power: {0} @@ -491,6 +502,7 @@ setting.lasers.name = Mostra Laser Energetici setting.pixelate.name = Pixelate [LIGHT_GRAY](may decrease performance) setting.minimap.name = Mostra minimappa setting.musicvol.name = Volume Musica +setting.ambientvol.name = Ambient Volume setting.mutemusic.name = Silenzia musica setting.sfxvol.name = Volume SFX setting.mutesound.name = Togli suoni @@ -819,9 +831,10 @@ block.container.name = Container block.launch-pad.name = Launch Pad block.launch-pad-large.name = Large Launch Pad team.blue.name = blue -team.red.name = red +team.crux.name = red +team.sharded.name = orange team.orange.name = orange -team.none.name = gray +team.derelict.name = derelict team.green.name = green team.purple.name = purple unit.spirit.name = Spirit Drone @@ -839,27 +852,26 @@ unit.chaos-array.name = Chaos Array unit.eradicator.name = Eradicator unit.lich.name = Lich unit.reaper.name = Reaper -tutorial.begin = Your mission here is to eradicate the[LIGHT_GRAY] enemy[].\n\nBegin by[accent] mining copper[]. Tap a copper ore vein near your core to do this. +tutorial.next = [lightgray] +tutorial.intro = You have entered the[scarlet] Mindustry Tutorial.[]\nBegin by[accent] mining copper[]. Tap a copper ore vein near your core to do this.\n\n[accent]{0}/{1} copper tutorial.drill = Mining manually is inefficient.\n[accent]Drills []can mine automatically.\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.[] tutorial.conveyor = [accent]Conveyors[] are used to transport items to the core.\nMake a line of conveyors from the drill to the core. -tutorial.morecopper = More copper is required.\n\nEither mine it manually, or place more drills. +tutorial.conveyor.mobile = [accent]Conveyors[] are used to transport items to the core.\nMake a line of conveyors from the drill to the core.\n[accent] Place in a line by holding down your finger for a few seconds[] and dragging in a direction.\n\n[accent]{0}/{1} conveyors placed in line\n[accent]0/1 items delivered tutorial.turret = Defensive structures must be built to repel the[LIGHT_GRAY] enemy[].\nBuild a duo turret near your base. tutorial.drillturret = Duo turrets require[accent] copper ammo []to shoot.\nPlace a drill next to the turret to supply it with mined copper. +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[LIGHT_GRAY] enemy[] approaches.\n\nDefend your core for 2 waves. Build more turrets. -tutorial.lead = More ores are available. Explore and mine[accent] lead[].\n\nDrag from your unit to the core to transfer resources. -tutorial.smelter = Copper and lead are weak metals.\nSuperior[accent] Dense Alloy[] can be created in a smelter.\n\nBuild one. -tutorial.densealloy = The smelter will now produce alloy.\nGet some.\nImprove the production if necessary. -tutorial.siliconsmelter = The core will now create a[accent] spirit drone[] for mining and repairing blocks.\n\nFactories for other units can be created with [accent] silicon.\nMake a silicon smelter. -tutorial.silicondrill = Silicon requires[accent] coal[] and[accent] sand[].\nStart by making drills. -tutorial.generator = This technology requires power.\nCreate a[accent] combustion generator[] for it. -tutorial.generatordrill = Combustion generators need fuel.\nFuel it with coal from a drill. -tutorial.node = Power requires transport.\nCreate a[accent] power node[] next to your combustion generator to transfer its power. -tutorial.nodelink = Power can be transferred through contacting power blocks and generators, or by linked power nodes.\n\nLink power by tapping the node and selecting the generator and silicon smelter. -tutorial.silicon = Silicon is being produced. Get some.\n\nImproving the production system is advised. -tutorial.daggerfactory = Construct a[accent] dagger mech factory.[]\n\nThis will be used to create attack mechs. -tutorial.router = Factories need resources to function.\nCreate a router to split conveyor resources. -tutorial.dagger = Link power nodes to the factory.\nOnce requirements are met, a mech will be created.\n\nCreate more drills, generators and conveyors as necessary. -tutorial.battle = The[LIGHT_GRAY] enemy[] has revealed their core.\nDestroy it with your unit and dagger mechs. +tutorial.waves.mobile = The[lightgray] enemy[] approaches.\n\nDefend the core for 2 waves. Your ship will automatically fire at enemies.\nBuild more turrets and drills. Mine more copper. +tutorial.launch = Once you reach a specific wave, you are able to[accent] launch the core[], leaving your defenses behind and[accent] obtaining all the resources in your core.[]\nThese resources can then be used to research new technology.\n\n[accent]Press the launch button. item.copper.description = Una utile materiale styrutturale. Molto usato in tutti i blocchi. item.lead.description = Un materiale base, molto usato nei blocchi di trasporto. item.metaglass.description = A super-tough glass compound. Extensively used for liquid distribution and storage. @@ -896,13 +908,9 @@ unit.crawler.description = A ground unit consisting of a stripped-down frame wit unit.titan.description = Un'unità di terra corazzata avanzata. Utilizza carburo come munizione. Attacca sia bersagli terrestri che aerei. unit.fortress.description = A heavy artillery ground unit. 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.chaos-array.description = -unit.eradicator.description = unit.wraith.description = A fast, hit-and-run interceptor unit. unit.ghoul.description = A heavy carpet bomber. Uses blast compound or pyratite as ammo. unit.revenant.description = A heavy, hovering missile array. -unit.lich.description = -unit.reaper.description = block.graphite-press.description = Compresses chunks of coal into pure sheets of graphite. block.multi-press.description = An upgraded version of the graphite press. Employs water and power to process coal quickly and efficiently. block.silicon-smelter.description = Reduces sand with highly pure coke in order to produce silicon. diff --git a/core/assets/bundles/bundle_ja.properties b/core/assets/bundles/bundle_ja.properties index 6723d2f603..1f4067ecdf 100644 --- a/core/assets/bundles/bundle_ja.properties +++ b/core/assets/bundles/bundle_ja.properties @@ -43,6 +43,7 @@ newgame = 新しく始める none = <なし> minimap = ミニマップ close = 閉じる +website = Website quit = 終了 maps = マップ continue = 続ける @@ -71,6 +72,7 @@ server.kicked.nameEmpty = 無効な名前です。 server.kicked.idInUse = すでにサーバーに参加しています! 二つのアカウントでの同時接続は許可されていません。 server.kicked.customClient = このサーバーはカスタムビルドをサポートしていません。公式版をダウンロードしてください。 server.kicked.gameover = ゲームオーバー! +server.versions = Your version:[accent] {0}[]\nServer version:[accent] {1}[] host.info = [accent]ホスト[]をすると、ポート[scarlet]6567[]でサーバーが開かれまます。\n同じ[LIGHT_GRAY]WiFiやローカル上のネットワークなど[]ではサーバーリストに表示されるようになります。\n\nIPアドレスで他のところからも接続できるようにするには、[accent]ポート開放[]が必要です。\n\n注意: もしLAN上のゲームに参加できない場合、Mindustryがファイアーウォールの設定でローカルネットワークへの接続が許可されているかを確認してください。 join.info = ここでは、[accent]サーバーのIPアドレス[]から接続したり、[accent]ローカル上[]のサーバーを探したりすることができます。\nLANやWAN上の両方のマルチプレイに対応しています。\n\n[LIGHT_GRAY]注意: 世界中のサーバーの一覧ではありません。他人のサーバーにIPアドレスで接続したい場合は、あらかじめホスト側にIPアドレスをお尋ねください。 hostserver = ホスト @@ -154,7 +156,10 @@ cancel = キャンセル openlink = リンクを開く copylink = リンクをコピー back = 戻る +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 = 終了してもよろしいですか? +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]読み込み中... saving = [accent]保存中... wave = [accent]ウェーブ {0} @@ -263,6 +268,7 @@ filters.empty = [LIGHT_GRAY]フィルターが設定されていません! 下 filter.distort = ゆがみ filter.noise = ノイズ filter.median = Median +filter.oremedian = Ore Median filter.blend = Blend filter.defaultores = Default Ores filter.ore = 鉱石 @@ -302,6 +308,7 @@ ping = Ping: {0}ms language.restart = ゲームを再起動後、言語設定が有効になります。 settings = 設定 tutorial = チュートリアル +tutorial.retake = Re-Take Tutorial editor = エディター mapeditor = マップエディター donate = 寄附 @@ -315,8 +322,9 @@ bestwave = [LIGHT_GRAY]最高ウェーブ: {0} launch = 発射 launch.title = 発射成功 launch.next = [LIGHT_GRAY]次の発射は ウェーブ {0} -launch.unable = [scarlet]発射できません[] 敵によって妨害されています。 +launch.unable2 = [scarlet]Unable to LAUNCH.[] launch.confirm = すべての資源がコアに搬入されます。\nもうこの基地には戻ってくることはできません。 +launch.skip.confirm = If you skip now, you will not be able to launch until later waves. uncover = 開放 configure = 積荷の設定 configure.locked = [LIGHT_GRAY]ウェーブ {0} を達成すると積荷を設定できるようになります。 @@ -352,6 +360,7 @@ zone.tarFields.name = ター · フィールズ 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. @@ -363,6 +372,7 @@ zone.overgrowth.description = This area is overgrown, closer to the source of th zone.tarFields.description = The outskirts of an oil production zone, between the mountains and desert. One of the few areas with usable tar reserves.\nAlthough abandoned, this area has some dangerous enemy forces nearby. Do not underestimate them.\n\n[lightgray]Research oil processing technology if possible. zone.desolateRift.description = An extremely dangerous zone. Plentiful resources, but little space. High risk of destruction. Leave as soon as possible. Do not be fooled by the long spacing between enemy attacks. zone.nuclearComplex.description = A former facility for the production and processing of thorium, reduced to ruins.\n[lightgray]Research the thorium and its many uses.\n\nThe enemy is present here in great numbers, constantly scouting for attackers. +zone.fungalPass.description = A transition area between high mountains and lower, spore-ridden lands. A small enemy reconnaissance base is located here.\nDestroy it.\nUse Dagger and Crawler units. Take out the two cores. zone.impact0078.description = zone.crags.description = settings.language = 言語 @@ -417,6 +427,7 @@ blocks.inaccuracy = 精度のずれ blocks.shots = ショット blocks.reload = ショット/秒 blocks.ammo = 弾薬 +bar.drilltierreq = Better Drill Required bar.drillspeed = 採掘速度: {0}/秒 bar.efficiency = 効率: {0}% bar.powerbalance = 電力: {0}/秒 @@ -491,6 +502,7 @@ setting.lasers.name = 電力線を表示 setting.pixelate.name = ピクセル化 [LIGHT_GRAY](パフォーマンスが低下する可能性があります) setting.minimap.name = ミニマップを表示 setting.musicvol.name = 音楽 音量 +setting.ambientvol.name = Ambient Volume setting.mutemusic.name = 音楽をミュート setting.sfxvol.name = 効果音 音量 setting.mutesound.name = 効果音をミュート @@ -819,9 +831,10 @@ block.container.name = コンテナー block.launch-pad.name = 発射台 block.launch-pad-large.name = 大型発射台 team.blue.name = ブルー -team.red.name = レッド +team.crux.name = red +team.sharded.name = orange team.orange.name = オレンジ -team.none.name = グレー +team.derelict.name = derelict team.green.name = グリーン team.purple.name = パープル unit.spirit.name = スピリットドローン @@ -839,27 +852,26 @@ unit.chaos-array.name = ケアスアレー unit.eradicator.name = エラディケーター unit.lich.name = リッチ unit.reaper.name = リーパー -tutorial.begin = ここでのミッションは[LIGHT_GRAY]敵[]を倒すことです。\n\nまずは、[accent]銅の採掘[]から始めましょう。コアの近くの銅鉱石の鉱脈をタップしましょう。 +tutorial.next = [lightgray] +tutorial.intro = You have entered the[scarlet] Mindustry Tutorial.[]\nBegin by[accent] mining copper[]. Tap a copper ore vein near your core to do this.\n\n[accent]{0}/{1} copper tutorial.drill = 手動で採掘するのは非効率的です。\n[accent]ドリル[]を使えば自動で採掘できます。\n銅鉱石の鉱脈の上に1つ置いてみましょう。 +tutorial.drill.mobile = Mining manually is inefficient.\n[accent]Drills []can mine automatically.\nTap the drill tab in the bottom right.\nSelect the[accent] mechanical drill[].\nPlace it on a copper vein by tapping, then press the[accent] checkmark[] below to confirm your selection.\nPress the[accent] X button[] to cancel placement. +tutorial.blockinfo = Each block has different stats. Each drill can only mine certain ores.\nTo check a block's info and stats,[accent] tap the "?" button while selecting it in the build menu.[]\n\n[accent]Access the Mechanical Drill's stats now.[] tutorial.conveyor = [accent]コンベアー[]はコアにアイテムを輸送することができます。\nドリルからコアまでコンベアー作りましょう。 -tutorial.morecopper = まだまだ銅が必要です。\n\n手動で採掘するか、ドリルをもっと設置しましょう。 +tutorial.conveyor.mobile = [accent]Conveyors[] are used to transport items to the core.\nMake a line of conveyors from the drill to the core.\n[accent] Place in a line by holding down your finger for a few seconds[] and dragging in a direction.\n\n[accent]{0}/{1} conveyors placed in line\n[accent]0/1 items delivered tutorial.turret = [LIGHT_GRAY]敵[]を撃退するために防衛体制を作らなければなりません。\n基地の近くにターレットのデュオを設置しましょう。 tutorial.drillturret = デュオには弾として[accent]銅の弾薬[]が必要です。\nデュオの横にドリルを置き、採掘した銅を供給しましょう。 +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 = [LIGHT_GRAY]敵[]が近づいてきます。\n\n2ウェーブの間、コアを守ってください。ターレットをもっと設置しましょう。 -tutorial.lead = 他の鉱石も使ってみましょう。[accent]鉛[]を見つけて、採掘しましょう。\n\nユニットからコアにドラッグして、資源を転送できます。 -tutorial.smelter = 銅を鉛はやわらかい金属です。\nより硬い[accent]高密度合金[]を溶鉱炉で作りましょう。 -tutorial.densealloy = 溶鉱炉で作った合金を回収しましょう。\n\nまた、必要に応じて効率化しましょう。 -tutorial.siliconsmelter = コアは、採掘やブロックの修復のために[accent]スピリットドローン[]を作成しています。\n\n他のユニットを作るには[accent]シリコン[]が必要です。\nシリコン溶鉱炉を作りましょう。 -tutorial.silicondrill = シリコンには[accent]石炭[]と[accent]砂[]が必要です。\nまず、ドリルを作りましょう。 -tutorial.generator = この技術には電力が必要です。\n[accent]火力発電機[]を作りましょう。 -tutorial.generatordrill = 火力発電機には燃料が必要です。\nドリルから石炭を補給しましょう。 -tutorial.node = 電力を送電する必要があります。\n火力発電機の隣に[accent]電源ノード[]を作って、電力を供給しましょう。 -tutorial.nodelink = 電力は隣接している電力ブロックや発電機、接続された状態の電源ノードを使って送電することができます。\n\nノードをタップしてから、発電機とシリコン溶鉱炉を選択して電力を繋げましょう。 -tutorial.silicon = シリコン溶鉱炉で製造したシリコンを回収しましょう。\n\nまた、効率化をすることをお勧めします。 -tutorial.daggerfactory = [accent]ダガーユニット製造機[]を作りましょう。\n\nこれを使うと攻撃ユニットを作ってくれます。 -tutorial.router = 生産機には電力が必要です。\nコンベアーから資源を分けるためにルーターを作りましょう。 -tutorial.dagger = 電源ノードを生産機に接続しましょう。\n要件が揃うと、ユニットを作り始めます。\n\n必要に応じて、ドリルや発電機、コンベアーを増やしましょう。 -tutorial.battle = [LIGHT_GRAY]敵[]のコアが見つかりました。\nユニットやダガー機で敵の基地を破壊しましょう。 +tutorial.waves.mobile = The[lightgray] enemy[] approaches.\n\nDefend the core for 2 waves. Your ship will automatically fire at enemies.\nBuild more turrets and drills. Mine more copper. +tutorial.launch = Once you reach a specific wave, you are able to[accent] launch the core[], leaving your defenses behind and[accent] obtaining all the resources in your core.[]\nThese resources can then be used to research new technology.\n\n[accent]Press the launch button. item.copper.description = 便利な鉱石です。様々なブロックの材料として幅広く使われています。 item.lead.description = 一般的で手軽な鉱石です。機械や液体輸送ブロックなどに使われます。 item.metaglass.description = とても頑丈な強化ガラスです。液体の輸送やタンクとして幅広く使われています。 @@ -896,13 +908,9 @@ unit.crawler.description = A ground unit consisting of a stripped-down frame wit unit.titan.description = 高度な武装地上ユニットです。空と地上の両方の敵に攻撃を行います。 unit.fortress.description = 砲撃型の地上ユニットです。 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.chaos-array.description = -unit.eradicator.description = unit.wraith.description = 高速で突撃攻撃が可能な迎撃ユニットです。 unit.ghoul.description = 重爆撃機です。 unit.revenant.description = A heavy, hovering missile array. -unit.lich.description = -unit.reaper.description = block.graphite-press.description = Compresses chunks of coal into pure sheets of graphite. block.multi-press.description = An upgraded version of the graphite press. Employs water and power to process coal quickly and efficiently. block.silicon-smelter.description = 石炭と砂からシリコンを製造します。 diff --git a/core/assets/bundles/bundle_ko.properties b/core/assets/bundles/bundle_ko.properties index 4720f31af5..2f49db778e 100644 --- a/core/assets/bundles/bundle_ko.properties +++ b/core/assets/bundles/bundle_ko.properties @@ -16,7 +16,6 @@ screenshot.invalid = 맵이 너무 커서 스크린샷을 찍을 메모리가 gameover = 게임 오버 gameover.pvp = [accent]{0}[] 팀이 승리했습니다! highscore = [accent]최고점수 달성! - stat.wave = 웨이브 성공:[accent]{0} stat.enemiesDestroyed = 파괴한 적 수:[accent]{0} stat.built = 건설한 건물 수:[accent]{0} @@ -24,10 +23,8 @@ stat.destroyed = 파괴된 건물 수:[accent]{0} stat.deconstructed = 파괴한 건물 수:[accent]{0} stat.delivered = 획득한 자원: stat.rank = 최종 기록: [accent]{0} - placeline = 블록을 선택하셨습니다.\n][accent]몇초간 설치 시작지점을 누르고[] 원하는 방향을 향해 드래그 하면 [accent]일렬로[] 설치할 수 있습니다.\n한번 해 보세요. removearea = 블록 제거모드를 선택하셨습니다.\n[accent]몇초간 제거 시작지점을 누르고[] 원하는 구역 끝을 향해 드래그 하면 [accent]직사각형[] 안에 있는 모든 건물을 제거할 수 있습니다.\n한번 해 보세요. - launcheditems = [accent]창고 map.delete = 정말로 "[accent]{0}[]" 맵을 삭제하시겠습니까?\n level.highscore = 최고 점수: [accent]{0} @@ -75,8 +72,9 @@ 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로 다른 사람의 서버에 접속할려면 서버장에게 IP를 요청해야 합니다.[]\n\n[ROYAL]한국의 공식 서버로는 mindustry.kr의 7000,7001,7002포트와 server1.mindustry.r-e.kr의 8000,8001,8002,8004포트가 있습니다.\n서버 주소 입력방법은 < 주소:포트 >의 형식입니다. +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서버 주소 입력방법은 < 주소:포트 >의 형식입니다. hostserver = 서버 열기 hostserver.mobile = 서버\n열기 host = 서버 열기 @@ -208,7 +206,7 @@ waves.copy = 클립보드로 복사 waves.load = 클립보드에서 불러오기 waves.invalid = 클립보드의 잘못된 웨이브 데이터 waves.copied = 웨이브 복사됨 -wave.none = 적이 설정되지 않음.\n빈 웨이브 설정값은 자동으로 기본 웨이브 설정값으로 바뀝니다. +waves.none = No enemies defined.\nNote that empty wave layouts will automatically be replaced with the default layout. editor.default = [LIGHT_GRAY]<기본값> edit = 편집 editor.name = 이름: @@ -252,7 +250,6 @@ editor.mapname = 맵 이름: editor.overwrite = [accept]경고!이 명령은 기존 맵을 덮어씌우게 됩니다. editor.overwrite.confirm = [scarlet]경고![] 이 이름을 가진 맵이 이미 있습니다. 덮어 쓰시겠습니까? editor.selectmap = 불러올 맵 선택: - toolmode.replace = 재배치 toolmode.replace.description = 블록을 배치합니다. toolmode.replaceall = 모두 재배치 @@ -267,7 +264,6 @@ toolmode.fillteams = 팀 채우기 toolmode.fillteams.description = 블록 대신 팀 건물로 채웁니다. toolmode.drawteams = 팀 그리기 toolmode.drawteams.description = 블록 대신 팀 건물을 배치합니다. - filters.empty = [LIGHT_GRAY]필터가 없습니다!! 아래 버튼을 눌러 추가하세요. filter.distort = 왜곡 filter.noise = 맵 전체에 타일 혹은 블럭 뿌리기 @@ -299,7 +295,6 @@ filter.option.floor2 = 2번째 바닥 filter.option.threshold2 = 2번째 한계점 filter.option.radius = 반경 filter.option.percentile = 백분위수 - width = 넓이: height = 높이: menu = 메뉴 @@ -317,7 +312,6 @@ tutorial.retake = 튜토리얼 editor = 편집기 mapeditor = 맵 편집기 donate = 기부 - abandon = 포기 abandon.text = 이 구역의 모든 자원이 적에게 빼앗길 것입니다. locked = 잠김 @@ -328,7 +322,7 @@ bestwave = [LIGHT_GRAY]최고 점수: {0} launch = < 출격 > launch.title = 출격 성공 launch.next = [LIGHT_GRAY]다음 출격기회는 {0} 단계에서 나타납니다. -launch.unable2 = [scarlet]출격할 수 없습니다.[] {0}마리 남음. +launch.unable2 = [scarlet]출격할 수 없습니다.[] launch.confirm = 출격하게 되면 모든 자원이 코어로 들어갑니다.\n또한 성공하기 전까지 기지로 돌아갈 수 없습니다. launch.skip.confirm = 만약 지금 출격하시지 않고 스킵하신다면, 다음 출격 웨이브까지 기다려야 합니다. uncover = 구역 개방 @@ -343,7 +337,6 @@ zone.objective.survival = 생존 zone.objective.attack = 적 코어 파괴 add = 추가... boss.health = 보스 체력 - connectfail = [crimson]{0}[accent] 서버에 연결하지 못했습니다.[] error.unreachable = 서버에 연결하지 못했습니다.\n서버 주소가 정확히 입력되었나요? error.invalidaddress = 잘못된 주소입니다. @@ -354,7 +347,6 @@ error.mapnotfound = 맵 파일을 찾을 수 없습니다! error.io = 네트워크 I/O 오류. error.any = 알 수 없는 네트워크 오류. error.bloom = 블룸 그래픽 효과를 적용하지 못했습니다.\n당신의 기기가 이 기능을 지원하지 않는 것일 수도 있습니다. - zone.groundZero.name = 전초기지 zone.desertWastes.name = 쓰레기 사막 zone.craters.name = 크레이터 @@ -369,7 +361,6 @@ zone.saltFlats.name = 소금 사막 zone.impact0078.name = Impact 0078 zone.crags.name = 협곡 zone.fungalPass.name = 포자 지대 - zone.groundZero.description = 이 장소는 다시 시작하기에 최적의 환경을 지닌 장소입니다. 적은 수준의 위협이 있으며 자원의 양은 적습니다.\n가능한 한 많은 양의 구리와 납을 수집하십시오.\n출격합시다! zone.frozenForest.description = 이 지역도 산과 가까운 지역입니다 포자들이 흩뿌려져 있으며 극한의 추위도 포자룰 막을 수 있을거 같지 않습니다.\n전력을 통해서 모험을 시작하십시오 화력 발전소를 짓고 수리드론을 사용하는 법을 배우십시오. zone.desertWastes.description = 이 황무지는 끝을 알수 없을 정도로 광활합니다 그리고 십자가 형태의 버려진 구조물이 존재합니다.\n석탄이 존재하며 이를 화력발전에 쓰거나 흑연정제에 쓰십시오.\n\n[lightgray]이 지역에서의 착륙장소는 확실하지 않습니다. @@ -384,7 +375,6 @@ zone.nuclearComplex.description = 과거 토륨의 생산, 연구와 처리를 zone.fungalPass.description = 고산지대과 포자지대 사이의 지역입니다. 소규모의 적 정찰기지가 있으니 디거와 크롤러를 이용해 적의 코어를 파괴하십시오. zone.impact0078.description = [ROYAL]죄송합니다. 아직 설명이 준비되지 않았습니다. zone.crags.description = [ROYAL]죄송합니다. 아직 설명이 준비되지 않았습니다. - settings.language = 언어 settings.reset = 설정 초기화 settings.rebind = 키 재설정 @@ -437,8 +427,7 @@ blocks.inaccuracy = 오차각 blocks.shots = 발포 횟수 blocks.reload = 재장전 blocks.ammo = 탄약 - -bar.drilltierreq = 드릴이 요구됨 +bar.drilltierreq = 드릴이 요구됨 bar.drillspeed = 채광 속도 : {0}/s bar.efficiency = 효율성 : {0}% bar.powerbalance = 전력 : {0}/s @@ -450,7 +439,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]방화 @@ -462,7 +450,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 = 액체/초 @@ -572,7 +559,6 @@ mode.pvp.description = 실제 플레이어와 PvP를 합니다. 맵에 적어도 mode.attack.name = 공격 mode.attack.description = 적 기지를 파괴하세요. 맵에 빨간팀 코어가 있어야 플레이 가능합니다. mode.custom = 사용자 정의 규칙 - rules.infiniteresources = 무한 자원 rules.wavetimer = 웨이브 타이머 rules.waves = 웨이브 @@ -599,7 +585,6 @@ rules.title.resourcesbuilding = 자원 & 건축 rules.title.player = 플레이어들 rules.title.enemy = 적 rules.title.unit = 유닛 - content.item.name = 아이템 content.liquid.name = 액체 content.unit.name = 유닛 @@ -613,7 +598,7 @@ item.titanium.name = 티타늄 item.thorium.name = 토륨 item.silicon.name = 실리콘 item.plastanium.name = 플라스터늄 -item.phase-fabric.name = 현상 구조체 +item.phase-fabric.name = 메타 item.surge-alloy.name = 서지 합금 item.spore-pod.name = 포자 포드 item.sand.name = 모래 @@ -661,7 +646,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 = 소금 @@ -737,8 +721,8 @@ block.copper-wall.name = 구리 벽 block.copper-wall-large.name = 대형 구리 벽 block.titanium-wall.name = 티타늄 벽 block.titanium-wall-large.name = 대형 티타늄 벽 -block.phase-wall.name = 위상 벽 -block.phase-wall-large.name = 대형 위상 벽 +block.phase-wall.name = 메타 벽 +block.phase-wall-large.name = 대형 메타 벽 block.thorium-wall.name = 토륨 벽 block.thorium-wall-large.name = 대형 토륨 벽 block.door.name = 문 @@ -756,7 +740,7 @@ block.distributor.name = 대형 분배기 block.sorter.name = 필터 block.overflow-gate.name = 오버플로 게이트 block.silicon-smelter.name = 실리콘 제련소 -block.phase-weaver.name = 현상구조체 합성기 +block.phase-weaver.name = 메타 합성기 block.pulverizer.name = 분쇄기 block.cryofluidmixer.name = 냉각수 제조기 block.melter.name = 융해기 @@ -798,9 +782,9 @@ block.wave.name = 파도 block.swarmer.name = 스웜 block.salvo.name = 살보 block.ripple.name = 립플 -block.phase-conveyor.name = 위상 컨베이어 +block.phase-conveyor.name = 메타 컨베이어 block.bridge-conveyor.name = 터널 컨베이어 -block.plastanium-compressor.name = 플라스 압축기 +block.plastanium-compressor.name = 플라스터늄 압축기 block.pyratite-mixer.name = 파이라타이트 혼합기 block.blast-mixer.name = 폭발물 혼합기 block.solar-panel.name = 태양 전지판 @@ -818,7 +802,7 @@ block.fortress-factory.name = 포트리스 기체 공장 block.revenant-factory.name = 망령 전함 공장 block.repair-point.name = 수리 지점 block.pulse-conduit.name = 퓨즈 파이프 -block.phase-conduit.name = 위상 파이프 +block.phase-conduit.name = 메타 파이프 block.liquid-router.name = 액체 분배기 block.liquid-tank.name = 물탱크 block.liquid-junction.name = 액체 교차기 @@ -888,20 +872,18 @@ tutorial.deposit = 자원을 다시 블록에 넣을수도 있습니다.\n\n[acc 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 = 초강력 유리 화합물. 액체 분배 및 저장에 광범위하게 사용됩니다. +item.metaglass.description = 초강력 유리 화합물. 액체 분배 및 저장에 광범위하게 사용됩니다.\n\n[royal]빨리 생산할수록 게임이 편해집니다. item.graphite.description = 탄약 및 전기 절연에 사용되는 광물질화 탄소. -item.sand.description = 고밀도 합금을 제작할 때 사용되는 일반적인 재료입니다. +item.sand.description = 고티어 합금을 제작할 때 사용되는 일반적인 재료입니다. item.coal.description = 흔하고 쉽게 구할 수 있는 연료. item.titanium.description = 파이프 재료나 고급 드릴, 비행기/기체 등에서 재료로 사용되는 자원입니다. item.thorium.description = 건물의 재료, 터렛의 탄약 또는 핵연료로 사용되는 방사성 금속입니다. -item.scrap.description = 오래된 건물과 유닛의 남은 잔해. 미량의 많은 금속이 포함되어 있습니다. -item.silicon.description = 매우 유용한 반도체로, 기체를 만들거나 태양 전지판 등 전자 건물에 사용할 수 있습니다. +item.scrap.description = 오래된 건물과 유닛의 남은 잔해. 미량의 다양한 금속들이 포함되어 있습니다. +item.silicon.description = 매우 유용한 물질로, 기체를 만들거나 태양 전지판 등 전자 건물에 사용할 수 있습니다.\n\n[royal]이 것이 생산되면 발전속도가 급속도로 빨라집니다. item.plastanium.description = 고급 항공기 및 분열 탄약에 사용되는 가벼운 연성 재료. -item.phase-fabric.description = 최첨단 전자 제품과 자기수리 기술에 사용되는 거의 무중력에 가까운 물질입니다. +item.phase-fabric.description = 최첨단 전자 제품과 자기수리 기술에 사용되는 거의 무중력에 가까운 물질입니다.\n\n[royal]직물이면서 직물이 아니랍니다. item.surge-alloy.description = 순간적으로 전압이 증가하는 전기 특성을 가진 고급 합금입니다. item.spore-pod.description = 석유를 만들거나 탄약과 합성해 연료로 전환하는데 사용됩니다. item.blast-compound.description = 터렛 및 건설의 재료로 사용되는 휘발성 폭발물.\n연료로도 사용할 수 있지만, 별로 추천하지는 않습니다. @@ -929,16 +911,12 @@ unit.eruptor.description = 지상 유닛. 광재를 넣은 파도와 같은 무 unit.wraith.description = 적 핵심 건물 및 유닛을 집중적으로 공격하는 방식을 사용하는 전투기 입니다. unit.ghoul.description = 무겁고 튼튼한 지상 폭격기 입니다.\n주로 적 건물로 이동하여 엄청난 폭격을 가합니다. unit.revenant.description = 플래이어가 생산가능한 최종 공중 전투기. 폭발물을 쓰는 스웜 포탑과 같은 무기를 사용합니다. -unit.chaos-array.description = 지상 중간보스 유닛. 설금을 넣은 사이클론과 같은 무기를 장착했습니다. -unit.eradicator.description = 지상 최종보스 유닛. 토륨을 넣은 스펙터와 같은 무기를 장착했습니다. -unit.lich.description = 공중 중간보스 유닛. 리치와 같은 무기를 장착했으나 공격속도가 좀 더 빠릅니다. -unit.reaper.description = 최종보스 유닛. 박멸과 같은 무기를 장착했고, 공격속도가 좀 더 빠르며, 매우 단단합니다. block.graphite-press.description = 석탄 덩어리를 흑연으로 압축합니다. block.multi-press.description = 흑연 압축기의 상향 버전입니다. 물과 전력을 이용해 석탄을 빠르고 효율적으로 압축합니다. -block.silicon-smelter.description = 고순도 석탄으로 모래를 줄여 실리콘을 생산합니다. +block.silicon-smelter.description = 석탄과 모래를 사용해 실리콘을 생산합니다. block.kiln.description = 모래와 납을 사용해 강화유리를 만듭니다. 소량의 전력이 필요합니다. -block.plastanium-compressor.description = 석유와 티타늄으로 플라스틱을 생산합니다. -block.phase-weaver.description = 방사능 토륨과 많은 량의 모래에서 상직물을 생산합니다. +block.plastanium-compressor.description = 석유와 티타늄으로 플라스터늄을 생산합니다. +block.phase-weaver.description = 토륨과 많은 량의 모래로 메타를 합성합니다. block.alloy-smelter.description = 티타늄, 납, 실리콘, 구리로부터 서지 합금을 생산합니다. block.cryofluidmixer.description = 물과 티타늄을 냉각에 훨씬 더 효과적인 냉동액으로 결합시킵니다. block.blast-mixer.description = 포자를 사용하여 파이라타이트를 폭발성 화합물로 변환시킵니다. @@ -961,7 +939,7 @@ block.titanium-wall-large.description = 티타늄 벽 4개를 뭉친 블럭입 block.thorium-wall.description = 쉬운 생산이 가능한 마지막 방어벽입니다. block.thorium-wall-large.description = 토륨 벽 4개를 뭉친 블럭입니다. block.phase-wall.description = 토륨 벽만큼 강하지 않지만 벽을 향해 날아오는 총알이 너무 강력하지 않으면 총알을 튕겨냅니다. -block.phase-wall-large.description = 위상 벽 4개를 뭉친 블럭입니다. +block.phase-wall-large.description = 메타 벽 4개를 뭉친 블럭입니다. block.surge-wall.description = 공격을 받으면 낮은 확률로 공격자에게 전격 공격을 합니다. block.surge-wall-large.description = 설금 벽 4개를 뭉친 블럭입니다. block.door.description = 눌러서 열고 닫을 수 있는 문.\n만약 문이 열리면, 적들은 총을 쏘며 문을 통과할 수 있습니다. @@ -1001,8 +979,8 @@ block.thermal-generator.description = 건설가능한 열이 있는 타일 위 block.turbine-generator.description = 화력 발전기보다 효율적이지만, 액체가 추가적으로 필요합니다.\n\n[ROYAL]3*2<7.8 block.differential-generator.description = 냉각수와 파이라타이트의 온도 차를 이용해 안정적으로 원자로에 버금가는 양의 전기를 생산합니다. block.rtg-generator.description = 방사성동위원소 열전기 발전기\n토륨또는 현상 구조체를 사용하며, 냉각이 필요없는 발전을 하지만 토륨 원자로에 비해 발전량이 매우 적습니다. -block.solar-panel.description = 태양광으로 극소량의 전기을 생산합니다. -block.solar-panel-large.description = 일반 태양 전지판보다 훨씬 나은 발전량이 많지만, 건축비도 훨씬 비쌉니다. +block.solar-panel.description = 태양광으로 극소량의 전기을 생산합니다.\n\n[royal]??? : [][yellow]PRAISE THE SUN [T]/ +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]구리와 납은 광부 드론으로 대체가 가능합니다. @@ -1015,23 +993,23 @@ block.oil-extractor.description = 대량의 전력과 물을 사용하여 모래 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]언로더[]를 사용하여 금고에서 물건을 회수할 수 있습니다. -block.container.description = 각종 소량의 자원을 저장할 수 있습니다.[LIGHT_GRAY]언로더[]를 사용하여 컨테이너에서 자원을 회수할 수 있습니다. +block.vault.description = 각종 대량의 자원을 저장할 수 있습니다.[LIGHT_GRAY]언로더[]를 사용하여 창고에서 물건을 회수할 수 있습니다.\n\n[royal]포탑의 탄약, ☆핵융합로의 폭발물☆, 원자로 냉각수의 티타늄등 여러 자원들의 여분을 미리 저장하여 혹시모를 사태를 예방하세요. +block.container.description = 각종 소량의 자원을 저장할 수 있습니다.[LIGHT_GRAY]언로더[]를 사용하여 컨테이너에서 자원을 회수할 수 있습니다.\n\n[royal]또는 컨테이너를 클릭하고 자원을 눌러 자원을 강탈해갈수도 있습니다. block.unloader.description = 컨테이너, 창고 또는 코어에서 인접한 블록으로 자원을 출하합니다. 출하시킬 자원의 종류는 언로더를 눌러 지정할 수 있습니다. -block.launch-pad.description = 출격할 필요 없이 자원을 수송시킵시다. +block.launch-pad.description = 출격할 필요 없이 자원을 수송시킵시다.\n\n[royal]아ㅏㅏ 코어에 출격패드 연결하고 잠수타지 마라잉? 손모가지 날아가뿌릴라! block.launch-pad-large.description = 출격 패드의 강화버전\n더 많은 자원을 더 자주 출격시킵니다.\n\n[ROYAL]크기도 더 크다죠 block.duo.description = 소형 포탑입니다.\n가장 기본적인 포탑으로 약한 탄환을 발사합니다. -block.scatter.description = 중형 대공 포탑입니다. 납이나 고철 덩어리를 적에게 쏩니다. -block.scorch.description = 화염방사포탑. 사거리가 짧기 때문인지 지상유닛 상대로는 최고의 공격력을 보여줍니다. +block.scatter.description = 중형 대공 포탑입니다.\n납이나 고철 덩어리를 적에게 쏩니다. +block.scorch.description = 소형 포탑입니다.\n지상의 적을 매우 강력한 화염으로 지져버립니다. 사거리가 짧고 지상만 공격 가능한 것 때문인지 지상유닛 상대로는 최고의 공격력을 보여줍니다.\n\n[royal]너무 빨리 모든 것을 태우다보니 건물에는 불이 안 붙더군요. block.hail.description = 소형 포탑입니다.\n장거리로 포탄을 발사합니다. block.wave.description = 중형 포탑입니다. 대상에게 포탑에 공급된 액체를 발사합니다. 물또는 냉각수가 공급되면 자동으로 불을 끕니다. block.lancer.description = 중형 포탑입니다.\n적을 레이저로 관통합니다. -block.arc.description = 소형 포탑입니다.\n적을 전기로 지집니다. +block.arc.description = 소형 포탑입니다.\n적을 전기로 지집니다.\n\n[royal]63 : JSA!!\n88 : 이젠..아니야... block.swarmer.description = 중형 포탑입니다.\n지상과 공중 적 모두를 공격하는 유도 미사일 포탑입니다. block.salvo.description = 중형 포탑입니다.\n3연발 탄환을 발사합니다. +block.fuse.description = 대형 포탑입니다.\n강력한 단거리 빔을 쏩니다. block.ripple.description = 대형 포탑입니다.\n여러 발의 사격을 동시에 합니다. block.cyclone.description = 대형 포탑입니다.\n초고속으로 사격합니다. -block.fuse.description = 대형 포탑입니다.\n강력한 단거리 빔을 쏩니다. block.spectre.description = 초대형 포탑입니다.\n한 번에 두 발의 강력한 총알을 쏩니다. block.meltdown.description = 초대형 포탑.\n장거리의 강력한 열광선을 발사합니다. block.draug-factory.description = 구리와 납을 캐는 채광 드론을 생산합니다.\n\n[ROYAL]이 드론은 영혼을 가지고 있습니다. @@ -1040,8 +1018,8 @@ block.phantom-factory.description = 건설을 도와주는 빌더 드론을 생 block.wraith-factory.description = 빠른 뺑소니 요격기 유닛을 생산합니다.\n\n[ROYAL]?:저거 안죽어요??\n??:님 인터넷을 확인해보셈\n?:아 왠지 기체가 이상한 곳을 조준하더라.. block.ghoul-factory.description = 중탄두 폭격기를 생산합니다.\n\n[ROYAL]적 위를 유령처럼 맴돕니다. block.revenant-factory.description = 중량의 폭발물 스웜 포대를 가진 전함을 생산합니다.\n\n[ROYAL]캠페인과 사용자 정의 게임에서 ai가 다른 대표적인 유닛이라죠. -block.crawler-factory.description = 자폭하는 지상 유닛을 생산합니다.\n\n[ROYAL] block.dagger-factory.description = 기본 지상 유닛을 생산합니다.\n\n[ROYAL]원래대로라면 대거라 읽어야 되지만 총을 쏜다는 것이 이상하기도 해서 한국 커뮤니티에서는 그냥 디거라 부른다죠. 그게 좀 더 입에 붙잖아요? +block.crawler-factory.description = 자폭하는 지상 유닛을 생산합니다.\n\n[ROYAL]개복치. block.titan-factory.description = 화염방사기를 장착한 지상유닛를 생산합니다.\n\n[ROYAL]최강이 될 수도, 최약이 될 수도 있습니다. block.fortress-factory.description = 중대포 지상유닛를 생산합니다. block.repair-point.description = 주변에서 가장 가까운 손상된 유닛을 지속적으로 치료합니다.\n\n[ROYAL]이 것으로 플래이어는 지속적인 교전이 가능해집니다. diff --git a/core/assets/bundles/bundle_nl.properties b/core/assets/bundles/bundle_nl.properties index 7415af20b5..e15caebf54 100644 --- a/core/assets/bundles/bundle_nl.properties +++ b/core/assets/bundles/bundle_nl.properties @@ -43,6 +43,7 @@ newgame = New Game none = minimap = Minimap close = Close +website = Website quit = Quit maps = Maps continue = Continue @@ -71,6 +72,7 @@ server.kicked.nameEmpty = Your chosen name is invalid. server.kicked.idInUse = You are already on this server! Connecting with two accounts is not permitted. server.kicked.customClient = This server does not support custom builds. Download an official version. server.kicked.gameover = Game over! +server.versions = Your version:[accent] {0}[]\nServer version:[accent] {1}[] host.info = The [accent]host[] button hosts a server on port [scarlet]6567[]. \nAnybody on the same [LIGHT_GRAY]wifi or local network[] should be able to see your server in their server list.\n\nIf you want people to be able to connect from anywhere by IP, [accent]port forwarding[] is required.\n\n[LIGHT_GRAY]Note: If someone is experiencing trouble connecting to your LAN game, make sure you have allowed Mindustry access to your local network in your firewall settings. join.info = Here, you can enter a [accent]server IP[] to connect to, or discover [accent]local network[] servers to connect to.\nBoth LAN and WAN multiplayer is supported.\n\n[LIGHT_GRAY]Note: There is no automatic global server list; if you want to connect to someone by IP, you would need to ask the host for their IP. hostserver = Host Game @@ -154,7 +156,10 @@ cancel = Cancel openlink = Open Link copylink = Copy Link back = Back +classic.export = Export Classic Data +classic.export.text = [accent]Mindustry[] has just had a major update.\nClassic (v3.5 build 40) save or map data has been detected. Would you like to export these saves to your phone's home folder, for use in the Mindustry Classic app? quit.confirm = Are you sure you want to quit? +quit.confirm.tutorial = Are you sure you know what you're doing?\nThe tutorial can be re-taken in[accent] Settings->Game->Re-Take Tutorial.[] loading = [accent]Loading... saving = [accent]Saving... wave = [accent]Wave {0} @@ -263,6 +268,7 @@ 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 @@ -302,6 +308,7 @@ ping = Ping: {0}ms language.restart = Please restart your game for the language settings to take effect. settings = Settings tutorial = Tutorial +tutorial.retake = Re-Take Tutorial editor = Editor mapeditor = Map Editor donate = Donate @@ -315,8 +322,9 @@ bestwave = [LIGHT_GRAY]Best Wave: {0} launch = < LAUNCH > launch.title = Launch Successful launch.next = [LIGHT_GRAY]next opportunity at wave {0} -launch.unable = [scarlet]Unable to LAUNCH.[] {0} Enemies. +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]Unlock configuring loadout:\nWave {0}. @@ -352,6 +360,7 @@ 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. @@ -363,6 +372,7 @@ zone.overgrowth.description = This area is overgrown, closer to the source of th zone.tarFields.description = The outskirts of an oil production zone, between the mountains and desert. One of the few areas with usable tar reserves.\nAlthough abandoned, this area has some dangerous enemy forces nearby. Do not underestimate them.\n\n[lightgray]Research oil processing technology if possible. zone.desolateRift.description = An extremely dangerous zone. Plentiful resources, but little space. High risk of destruction. Leave as soon as possible. Do not be fooled by the long spacing between enemy attacks. zone.nuclearComplex.description = A former facility for the production and processing of thorium, reduced to ruins.\n[lightgray]Research the thorium and its many uses.\n\nThe enemy is present here in great numbers, constantly scouting for attackers. +zone.fungalPass.description = A transition area between high mountains and lower, spore-ridden lands. A small enemy reconnaissance base is located here.\nDestroy it.\nUse Dagger and Crawler units. Take out the two cores. zone.impact0078.description = zone.crags.description = settings.language = Language @@ -417,6 +427,7 @@ blocks.inaccuracy = Inaccuracy blocks.shots = Shots blocks.reload = Shots/Second blocks.ammo = Ammo +bar.drilltierreq = Better Drill Required bar.drillspeed = Drill Speed: {0}/s bar.efficiency = Efficiency: {0}% bar.powerbalance = Power: {0} @@ -491,6 +502,7 @@ setting.lasers.name = Show Power Lasers setting.pixelate.name = Pixelate [LIGHT_GRAY](may decrease performance) setting.minimap.name = Show Minimap setting.musicvol.name = Music Volume +setting.ambientvol.name = Ambient Volume setting.mutemusic.name = Mute Music setting.sfxvol.name = SFX Volume setting.mutesound.name = Mute Sound @@ -819,9 +831,10 @@ block.container.name = Container block.launch-pad.name = Launch Pad block.launch-pad-large.name = Large Launch Pad team.blue.name = blue -team.red.name = red +team.crux.name = red +team.sharded.name = orange team.orange.name = orange -team.none.name = gray +team.derelict.name = derelict team.green.name = green team.purple.name = purple unit.spirit.name = Spirit Drone @@ -839,27 +852,26 @@ unit.chaos-array.name = Chaos Array unit.eradicator.name = Eradicator unit.lich.name = Lich unit.reaper.name = Reaper -tutorial.begin = Your mission here is to eradicate the[LIGHT_GRAY] enemy[].\n\nBegin by[accent] mining copper[]. Tap a copper ore vein near your core to do this. +tutorial.next = [lightgray] +tutorial.intro = You have entered the[scarlet] Mindustry Tutorial.[]\nBegin by[accent] mining copper[]. Tap a copper ore vein near your core to do this.\n\n[accent]{0}/{1} copper tutorial.drill = Mining manually is inefficient.\n[accent]Drills []can mine automatically.\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.[] tutorial.conveyor = [accent]Conveyors[] are used to transport items to the core.\nMake a line of conveyors from the drill to the core. -tutorial.morecopper = More copper is required.\n\nEither mine it manually, or place more drills. +tutorial.conveyor.mobile = [accent]Conveyors[] are used to transport items to the core.\nMake a line of conveyors from the drill to the core.\n[accent] Place in a line by holding down your finger for a few seconds[] and dragging in a direction.\n\n[accent]{0}/{1} conveyors placed in line\n[accent]0/1 items delivered tutorial.turret = Defensive structures must be built to repel the[LIGHT_GRAY] enemy[].\nBuild a duo turret near your base. tutorial.drillturret = Duo turrets require[accent] copper ammo []to shoot.\nPlace a drill next to the turret to supply it with mined copper. +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[LIGHT_GRAY] enemy[] approaches.\n\nDefend your core for 2 waves. Build more turrets. -tutorial.lead = More ores are available. Explore and mine[accent] lead[].\n\nDrag from your unit to the core to transfer resources. -tutorial.smelter = Copper and lead are weak metals.\nSuperior[accent] Dense Alloy[] can be created in a smelter.\n\nBuild one. -tutorial.densealloy = The smelter will now produce alloy.\nGet some.\nImprove the production if necessary. -tutorial.siliconsmelter = The core will now create a[accent] spirit drone[] for mining and repairing blocks.\n\nFactories for other units can be created with [accent] silicon.\nMake a silicon smelter. -tutorial.silicondrill = Silicon requires[accent] coal[] and[accent] sand[].\nStart by making drills. -tutorial.generator = This technology requires power.\nCreate a[accent] combustion generator[] for it. -tutorial.generatordrill = Combustion generators need fuel.\nFuel it with coal from a drill. -tutorial.node = Power requires transport.\nCreate a[accent] power node[] next to your combustion generator to transfer its power. -tutorial.nodelink = Power can be transferred through contacting power blocks and generators, or by linked power nodes.\n\nLink power by tapping the node and selecting the generator and silicon smelter. -tutorial.silicon = Silicon is being produced. Get some.\n\nImproving the production system is advised. -tutorial.daggerfactory = Construct a[accent] dagger mech factory.[]\n\nThis will be used to create attack mechs. -tutorial.router = Factories need resources to function.\nCreate a router to split conveyor resources. -tutorial.dagger = Link power nodes to the factory.\nOnce requirements are met, a mech will be created.\n\nCreate more drills, generators and conveyors as necessary. -tutorial.battle = The[LIGHT_GRAY] enemy[] has revealed their core.\nDestroy it with your unit and dagger mechs. +tutorial.waves.mobile = The[lightgray] enemy[] approaches.\n\nDefend the core for 2 waves. Your ship will automatically fire at enemies.\nBuild more turrets and drills. Mine more copper. +tutorial.launch = Once you reach a specific wave, you are able to[accent] launch the core[], leaving your defenses behind and[accent] obtaining all the resources in your core.[]\nThese resources can then be used to research new technology.\n\n[accent]Press the launch button. item.copper.description = A useful structure material. Used extensively in all types of blocks. item.lead.description = A basic starter material. Used extensively in electronics and liquid transportation blocks. item.metaglass.description = A super-tough glass compound. Extensively used for liquid distribution and storage. @@ -896,13 +908,9 @@ unit.crawler.description = A ground unit consisting of a stripped-down frame wit unit.titan.description = An advanced, armored ground unit. Attacks both ground and air targets. unit.fortress.description = A heavy artillery ground unit. 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.chaos-array.description = -unit.eradicator.description = unit.wraith.description = A fast, hit-and-run interceptor unit. unit.ghoul.description = A heavy carpet bomber. unit.revenant.description = A heavy, hovering missile array. -unit.lich.description = -unit.reaper.description = block.graphite-press.description = Compresses chunks of coal into pure sheets of graphite. block.multi-press.description = An upgraded version of the graphite press. Employs water and power to process coal quickly and efficiently. block.silicon-smelter.description = Reduces sand with highly pure coal in order to produce silicon. diff --git a/core/assets/bundles/bundle_nl_BE.properties b/core/assets/bundles/bundle_nl_BE.properties index f724a3bde2..0ae0769df1 100644 --- a/core/assets/bundles/bundle_nl_BE.properties +++ b/core/assets/bundles/bundle_nl_BE.properties @@ -4,7 +4,7 @@ contributors = Vertalers en medewerkers discord = Sluit je aan bij de Mindustry discord server! link.discord.description = De officiële Mindustry discord chatroom link.github.description = Broncode -link.changelog.description = List of update changes +link.changelog.description = Lijst met updatewijzigingen link.dev-builds.description = Onstabiele versies link.trello.description = Officiële Trello voor geplande toevoegingen. link.itch.io.description = Itch.io pagina met de PC downloads en online versie @@ -23,8 +23,8 @@ stat.destroyed = Gebouwen vernietigd:[accent] {0} stat.deconstructed = Gebouwen afgebroken:[accent] {0} stat.delivered = Gronstoffen meegenomen: stat.rank = Eindresultaat: [accent]{0} -placeline = You have selected a block.\nYou can[accent] place in a line[] by[accent] holding down your finger for a few seconds[] and dragging in a direction.\n\n[scarlet]DO IT. -removearea = You have selected removal mode.\nYou can[accent] remove blocks in a rectangle[] by[accent] holding down your finger for a few seconds[] and dragging.\n\n[scarlet]DO IT. +placeline = Je hebt een blok geselecteerd.\nJe kan[accent] in een lijn plaatsen[] door[accent] je vinger voor enkele seconden ingedrukt te houden[] en in een richting te slepen.\n\n[scarlet]DOE HET. +removearea = Je hebt verwijderingsmodus geselecteerd.\nJe kan[accent] blokken verwijderen in een rechthoek[] door[accent] je vinger voor enkele seconden ingedrukt te houden[] en te slepen.\n\n[scarlet]DOE HET. launcheditems = [accent]Meegenomen grondstoffen map.delete = Ben je zeker dat je de kaart "[accent]{0}[]" wilt verwijderen? level.highscore = Beste score: [accent]{0} @@ -43,6 +43,7 @@ newgame = Nieuw spel none = minimap = Kaartje close = Sluit +website = Website quit = Verlaat maps = Kaarten continue = Ga verder @@ -71,6 +72,7 @@ server.kicked.nameEmpty = Je gekozen naam is ongeldig. server.kicked.idInUse = Je bent al verbonden met de server! Verbinden met 2 clients tegelijk is verboden. server.kicked.customClient = Deze server ondersteunt geen aangepaste versies (mods). Download een officiële versie. server.kicked.gameover = Game over! +server.versions = Your version:[accent] {0}[]\nServer version:[accent] {1}[] host.info = Ook De [accent]host[] knop hosts een server op poort [scarlet]6567[]. \nIedereen die verbonden is met dezelfde [LIGHT_GRAY]wifi of lokaal netwerk[] zou je server moeten zien in zijn server lijst.\n\nAls je wil dat personen kunnen verbinden met je server van ergens anders via IP. Dan is [accent]port forwarding[] is nodig.\n\n[LIGHT_GRAY]Nota: Als iemand problemen heeft met het verbinden tot je LAN spel, zorg dan dat mindustry toestemming heeft tot je lokale netwerk in de Firewall instellingen. join.info = Hier kan je een [accent]server IP[] invullen waarmee je wil verbinden. Je kan hier ook verbinden met servers op je [accent]lokale netwerk[]. LAN en WAN multiplayer wordt ondersteund.\n\n[LIGHT_GRAY]Belangrijk: er is geen automatische globale server lijst; als je met iemand wil verbinden via een IP adres moet je zijn/haar IP adres vragen. hostserver = Host Game @@ -136,40 +138,43 @@ selectslot = Selecteer een save. slot = [accent]Slot {0} 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 = On -off = Off +on = Aan +off = Uit save.autosave = Autosave: {0} save.map = Map: {0} -save.wave = Wave {0} -save.difficulty = Difficulty: {0} +save.wave = Golf {0} +save.difficulty = Moeilijkheid: {0} save.date = Last Saved: {0} save.playtime = Playtime: {0} -warning = Warning. -confirm = Confirm -delete = Delete +warning = Waarschuwing. +confirm = Bevestig +delete = Verwijder ok = OK open = Open -customize = Customize -cancel = Cancel +customize = Pas aan +cancel = Annuleer openlink = Open Link -copylink = Copy Link -back = Back -quit.confirm = Are you sure you want to quit? -loading = [accent]Loading... -saving = [accent]Saving... -wave = [accent]Wave {0} -wave.waiting = [LIGHT_GRAY]Wave in {0} +copylink = Kopiëer Link +back = Terug +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 = 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... +saving = [accent]Aan het opslaan... +wave = [accent]Golf {0} +wave.waiting = [LIGHT_GRAY]Golf in {0} wave.waveInProgress = [LIGHT_GRAY]Wave in progress waiting = [LIGHT_GRAY]Waiting... -waiting.players = Waiting for players... -wave.enemies = [LIGHT_GRAY]{0} Enemies Remaining -wave.enemy = [LIGHT_GRAY]{0} Enemy Remaining -loadimage = Load Image -saveimage = Save Image -unknown = Unknown +waiting.players = Aan het wachten voor spelers... +wave.enemies = [LIGHT_GRAY]{0} Vijanden Over +wave.enemy = [LIGHT_GRAY]{0} Vijand Over +loadimage = Laad Afbeelding +saveimage = Sla Afbeelding Op +unknown = Onbekend custom = Custom builtin = Built-In -map.delete.confirm = Are you sure you want to delete this map? This action cannot be undone! +map.delete.confirm = Weet je zeker dat je deze kaart wilt verwijderen? Deze actie kan niet ongedaan gemaakt worden! map.random = [accent]Random Map map.nospawn = This map does not have any cores for the player to spawn in! Add a[ROYAL] blue[] core to this map in the editor. map.nospawn.pvp = This map does not have any enemy cores for player to spawn into! Add[SCARLET] non-blue[] cores to this map in the editor. @@ -263,6 +268,7 @@ 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 @@ -302,6 +308,7 @@ ping = Ping: {0}ms language.restart = Please restart your game for the language settings to take effect. settings = Settings tutorial = Tutorial +tutorial.retake = Re-Take Tutorial editor = Editor mapeditor = Map Editor donate = Donate @@ -315,8 +322,9 @@ bestwave = [LIGHT_GRAY]Best Wave: {0} launch = < LAUNCH > launch.title = Launch Successful launch.next = [LIGHT_GRAY]next opportunity at wave {0} -launch.unable = [scarlet]Unable to LAUNCH.[] {0} Enemies. +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]Unlock configuring loadout:\nWave {0}. @@ -352,6 +360,7 @@ 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. @@ -363,6 +372,7 @@ zone.overgrowth.description = This area is overgrown, closer to the source of th zone.tarFields.description = The outskirts of an oil production zone, between the mountains and desert. One of the few areas with usable tar reserves.\nAlthough abandoned, this area has some dangerous enemy forces nearby. Do not underestimate them.\n\n[lightgray]Research oil processing technology if possible. zone.desolateRift.description = An extremely dangerous zone. Plentiful resources, but little space. High risk of destruction. Leave as soon as possible. Do not be fooled by the long spacing between enemy attacks. zone.nuclearComplex.description = A former facility for the production and processing of thorium, reduced to ruins.\n[lightgray]Research the thorium and its many uses.\n\nThe enemy is present here in great numbers, constantly scouting for attackers. +zone.fungalPass.description = A transition area between high mountains and lower, spore-ridden lands. A small enemy reconnaissance base is located here.\nDestroy it.\nUse Dagger and Crawler units. Take out the two cores. zone.impact0078.description = zone.crags.description = settings.language = Language @@ -417,6 +427,7 @@ blocks.inaccuracy = Inaccuracy blocks.shots = Shots blocks.reload = Shots/Second blocks.ammo = Ammo +bar.drilltierreq = Better Drill Required bar.drillspeed = Drill Speed: {0}/s bar.efficiency = Efficiency: {0}% bar.powerbalance = Power: {0}/s @@ -491,6 +502,7 @@ setting.lasers.name = Show Power Lasers setting.pixelate.name = Pixelate [LIGHT_GRAY](may decrease performance, disables animations) setting.minimap.name = Show Minimap setting.musicvol.name = Music Volume +setting.ambientvol.name = Ambient Volume setting.mutemusic.name = Mute Music setting.sfxvol.name = SFX Volume setting.mutesound.name = Mute Sound @@ -819,9 +831,10 @@ block.container.name = Container block.launch-pad.name = Launch Pad block.launch-pad-large.name = Large Launch Pad team.blue.name = blue -team.red.name = red +team.crux.name = red +team.sharded.name = orange team.orange.name = orange -team.none.name = gray +team.derelict.name = derelict team.green.name = green team.purple.name = purple unit.spirit.name = Spirit Drone @@ -839,27 +852,26 @@ unit.chaos-array.name = Chaos Array unit.eradicator.name = Eradicator unit.lich.name = Lich unit.reaper.name = Reaper -tutorial.begin = Your mission here is to eradicate the[LIGHT_GRAY] enemy[].\n\nBegin by[accent] mining copper[]. Tap a copper ore vein near your core to do this. -tutorial.drill = Mining manually is inefficient.\n[accent]Drills []can mine automatically.\nPlace one on a copper vein. -tutorial.conveyor = [accent]Conveyors[] are used to transport items to the core.\nMake a line of conveyors from the drill to the core. -tutorial.morecopper = More copper is required.\n\nEither mine it manually, or place more drills. -tutorial.turret = Defensive structures must be built to repel the[LIGHT_GRAY] enemy[].\nBuild a duo turret near your base. -tutorial.drillturret = Duo turrets require[accent] copper ammo []to shoot.\nPlace a drill next to the turret to supply it with mined copper. -tutorial.waves = The[LIGHT_GRAY] enemy[] approaches.\n\nDefend your core for 2 waves. Build more turrets. -tutorial.lead = More ores are available. Explore and mine[accent] lead[].\n\nDrag from your unit to the core to transfer resources. -tutorial.smelter = Copper and lead are weak metals.\nSuperior[accent] Dense Alloy[] can be created in a smelter.\n\nBuild one. -tutorial.densealloy = The smelter will now produce alloy.\nGet some.\nImprove the production if necessary. -tutorial.siliconsmelter = The core will now create a[accent] spirit drone[] for mining and repairing blocks.\n\nFactories for other units can be created with [accent] silicon.\nMake a silicon smelter. -tutorial.silicondrill = Silicon requires[accent] coal[] and[accent] sand[].\nStart by making drills. -tutorial.generator = This technology requires power.\nCreate a[accent] combustion generator[] for it. -tutorial.generatordrill = Combustion generators need fuel.\nFuel it with coal from a drill. -tutorial.node = Power requires transport.\nCreate a[accent] power node[] next to your combustion generator to transfer its power. -tutorial.nodelink = Power can be transferred through contacting power blocks and generators, or by linked power nodes.\n\nLink power by tapping the node and selecting the generator and silicon smelter. -tutorial.silicon = Silicon is being produced. Get some.\n\nImproving the production system is advised. -tutorial.daggerfactory = Construct a[accent] dagger mech factory.[]\n\nThis will be used to create attack mechs. -tutorial.router = Factories need resources to function.\nCreate a router to split conveyor resources. -tutorial.dagger = Link power nodes to the factory.\nOnce requirements are met, a mech will be created.\n\nCreate more drills, generators and conveyors as necessary. -tutorial.battle = The[LIGHT_GRAY] enemy[] has revealed their core.\nDestroy it with your unit and dagger mechs. +tutorial.next = [lightgray] +tutorial.intro = You have entered the[scarlet] Mindustry Tutorial.[]\nBegin by[accent] mining copper[]. Tap a copper ore vein near your core to do this.\n\n[accent]{0}/{1} copper +tutorial.drill = 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.[] +tutorial.conveyor = [accent]Transportbanden[] worden gebruikt om artikelen naar de kern te transporteren.\nMaak een lijn van transportbanden van de boor tot de kern. +tutorial.conveyor.mobile = [accent]Conveyors[] are used to transport items to the core.\nMake a line of conveyors from the drill to the core.\n[accent] Place in a line by holding down your finger for a few seconds[] and dragging in a direction.\n\n[accent]{0}/{1} conveyors placed in line\n[accent]0/1 items delivered +tutorial.turret = Er moeten verdedigingsstructuren worden gebouwd om de[LIGHT_GRAY] vijand[]af te weren.\nBouw een duo geschutstoren in de buurt van je basis. +tutorial.drillturret = Duo geschutstorens hebben[accent] koper ammunitie []nodig om te schieten.\nPlaats een boor naast de geschutstoren om het van gedolven koper te voorzien. +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 = De [LIGHT_GRAY] vijand[] nadert.\n\nVerdedig jouw kern voor 2 golven. Bouw meer geschutstorens. +tutorial.waves.mobile = The[lightgray] enemy[] approaches.\n\nDefend the core for 2 waves. Your ship will automatically fire at enemies.\nBuild more turrets and drills. Mine more copper. +tutorial.launch = Once you reach a specific wave, you are able to[accent] launch the core[], leaving your defenses behind and[accent] obtaining all the resources in your core.[]\nThese resources can then be used to research new technology.\n\n[accent]Press the launch button. item.copper.description = A useful structure material. Used extensively in all types of blocks. item.lead.description = A basic starter material. Used extensively in electronics and liquid transportation blocks. item.metaglass.description = A super-tough glass compound. Extensively used for liquid distribution and storage. @@ -896,13 +908,9 @@ unit.crawler.description = A ground unit consisting of a stripped-down frame wit unit.titan.description = An advanced, armored ground unit. Attacks both ground and air targets. unit.fortress.description = A heavy artillery ground unit. 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.chaos-array.description = -unit.eradicator.description = unit.wraith.description = A fast, hit-and-run interceptor unit. unit.ghoul.description = A heavy carpet bomber. unit.revenant.description = A heavy, hovering missile array. -unit.lich.description = -unit.reaper.description = block.graphite-press.description = Compresses chunks of coal into pure sheets of graphite. block.multi-press.description = An upgraded version of the graphite press. Employs water and power to process coal quickly and efficiently. block.silicon-smelter.description = Reduces sand with highly pure coal in order to produce silicon. diff --git a/core/assets/bundles/bundle_pl.properties b/core/assets/bundles/bundle_pl.properties index 02429f0f58..aa4be61520 100644 --- a/core/assets/bundles/bundle_pl.properties +++ b/core/assets/bundles/bundle_pl.properties @@ -16,7 +16,6 @@ screenshot.invalid = Zrzut ekranu jest zbyt duży. Najprawdopodobniej brakuje mi gameover = Rdzeń został zniszczony. gameover.pvp = Zwyciężyła drużyna [accent]{0}[]! highscore = [YELLOW] Nowy rekord! - stat.wave = Fale powstrzymane:[accent] {0} stat.enemiesDestroyed = Przeciwnicy zniszczeni:[accent] {0} stat.built = Budynki zbudowane:[accent] {0} @@ -24,10 +23,8 @@ stat.destroyed = Budynki zniszczone:[accent] {0} stat.deconstructed = Budynki zrekonstruowane:[accent] {0} stat.delivered = Surowce wystrzelone: stat.rank = Ocena: [accent]{0} - placeline = Wybrałeś blok.\nMożesz umieścić[accent] w linii,[] [accent]przytrzymując palec przez kilka sekund[] i przeciągając.\nSpróbuj. removearea = Wybrałeś tryb usuwania.\nMożesz[accent] usunąć bloki w prostokoncie,[] [accent]przytrzymując palec przez kilka sekund i przeciągając[] and dragging.\nTry it. - launcheditems = [accent]Wystrzelone przedmioty map.delete = Jesteś pewny, że chcesz usunąć "[accent]{0}[]"? level.highscore = Rekord: [accent]{0} @@ -46,6 +43,7 @@ newgame = Nowa Gra none = minimap = Minimapa close = Zamknij +website = Website quit = Wyjdź maps = Mapy continue = Kontynuuj @@ -74,6 +72,7 @@ server.kicked.nameEmpty = Wybrana przez Ciebie nazwa jest nieprawidłowa. server.kicked.idInUse = Jesteś już na serwerze! Używanie tego samego konta na 2 urządzeniach jest zabronione. server.kicked.customClient = Ten serwer nie wspomaga wersji deweloperskich. Pobierz oficjalną wersję. server.kicked.gameover = Koniec gry! +server.versions = Your version:[accent] {0}[]\nServer version:[accent] {1}[] host.info = Przycisk [accent]host[] hostuje serwer na porcie [scarlet]6567[] i [scarlet]6568.[]\nKtokolwiek z tym samym [LIGHT_GRAY]wifi lub hotspotem[] powinien zobaczyć twój serwer.\n\nJeśli chcesz, aby każdy z twoim IP mógł dołączyć, [accent]przekierowywanie portów[] jest potrzebne.\n\n[LIGHT_GRAY]Notka:Jeśli ktokolwiek ma problem z dołączeniem do gry, upewnij się, że udostępniłeś Mindustry dostęp do sieci. join.info = Tutaj możesz wpisać [accent]IP serwera[], aby dołączyć lub wyszukaj [accent]serwery w lokalnej sieci[], do których chcesz dołączyć .\nGra wieloosobowa na LAN i WAN jest wspomagana.\n\n[LIGHT_GRAY]Notka: Nie ma automatycznej listy wszystkich serwerów; jeśli chcesz dołączyć przez IP, musisz zapytać się hosta o IP. hostserver = Stwórz Serwer @@ -157,7 +156,10 @@ cancel = Anuluj openlink = Otwórz link copylink = Kopiuj link back = Wróć +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 = Czy na pewno chcesz wyjść? +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]Ładowanie... saving = [accent]Zapisywanie... wave = [accent]Fala {0} @@ -262,11 +264,11 @@ toolmode.fillteams = Wypełń Drużyny toolmode.fillteams.description = Wypełniaj drużyny zamiast bloków. toolmode.drawteams = Rysuj Drużyny toolmode.drawteams.description = Rysuj drużyny zamiast bloków. - filters.empty = [LIGHT_GRAY]Brak filtrów! Dodaj jeden za pomocą przycisku poniżej. filter.distort = Zniekształcanie filter.noise = Szum filter.median = Median +filter.oremedian = Ore Median filter.blend = Blend filter.defaultores = Domyślne rudy filter.ore = Ruda @@ -306,10 +308,10 @@ ping = Ping: {0}ms language.restart = Uruchom grę ponownie, aby ustawiony język zaczął funkcjonować. settings = Ustawienia tutorial = Poradnik +tutorial.retake = Re-Take Tutorial 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 @@ -320,8 +322,9 @@ bestwave = [LIGHT_GRAY]Najwyższa fala: {0} launch = < WYSTRZEL > launch.title = Wystrzelenie Udane launch.next = [LIGHT_GRAY]Następna okazja przy fali {0} -launch.unable = [scarlet]Nie można wystrzelić![] Wykryto {0} przeciwników. +launch.unable2 = [scarlet]Unable to LAUNCH.[] launch.confirm = Spowoduje to wystrzelenie wszystkich surowców w rdzeniu.\nNie będziesz mógł wrócić do tej bazy. +launch.skip.confirm = If you skip now, you will not be able to launch until later waves. uncover = Odkryj configure = Skonfiguruj ładunek configure.locked = [LIGHT_GRAY]Dotrzyj do fali {0}\nAby skonfigurować ładunek. @@ -334,7 +337,6 @@ zone.objective.survival = Przeżyj zone.objective.attack = Zniszcz Rdzeń Wroga add = Dodaj... boss.health = Boss Health - connectfail = [crimson]Nie można połączyć się z serwerem:\n\n[accent]{0} error.unreachable = Serwer niedostępny.\nCzy adres jest wpisany poprawnie? error.invalidaddress = Niepoprawny adres. @@ -358,7 +360,7 @@ zone.tarFields.name = Pola Smołowe zone.saltFlats.name = Salt Flats zone.impact0078.name = Uderzenie 0078 zone.crags.name = Urwisko - +zone.fungalPass.name = Fungal Pass zone.groundZero.description = Optymalna lokalizacja, aby rozpocząć jeszcze raz. Niskie zagrożenie. Niewiele zasobów.\nZbierz jak najwięcej miedzi i ołowiu, tyle ile jest możliwe.\nPrzejdź do następnej strefy jak najszybciej. zone.frozenForest.description = Nawet tutaj, bliżej gór, zarodniki rozprzestrzeniły się. Niskie temperatury nie mogą ich zatrzymać na zawsze.\n\nRozpocznij przedsięwzięcie od władzy. Buduj generatory spalinowe. Naucz się korzystać z naprawiaczy. zone.desertWastes.description = 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. @@ -373,7 +375,6 @@ zone.nuclearComplex.description = Dawny zakład produkcji i przetwarzania toru, zone.fungalPass.description = A transition area between high mountains and lower, spore-ridden lands. A small enemy reconnaissance base is located here.\nDestroy it.\nUse Dagger and Crawler units. Take out the two cores. zone.impact0078.description = zone.crags.description = - settings.language = Język settings.reset = Przywróć domyślne settings.rebind = Zmień @@ -426,7 +427,7 @@ blocks.inaccuracy = Niedokładność blocks.shots = Strzały blocks.reload = Strzałów/sekundę blocks.ammo = Amunicja - +bar.drilltierreq = Better Drill Required bar.drillspeed = Prędkość wiertła: {0}/s bar.efficiency = Efektywność: {0}% bar.powerbalance = Moc: {0} @@ -438,7 +439,6 @@ bar.heat = Ciepło bar.power = Prąd bar.progress = Postęp Budowy bar.spawned = Jednostki: {0}/{1} - bullet.damage = [stat]{0}[lightgray] Obrażenia bullet.splashdamage = [stat]{0}[lightgray] Obrażenia obszarowe ~[stat] {1}[lightgray] kratki bullet.incendiary = [stat]zapalający @@ -450,7 +450,6 @@ bullet.freezing = [stat]zamrażający bullet.tarred = [stat]smolny bullet.multiplier = [stat]{0}[lightgray]x mnożnik amunicji bullet.reload = [stat]{0}[lightgray]x szybkość ataku - unit.blocks = Klocki unit.powersecond = jednostek prądu na sekundę unit.liquidsecond = jednostek płynów na sekundę @@ -503,6 +502,7 @@ setting.lasers.name = Pokaż lasery zasilające setting.pixelate.name = Pikselacja [LIGHT_GRAY](wyłącza animacje) setting.minimap.name = Pokaż Minimapę setting.musicvol.name = Głośność muzyki +setting.ambientvol.name = Ambient Volume setting.mutemusic.name = Wycisz muzykę setting.sfxvol.name = Głośność dźwięków setting.mutesound.name = Wycisz dźwięki @@ -559,7 +559,6 @@ mode.pvp.description = Walcz przeciwko innym graczom. mode.attack.name = Atak mode.attack.description = Brak fal, celem jest zniszczenie bazy przeciwnika. mode.custom = Własny tryb - rules.infiniteresources = Nieskończone zasoby rules.wavetimer = Zegar fal rules.waves = Fale @@ -586,7 +585,6 @@ rules.title.resourcesbuilding = Zasoby i Budowanie rules.title.player = Gracze rules.title.enemy = Przeciwnicy rules.title.unit = Jednostki - content.item.name = Przedmioty content.liquid.name = Płyny content.unit.name = Jednostki @@ -601,7 +599,7 @@ item.thorium.name = Uran item.silicon.name = Krzem item.plastanium.name = Plastan item.phase-fabric.name = Włókno Fazowe -item.surge-alloy.name = Energetyczny Stop +item.surge-alloy.name = Energon item.spore-pod.name = Kapsułka Zarodników item.sand.name = Piasek item.blast-compound.name = Wybuchowy związek @@ -734,13 +732,6 @@ block.scorch.name = Płomień block.scatter.name = Flak block.hail.name = Hail block.lancer.name = Lancer -block.wave.name = Wave -block.swarmer.name = Działo Rojowe -block.salvo.name = Działo Salwowe -block.ripple.name = Działo falowe -block.cyclone.name = Cyklon -block.fuse.name = Lont -block.shock-mine.name = Mina block.conveyor.name = Przenośnik block.titanium-conveyor.name = Tytanowy przenośnik block.junction.name = Węzeł @@ -787,6 +778,10 @@ block.power-void.name = Próżnia prądu block.power-source.name = Nieskończony Prąd block.unloader.name = Wyciągacz block.vault.name = Magazyn +block.wave.name = Wave +block.swarmer.name = Działo Rojowe +block.salvo.name = Działo Salwowe +block.ripple.name = Działo falowe block.phase-conveyor.name = Fazowy Transporter block.bridge-conveyor.name = Most Transportowy block.plastanium-compressor.name = Kompresor Plastanu @@ -798,13 +793,13 @@ block.oil-extractor.name = Ekstraktor Ropy block.draug-factory.name = Fabryka Dronów Draug block.spirit-factory.name = Fabryka Dronów Duch block.phantom-factory.name = Fabryka Dronów Widmo -block.wraith-factory.name = Fabryka Wojowników Zjawa +block.wraith-factory.name = Fabryka Wojowników Widmo block.ghoul-factory.name = Fabryka Bombowców Upiór block.dagger-factory.name = Fabryka Mechów Nóż -block.crawler-factory.name = Fabryka Mechów Crawler +block.crawler-factory.name = Fabryka Mechów Pełzacz block.titan-factory.name = Fabryka Mechów Tytan block.fortress-factory.name = Fabryka Mechów Fortreca -block.revenant-factory.name = Fabryka Wojowników Potwór +block.revenant-factory.name = Fabryka Wojowników Zjawa block.repair-point.name = Punkt Napraw block.pulse-conduit.name = Rura Pulsacyjna block.phase-conduit.name = Rura Fazowa @@ -821,31 +816,35 @@ block.thermal-generator.name = Generator Termalny block.alloy-smelter.name = Piec Mieszający block.mender.name = Naprawiacz block.mend-projector.name = Projektor Napraw -block.surge-wall.name = Ściana Stopu Energetycznego -block.surge-wall-large.name = Duża Ściana Stopu Energetycznego +block.surge-wall.name = Ściana Energonu +block.surge-wall-large.name = Duża Ściana Energonu +block.cyclone.name = Cyklon +block.fuse.name = Lont +block.shock-mine.name = Mina block.overdrive-projector.name = Projektor Nad-prędkości block.force-projector.name = Projektor Pola Siłowego block.arc.name = Piorun block.rtg-generator.name = Generator RTG block.spectre.name = Huragan -block.meltdown.name = Meltdown +block.meltdown.name = Rozpad block.container.name = Kontener block.launch-pad.name = Skocznia block.launch-pad-large.name = Duża skocznia team.blue.name = niebieski team.crux.name = czerwony team.sharded.name = pomarańczowy +team.orange.name = orange team.derelict.name = szary team.green.name = zielony team.purple.name = fioletowy unit.spirit.name = Duch -unit.draug.name = Draug Miner Drone +unit.draug.name = Draug unit.phantom.name = Widmo unit.dagger.name = Nóż unit.crawler.name = Pełzak unit.titan.name = Tytan unit.ghoul.name = Upiór -unit.wraith.name = Zjawa +unit.wraith.name = Widmo unit.fortress.name = Forteca unit.revenant.name = Zjawa unit.eruptor.name = Roztapiacz @@ -853,32 +852,30 @@ unit.chaos-array.name = Kolejka Chaosu unit.eradicator.name = Niszczyciel unit.lich.name = Obudzony unit.reaper.name = Żeniec -tutorial.begin = Twoją misją jest zniszczenie[LIGHT_GRAY] wrogów[].\n\nZacznij od[accent] wydobycia miedzi[]. Kliknij na rudę miedzi w pobliżu swojego rdzenia, aby to zrobić. -tutorial.drill = Kopanie ręcznie nie jest efektywne.\n[accent]Wiertła []mogą kopać automatycznie.\nPostaw je na rudzie miedzi. -tutorial.conveyor = [accent]Transportery[] są używane do przenoszenia przedmiotów do rdzenia.\nZrób linię z transporterów z wiertła do rdzenia. -tutorial.morecopper = Potrzebne jest więcej miedzi!\nKop ręcznie, albo postaw więcej wierteł. -tutorial.turret = Struktury obronne muszą być wybudowane, aby odpychać [LIGHT_GRAY] wrogów[].\nZbuduj podwójne działko niedaleko swojej bazy. -tutorial.drillturret = Podwójne działko wymaga[accent] miedzi []jako amunicji, aby strzelać.\nPostaw wiertło obok działka, aby zaopatrzyć je w miedź. -tutorial.waves = The[LIGHT_GRAY] Wrogowie[] nadciągają.\n\nObroń swój rdzeń przez dwie fale. Wybuduj więcej działek. -tutorial.lead = Dostępne jest więcej rud - eksploruj i wydobądź[accent] ołów[].\n\nPrzeciągnij ze swojej jednostki do rdzenia, aby przenieść zasoby. -tutorial.smelter = Copper and lead are weak metals.\nSuperior[accent] Dense Alloy[] can be created in a smelter.\n\nBuild one. -tutorial.densealloy = The smelter will now produce alloy.\nGet some.\nImprove the production if necessary. -tutorial.siliconsmelter = The core will now create a[accent] spirit drone[] for mining and repairing blocks.\n\nFactories for other units can be created with [accent] silicon.\nMake a silicon smelter. -tutorial.silicondrill = Silicon requires[accent] coal[] and[accent] sand[].\nStart by making drills. -tutorial.generator = This technology requires power.\nCreate a[accent] combustion generator[] for it. -tutorial.generatordrill = Combustion generators need fuel.\nFuel it with coal from a drill. -tutorial.node = Power requires transport.\nCreate a[accent] power node[] next to your combustion generator to transfer its power. -tutorial.nodelink = Power can be transferred through contacting power blocks and generators, or by linked power nodes.\n\nLink power by tapping the node and selecting the generator and silicon smelter. -tutorial.silicon = Silicon is being produced. Get some.\n\nImproving the production system is advised. -tutorial.daggerfactory = Construct a[accent] dagger mech factory.[]\n\nThis will be used to create attack mechs. -tutorial.router = Factories need resources to function.\nCreate a router to split conveyor resources. -tutorial.dagger = Link power nodes to the factory.\nOnce requirements are met, a mech will be created.\n\nCreate more drills, generators and conveyors as necessary. -tutorial.battle = The[LIGHT_GRAY] enemy[] has revealed their core.\nDestroy it with your unit and dagger mechs. - +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.drill = Wydobywanie ręczne jest nieefektywne.\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 = Mining manually is inefficient.\n[accent]Drills []can mine automatically.\nTap the drill tab in the bottom right.\nSelect the[accent] mechanical drill[].\nPlace it on a copper vein by tapping, then press the[accent] checkmark[] below to confirm your selection.\nPress the[accent] X button[] to cancel placement. +tutorial.blockinfo = Each block has different stats. Each drill can only mine certain ores.\nTo check a block's info and stats,[accent] tap the "?" button while selecting it in the build menu.[]\n\n[accent]Access the Mechanical Drill's stats now.[] +tutorial.conveyor = [accent]Conveyors[] are used to transport items to the core.\nMake a line of conveyors from the drill to the core.\n[accent]Hold down the mouse to place in a line.[]\nHold[accent] CTRL[] while selecting a line to place diagonally.\n\n[accent]{0}/{1} conveyors placed in line\n[accent]0/1 items delivered +tutorial.conveyor.mobile = [accent]Conveyors[] are used to transport items to the core.\nMake a line of conveyors from the drill to the core.\n[accent] Place in a line by holding down your finger for a few seconds[] and dragging in a direction.\n\n[accent]{0}/{1} conveyors placed in line\n[accent]0/1 items delivered +tutorial.turret = Once an item enters your core, it can be used for building.\nKeep in mind that not all items can be used for building.\nItems that are not used for building, such as[accent] coal[] or[accent] scrap[], cannot be put into the core.\nDefensive structures must be built to repel the[lightgray] enemy[].\nBuild a[accent] duo turret[] near your base. +tutorial.drillturret = Duo turrets require[accent] copper ammo []to shoot.\nPlace a drill near the turret.\nLead conveyors into the turret to supply it with copper.\n\n[accent]Ammo delivered: 0/1 +tutorial.pause = During battle, you are able to[accent] pause the game.[]\nYou may queue buildings while paused.\n\n[accent]Press space to pause. +tutorial.pause.mobile = During battle, you are able to[accent] pause the game.[]\nYou may queue buildings while paused.\n\n[accent]Press this button in the top left to pause. +tutorial.unpause = Now press space again to unpause. +tutorial.unpause.mobile = Now press it again to unpause. +tutorial.breaking = Blocks frequently need to be destroyed.\n[accent]Hold down right-click[] to destroy all blocks in a selection.[]\n\n[accent]Destroy all the scrap blocks to the left of your core using area selection. +tutorial.breaking.mobile = Blocks frequently need to be destroyed.\n[accent]Select deconstruction mode[], then tap a block to begin breaking it.\nDestroy an area by holding down your finger for a few seconds[] and dragging in a direction.\nPress the checkmark button to confirm breaking.\n\n[accent]Destroy all the scrap blocks to the left of your core using area selection. +tutorial.withdraw = In some situations, taking items directly from blocks is necessary.\nTo do this, [accent]tap a block[] with items in it, then [accent]tap the item[] in the inventory.\nMultiple items can be withdrawn by [accent]tapping and holding[].\n\n[accent]Withdraw some copper from the core.[] +tutorial.deposit = Deposit items into blocks by dragging from your ship to the destination block.\n\n[accent]Deposit your copper back into the core.[] +tutorial.waves = The[lightgray] enemy[] approaches.\n\nDefend the core for 2 waves.[accent] Click[] to shoot.\nBuild more turrets and drills. Mine more copper. +tutorial.waves.mobile = The[lightgray] enemy[] approaches.\n\nDefend the core for 2 waves. Your ship will automatically fire at enemies.\nBuild more turrets and drills. Mine more copper. +tutorial.launch = Once you reach a specific wave, you are able to[accent] launch the core[], leaving your defenses behind and[accent] obtaining all the resources in your core.[]\nThese resources can then be used to research new technology.\n\n[accent]Press the launch button. item.copper.description = Przydatny materiał budowlany. Szeroko używany w prawie każdej konstrukcji. item.lead.description = Podstawowy matriał. Używany w przesyle przemiotów i płynów. Nie jest on przypadkiem szkodliwy? item.metaglass.description = Niesamowite silne szkło. Szeroko używane w transporcie i przechowywaniu płynów. -item.graphite.description = Mineralized carbon, used for ammunition and electrical insulation. +item.graphite.description = Zmineralizowany węgiel, wykorzystywany do amunicji i izolacji elektrycznej. item.sand.description = Zwykły materiał używany pospolicie w przepalaniu, stopach i jako topnik. Dostanie piaskiem po oczach nie jest przyjemne. item.coal.description = Zwykły i łatwo dostępny materiał energetyczny. item.titanium.description = Rzadki i bardzo lekki materiał. Używany w bardzo zaawansowanym przewodnictwie, wiertłach i samolotach. Poczuj się jak Tytan! @@ -888,15 +885,15 @@ item.silicon.description = Niesamowicie przydatny półprzewodnk uźywany w pane item.plastanium.description = Lekki i plastyczny materiał używany w amunicji odłamkowej i samolotach. Używany też w klockach LEGO (dlatego są niezniszczalne)! item.phase-fabric.description = Niewiarygodnie lekkie włókno używane w zaawansowanej elektronice i technologii samo-naprawiającej się. item.surge-alloy.description = Zaawansowany materiał z niesłychanymi wartościami energetycznymi. -item.spore-pod.description = Used for conversion into oil, explosives and fuel. -item.blast-compound.description = Lotny związek używany w pirotechnice. Może być używany jako materiał energetyczny, ale nie polecam. BOOOM! +item.spore-pod.description = Używany do wyrobu oleju, materiałów wybuchowych i paliwa. +item.blast-compound.description = Lotny związek używany w pirotechnice. Może być używany jako materiał energetyczny, ale nie polecam, ale i tak warto spróbować. item.pyratite.description = Niesamowicie palny związek używany w zbrojeniu. Nielegalny w 9 państwach. liquid.water.description = Powszechnie używana do schładzania budowli i przetwarzania odpadów. liquid.slag.description = Various different types of molten metal mixed together. Can be separated into its constituent minerals, or sprayed at enemy units as a weapon. liquid.oil.description = Może się palić, eksplodować lub być używana do schładzania. liquid.cryofluid.description = Najefektywniejsza ciecz do schładzania budowli. mech.alpha-mech.description = Standardowy mech. Średnia broń i prędkość, leć potrafi stworzyć trzy małe drony do walki. -mech.delta-mech.description = Szybki i wrażliwy mech stworzony do szybkih ataków i ucieczki. Budynką robi prawie nic, leć jest wstanie szybko rozwalić grupę wrogich jednostek piorunami. +mech.delta-mech.description = Szybki i wrażliwy mech stworzony do szybkih ataków i ucieczki. Budynką robi prawie nic, lec jest wstanie szybko rozwalić grupę wrogich jednostek piorunami. mech.tau-mech.description = Mech pomocny. Naprawia budynki drużyny, strzelając w nie. Potrafi wygasić niedalekie pożary i uleczyć bliskich przyjaciół. mech.omega-mech.description = Duży i silny mech, zaprojektowany na ataki. Jego zdolność pozwala mu na zablokowanie do 90% obrażeń. mech.dart-ship.description = Standardowy statek. Lekki i szybki, ale jest kiepski jak chodzi o walkę i kopanie. @@ -907,22 +904,18 @@ unit.draug.description = A primitive mining drone. Cheap to produce. Expendable. unit.spirit.description = Początkowy dron. Rdzeń zawsze tworzy jeden. Wydobywa surowce, naprawia budynki oraz pomaga przy budowie. unit.phantom.description = Zaawansowany dron. Wydobywa surowce, naprawia budynki oraz pomaga przy budowie szybciej niż dron Duch. unit.dagger.description = Podstawowy mech lądowy. Sam jest słaby, lecz przydatny w dużych ilościach. -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.crawler.description = Jednostka naziemna składająca się z rozebranej ramy z przypiętymi na górze materiałami wybuchowymi. Niezbyt trwały. Wybucha przy kontakcie z wrogami. Chodzi na czterech nogach jak pies. unit.titan.description = Bardziej zaawansowany mech lądowy. Atakuje cele lądowe i powietrzne. unit.fortress.description = Wielka jednostka artyleryjna lądowa. 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.chaos-array.description = -unit.eradicator.description = unit.wraith.description = Szybka jednostka, stosuje taktyke uderz-uciekaj. unit.ghoul.description = Ciężki bombowiec. -unit.revenant.description = A heavy, hovering missile array. -unit.lich.description = -unit.reaper.description = -block.graphite-press.description = Compresses chunks of coal into pure sheets of graphite. +unit.revenant.description = Ciężka, unosząca sie platforma z rakietami. +block.graphite-press.description = Kompresuje kawałki węgla w czyste blaszki grafitu. block.multi-press.description = An upgraded version of the graphite press. Employs water and power to process coal quickly and efficiently. -block.silicon-smelter.description = Reduces sand with highly pure coal in order to produce silicon. +block.silicon-smelter.description = Redukuje piasek za pomocą wysoce czystego węgla w celu wytworzenia krzemu. block.kiln.description = Stapia ołów i piasek na metaszkło. Wymaga małej ilości energii. -block.plastanium-compressor.description = Produces plastanium from oil and titanium. +block.plastanium-compressor.description = Wytwarza plastan z oleju i tytanu. block.phase-weaver.description = Produces phase fabric from radioactive thorium and high amounts of sand. block.alloy-smelter.description = Produces surge alloy from titanium, lead, silicon and copper. block.cryofluidmixer.description = Combines water and titanium into cryofluid which is much more efficient for cooling. @@ -930,27 +923,27 @@ block.blast-mixer.description = Uses oil for transforming pyratite into the less block.pyratite-mixer.description = Mixes coal, lead and sand into highly flammable pyratite. block.melter.description = Przetapia złom na żużel do dalszego przetwarzania lub użycia w wieżyczkach block.separator.description = Oddziel użyteczne materiały z mieszaniny jaką jest żużel. -block.spore-press.description = Compresses spore pods into oil. +block.spore-press.description = Kompresuje kapsułki zarodników w olej. block.pulverizer.description = Mieli złom w drobny piaske. Przydatne, gdy brakuje naturalnego piasku. -block.coal-centrifuge.description = Solidifes oil into chunks of coal. -block.incinerator.description = Gets rid of any excess item or liquid. +block.coal-centrifuge.description = Zestala olej w kawałki węgla. +block.incinerator.description = Pozbywa się nadmiaru przedmiotów lub płynu block.power-void.description = Niszczy całą energię wprowadzoną do tego bloku. Dostępny tylko w trybie sandbox. block.power-source.description = Wydziela prąd w nieskończoność. Dostępny tylko w trybie sandbox. block.item-source.description = Wydziela przedmioty w nieskończoność. Dostępny tylko w trybie sandbox. block.item-void.description = Niszczy wszystkie przedmioty, które idą do tego bloku, który nie wymaga prądu. Dostępny tylko w trybie sandbox. block.liquid-source.description = Wydziela ciecz w nieskończoność. Dostępny tylko w trybie sandbox. -block.copper-wall.description = A cheap defensive block.\nUseful for protecting the core and turrets in the first few waves. -block.copper-wall-large.description = A cheap defensive block.\nUseful for protecting the core and turrets in the first few waves.\nSpans multiple tiles. -block.titanium-wall.description = A moderately strong defensive block.\nProvides moderate protection from enemies. -block.titanium-wall-large.description = A moderately strong defensive block.\nProvides moderate protection from enemies.\nSpans multiple tiles. -block.thorium-wall.description = A strong defensive block.\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. -block.phase-wall-large.description = Not as strong as a thorium wall but will deflect bullets unless they are too powerful.\nSpans multiple tiles. -block.surge-wall.description = The strongest defensive block.\nHas a small chance of triggering lightning towards the attacker. -block.surge-wall-large.description = The strongest defensive block.\nHas a small chance of triggering lightning towards the attacker.\nSpans multiple tiles. -block.door.description = A small door that can be opened and closed by tapping on it.\nIf opened, enemies can shoot and move through. -block.door-large.description = A large door that can be opened and closed by tapping on it.\nIf opened, enemies can shoot and move through.\nSpans multiple tiles. +block.copper-wall.description = Tani blok obronny.\nPrzydatny do ochrony rdzenia i wieżyczek w pierwszych kilku falach. +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.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 = Nie tak silny jak ściana toru, ale odbije pociski, chyba że będą zbyt potężne. +block.phase-wall-large.description = Nie tak silny jak ściana toru, ale odbije pociski, chyba że będą zbyt potężne.\nObejmuje wiele kratek. +block.surge-wall.description = Najsilniejszy blok obronny.\nMa niewielką szansę na wywołanie błyskawicy w kierunku atakującego. +block.surge-wall-large.description = Najsilniejszy blok obronny.\nMa niewielką szansę na wywołanie błyskawicy w kierunku atakującego.\nObejmuje wiele kratek. +block.door.description = Małe drzwi, które można otwierać i zamykać, klikając na nie.\nJeśli są otwarte, wrogowie mogą strzelać i się przemieszczać przez nie. +block.door-large.description = Duże drzwi, które można otwierać i zamykać, klikając na nie.\nJeśli są otwarte, wrogowie mogą strzelać i się przemieszczać przez nie.\nObejmuje wiele kratek. block.mender.description = Periodically repairs blocks in its vicinity. Keeps defenses repaired in-between waves.\nOptionally uses silicon to boost range and efficiency. block.mend-projector.description = Periodically heals blocks in its vicinity. block.overdrive-projector.description = Increases the speed of nearby buildings like drills and conveyors. @@ -983,19 +976,19 @@ block.battery.description = Stores power whenever there is an abundance and prov block.battery-large.description = Stores much more power than a regular battery. block.combustion-generator.description = Wytwarza energię poprzez spalanie łatwopalnych materiałów. block.thermal-generator.description = Generates power when placed in hot locations. -block.turbine-generator.description = More efficient than a combustion generator, but requires additional water. +block.turbine-generator.description = Bardziej wydajny niż generator spalania, ale wymaga dodatkowej wody. block.differential-generator.description = Generates large amounts of energy. Utilizes the temperature difference between cryofluid and burning pyratite. block.rtg-generator.description = A radioisotope thermoelectric generator which does not require cooling but provides less power than a thorium reactor. block.solar-panel.description = Provides a small amount of power from the sun. block.solar-panel-large.description = Provides much better power supply than a standard solar panel, but is also much more expensive to build. block.thorium-reactor.description = Generates huge amounts of power from highly radioactive 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. +block.mechanical-drill.description = Tanie wiertło. Kiedy położnone na odpowiednich polach, wysyła przedmioty w wolnym tempie. block.pneumatic-drill.description = An improved drill which is faster and able to process harder materials by making use of air pressure. block.laser-drill.description = Allows drilling even faster through laser technology, but requires power. Additionally, radioactive thorium can be retrieved with this drill. block.blast-drill.description = The ultimate drill. Requires large amounts of power. -block.water-extractor.description = Extracts water from the ground. Use it when there is no lake nearby. -block.cultivator.description = Cultivates tiny concentrations of spores into industry-ready pods. +block.water-extractor.description = Wydobywa wodę z ziemi. Użyj go, gdy w pobliżu nie ma jeziora. +block.cultivator.description = Uprawia małe skupiska zarodników w gotowe do użytku kapsułki. block.oil-extractor.description = Uses large amounts of power in order to extract oil from sand. Use it when there is no direct source of oil nearby. 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. @@ -1005,23 +998,23 @@ block.container.description = Stores a small amount of items of each type. An[LI 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 on the unloader. block.launch-pad.description = Launches batches of items without any need for a core launch. Unfinished. 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 = A medium-sized 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 artillery turret. -block.wave.description = A medium-sized rapid-fire turret which shoots liquid bubbles. -block.lancer.description = A medium-sized turret which shoots charged electricity beams. -block.arc.description = A small close-range turret which shoots electricity in a random arc towards the enemy. -block.swarmer.description = A medium-sized turret which shoots burst missiles. -block.salvo.description = A medium-sized turret which fires shots in salvos. -block.fuse.description = A large turret which shoots powerful short-range beams. -block.ripple.description = A large artillery turret which fires several shots simultaneously. -block.cyclone.description = A large rapid fire turret. -block.spectre.description = A large turret which shoots two powerful bullets at once. -block.meltdown.description = A large turret which shoots powerful long-range beams. -block.draug-factory.description = Produces Draug mining drones. -block.spirit-factory.description = Produces light drones which mine ore and repair blocks. -block.phantom-factory.description = Produces advanced drone units which are significantly more effective than a spirit drone. +block.duo.description = Mała, tania wieża. Przydatny przeciwko jednostkom naziemnym. +block.scatter.description = Średniej wielkości wieża przeciwlotnicza. Rozsiewa śruty z ołowiu lub strzępy złomu na jednostki wroga. +block.scorch.description = Spala wszystkich wrogów naziemnych w pobliżu. Bardzo skuteczny z bliskiej odległości. +block.hail.description = Mała wieża artyleryjska, bardzo przydatna, atakuje tylko jednostki naziemne. +block.wave.description = Średniej wielkości szybkostrzelna wieżyczka, która wystrzeliwuje płynne bąbelki. Gasi ogień jeżeli jest w niej woda lub lodociecz +block.lancer.description = Średniej wielkości wieżyczka, która strzela naładowanymi wiązkami elektryczności. +block.arc.description = Mała wieża bliskiego zasięgu, która wystrzeliwuje elektryczność losowym łukiem w kierunku wroga. +block.swarmer.description = Średniej wielkości wieżyczka, która strzela rakietami wybuchowymi. +block.salvo.description = Średniej wielkości wieża strzelająca salwami. +block.fuse.description = Duża wieża, która strzela potężnymi wiązkami krótkiego zasięgu. +block.ripple.description = Duża wieża artyleryjska, która strzela jednocześnie kilkoma strzałami. +block.cyclone.description = Duża szybkostrzelna wieża. +block.spectre.description = Duża wieża, która strzela dwoma potężnymi pociskami jednocześnie. +block.meltdown.description = Duża wieża, która strzela potężnymi wiązkami dalekiego zasięgu. +block.draug-factory.description = Produkuje drony wydobywcze Draug. +block.spirit-factory.description = Produkuje lekkie drony, które naprawiają bloki. +block.phantom-factory.description = Produkuje zaawansowane drony które pomgają przy budowie. 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 laser air units. diff --git a/core/assets/bundles/bundle_pt_BR.properties b/core/assets/bundles/bundle_pt_BR.properties index e062e9ee4a..277931b660 100644 --- a/core/assets/bundles/bundle_pt_BR.properties +++ b/core/assets/bundles/bundle_pt_BR.properties @@ -43,6 +43,7 @@ newgame = Novo Jogo none = minimap = Mini-Mapa close = Fechar +website = Website quit = Sair maps = Mapas continue = Continuar @@ -71,6 +72,7 @@ server.kicked.nameEmpty = Voce deve ter pelo menos uma letra ou numero. server.kicked.idInUse = Voce ja esta neste servidor! Conectar com duas contas não é permitido. server.kicked.customClient = Este servidor não suporta construções customizadas. Baixe a versão original. server.kicked.gameover = Fim de jogo! +server.versions = Your version:[accent] {0}[]\nServer version:[accent] {1}[] host.info = The [accent]Hospedar[]Botão Hopeda um servidor no Host[scarlet]6567[] e [scarlet]6568.[]\nQualquer um no [LIGHT_GRAY]Wi-fi Ou Internet local[] Pode ver este servidor na lista de servidores.\n\nSe voce quer poder entrar em qualquer servidor em seu ip, [accent]port forwarding[] é requerido.\n\n[LIGHT_GRAY]Note: Se alguem esta com problemas em conectar no seu servidor lan, Tenha certeza que deixou mindustry Acessar sua internet local nas configurações de firewall join.info = Aqui, Você pode entar em um [accent]IP De servidor[] Para conectar, Ou descobrir [accent]Servidores[] Da rede local.\nAmbos os servidores LAN e WAN São suportados.\n\n[LIGHT_GRAY]Note: Não tem uma lista de servidores automaticos; Se você quer conectar ao IP de alguem, Você precisa pedir o IP Ao Rosteador. hostserver = Hospedar servidor @@ -154,7 +156,10 @@ cancel = Cancelar openlink = Abrir Link copylink = Copiar link back = Voltar +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 = Você tem certeza que quer sair? +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]Carregando... saving = [accent]Salvando... wave = [accent]Horda {0} @@ -263,6 +268,7 @@ filters.empty = [LIGHT_GRAY]Sem filtro! Adicione um usando o botão abaixo. filter.distort = Distorcedor filter.noise = Ruído filter.median = Median +filter.oremedian = Ore Median filter.blend = Blend filter.defaultores = Default Ores filter.ore = Minério @@ -302,6 +308,7 @@ ping = Ping: {0}ms language.restart = Por favor Reinicie seu jogo para a tradução tomar efeito. settings = Configurações tutorial = Tutorial +tutorial.retake = Re-Take Tutorial editor = Editor mapeditor = Editor de mapa donate = Doar @@ -315,8 +322,9 @@ bestwave = [LIGHT_GRAY]Melhor: {0} launch = Lançar launch.title = Lançamento feito com sucesso launch.next = [LIGHT_GRAY]próxima oportunidade na onda {0} -launch.unable = [scarlet]Incapaz de LANÇAR.[] Enimigos. +launch.unable2 = [scarlet]Unable to LAUNCH.[] 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 = If you skip now, you will not be able to launch until later waves. uncover = Descobrir configure = Configurar carregamento configure.locked = [LIGHT_GRAY]Alcançe a onda {0}\npara Configurar o Loadout. @@ -352,6 +360,7 @@ zone.tarFields.name = Campos de Tar 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. @@ -363,6 +372,7 @@ zone.overgrowth.description = This area is overgrown, closer to the source of th zone.tarFields.description = The outskirts of an oil production zone, between the mountains and desert. One of the few areas with usable tar reserves.\nAlthough abandoned, this area has some dangerous enemy forces nearby. Do not underestimate them.\n\n[lightgray]Research oil processing technology if possible. zone.desolateRift.description = An extremely dangerous zone. Plentiful resources, but little space. High risk of destruction. Leave as soon as possible. Do not be fooled by the long spacing between enemy attacks. zone.nuclearComplex.description = A former facility for the production and processing of thorium, reduced to ruins.\n[lightgray]Research the thorium and its many uses.\n\nThe enemy is present here in great numbers, constantly scouting for attackers. +zone.fungalPass.description = A transition area between high mountains and lower, spore-ridden lands. A small enemy reconnaissance base is located here.\nDestroy it.\nUse Dagger and Crawler units. Take out the two cores. zone.impact0078.description = zone.crags.description = settings.language = Linguagem @@ -417,6 +427,7 @@ blocks.inaccuracy = Imprecisão blocks.shots = Tiros blocks.reload = Recarregar blocks.ammo = Munição +bar.drilltierreq = Better Drill Required bar.drillspeed = Velocidade da furadeira: {0}/s bar.efficiency = Eficiencia: {0}% bar.powerbalance = Energia: {0} @@ -491,6 +502,7 @@ setting.lasers.name = Mostrar lasers setting.pixelate.name = Pixelizado [LIGHT_GRAY](Pode diminuir a performace) setting.minimap.name = Mostrar minimapa setting.musicvol.name = Volume da Música +setting.ambientvol.name = Ambient Volume setting.mutemusic.name = Desligar Música setting.sfxvol.name = Volume de Efeitos setting.mutesound.name = Desligar Som @@ -819,9 +831,10 @@ block.container.name = Container block.launch-pad.name = Plataforma de lançamento block.launch-pad-large.name = Plataforma de lançamento grande team.blue.name = Azul -team.red.name = Vermelho +team.crux.name = red +team.sharded.name = orange team.orange.name = Laranja -team.none.name = Cinza +team.derelict.name = derelict team.green.name = Verde team.purple.name = Roxo unit.spirit.name = Drone Spirit @@ -839,27 +852,26 @@ unit.chaos-array.name = Arraia do caos unit.eradicator.name = Erradicador unit.lich.name = Lich unit.reaper.name = Ceifador -tutorial.begin = Sua missão aqui é de erradicar[LIGHT_GRAY] Inimigo[].\n\nComeçe por[accent] Minerar cobre[]. Clique numa veia de cobre perto de seu core para fazer isso. +tutorial.next = [lightgray] +tutorial.intro = You have entered the[scarlet] Mindustry Tutorial.[]\nBegin by[accent] mining copper[]. Tap a copper ore vein near your core to do this.\n\n[accent]{0}/{1} copper tutorial.drill = Minerar manualmente é ineficiente.\n[accent]Mineradoras []podem minerar automaticamente.\nColoque uma numa veia de cobre. +tutorial.drill.mobile = Mining manually is inefficient.\n[accent]Drills []can mine automatically.\nTap the drill tab in the bottom right.\nSelect the[accent] mechanical drill[].\nPlace it on a copper vein by tapping, then press the[accent] checkmark[] below to confirm your selection.\nPress the[accent] X button[] to cancel placement. +tutorial.blockinfo = Each block has different stats. Each drill can only mine certain ores.\nTo check a block's info and stats,[accent] tap the "?" button while selecting it in the build menu.[]\n\n[accent]Access the Mechanical Drill's stats now.[] tutorial.conveyor = [accent]Esteiras[] São usadas para transportar itens até o core.\nFaça uma linha de Esteiras da mineradora até o core. -tutorial.morecopper = Mais cobre é preciso.\n\nTanto minere manualmente, Ou coloque mais mineradoras. +tutorial.conveyor.mobile = [accent]Conveyors[] are used to transport items to the core.\nMake a line of conveyors from the drill to the core.\n[accent] Place in a line by holding down your finger for a few seconds[] and dragging in a direction.\n\n[accent]{0}/{1} conveyors placed in line\n[accent]0/1 items delivered tutorial.turret = Estruturas defensivas devem ser construidas para repelir[LIGHT_GRAY] O inimigo[].\nConstrua uma torre dupla perto de sua base. tutorial.drillturret = Torres duplas precisam de[accent] Cobre como munição []Para atirar.\nColoque uma mineradoura Proxima a torre Para carregar ela com cobre minerado. +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 = O[LIGHT_GRAY] Inimigo[] se aproxima.\n\nDefenda seu core por 2 ondas. Construa mais torres. -tutorial.lead = Mais minerios estão disponiveis. Explore e minere[accent] Cobre[].\n\nArraste Da sua unidade até o core para transferir recursos. -tutorial.smelter = Cobre e chumbo são materiais fracos.\nLiga densa[accent] Superior[] Pode ser feito num fundidor.\n\nConstrua um. -tutorial.densealloy = O fundidor agora vai fazer a liga.\nPegue.\nMelhore a produção se necessario. -tutorial.siliconsmelter = O core agora vai criar[accent] O drone Spirit[] Para minerar e consertar blocos.\n\nFabricas para outras unidades podem ser criadas usando [accent] silicio.\nFaça um fundidor de Silicio. -tutorial.silicondrill = Silicio requer[accent] carvão[] e[accent] areia[].\nComeçe a fazer mineradouras. -tutorial.generator = Essa tecnologia requer energia.\nCrie[accent] um gerador a combustão[] para isso. -tutorial.generatordrill = Gerador de combustão requer combustivel.\nCarregue com carvão minerado. -tutorial.node = Energia requer transporte.\nCrie um[accent] Nodo de energia[] Proximo do gerador de combustão. -tutorial.nodelink = Poder pode ser transportado construindo blocos de energia e geradores, Apenas construindo nodos de Energia.\n\nLigue a energia clicando no nodo e selecionando o gerador e o fundidor de silicio. -tutorial.silicon = Silicio esta sendo feito. Pegue.\n\nMelhorar a produção é recomendado. -tutorial.daggerfactory = Construa uma[accent] Fabrica do meca Dagger.[]\n\nIsso vai ser feito para construi mecas de ataque. -tutorial.router = Fabricas precisam de recursos pra construir\nCrie um roteador para espalhadar recursos da esteira. -tutorial.dagger = Ligue os nodos de energia a fabrica.\nQuando os requerimentos forem alcançados, Um meca vai ser criado.\n\nCrie mais mineradoras, geradoras e esteiras se necessario. -tutorial.battle = O[LIGHT_GRAY] Inimigo[] revelou seu core.\nDestrua com sua unidade e Dagger's. +tutorial.waves.mobile = The[lightgray] enemy[] approaches.\n\nDefend the core for 2 waves. Your ship will automatically fire at enemies.\nBuild more turrets and drills. Mine more copper. +tutorial.launch = Once you reach a specific wave, you are able to[accent] launch the core[], leaving your defenses behind and[accent] obtaining all the resources in your core.[]\nThese resources can then be used to research new technology.\n\n[accent]Press the launch button. item.copper.description = Um material de estrutura util. Usado extensivamente em Maioria dos blocos. item.lead.description = Material de começo basico. usado intensivamente em Blocos de transporte de liquidos e eletronicos. item.metaglass.description = Composto de vidro super-Resistente. Extensivamente usado Para distribuição de líquido e armazem. @@ -896,13 +908,9 @@ unit.crawler.description = A ground unit consisting of a stripped-down frame wit unit.titan.description = Uma unidade armadurada terreste avancada. Usa carbide como munição. Ataca ambas as unidades de Aereas e terrestres. unit.fortress.description = Uma unidade pesada de artilharia terrestre. unit.eruptor.description = A heavy mech designed to take down structures. Fires a stream of slag at enemy fortifications, melting them and setting volatiles on fire. -unit.chaos-array.description = -unit.eradicator.description = unit.wraith.description = Uma unidade rapida, Interceptadora de bater e correr. unit.ghoul.description = Um bombardeiro pesado. Usa composto de explosão Ou piratite como munição. unit.revenant.description = A heavy, hovering missile array. -unit.lich.description = -unit.reaper.description = block.graphite-press.description = Compresses chunks of coal into pure sheets of graphite. block.multi-press.description = An upgraded version of the graphite press. Employs water and power to process coal quickly and efficiently. block.silicon-smelter.description = Reduz areia a coque altamente puro Para fazer silicio. diff --git a/core/assets/bundles/bundle_ru.properties b/core/assets/bundles/bundle_ru.properties index f2bcb41d25..44ad5b1373 100644 --- a/core/assets/bundles/bundle_ru.properties +++ b/core/assets/bundles/bundle_ru.properties @@ -1,4 +1,4 @@ -credits.text = Создатель [ROYAL] Anuken — [SKY]anukendev@gmail.com[][]\n\nЕсть недоработки в переводе или хотите найти союзников для совместной игры?\nПишите в офф. discord-сервер Mindustry в канал #русский.\n\nПереводчики на русский язык:\n[YELLOW]Prosta4ok_ua\n[BLACK]XZimur\n[BLUE]Beryllium +credits.text = Создатель [ROYAL]Anuken[] — [SKY]anukendev@gmail.com[]\n\nЕсть недоработки в переводе или хотите найти союзников для совместной игры?\nПишите в оф. discord-сервер Mindustry в канал #русский.\n\nПереводчики на русский язык:\n[YELLOW]Prosta4ok_ua\n[BLACK]XZimur\n[BLUE]Beryllium\nРедактор:\n[SLATE]Felix Corvus credits = Авторы contributors = Переводчики и помощники discord = Присоединяйтесь к нашему Discord! @@ -7,33 +7,32 @@ 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 = Скачать для Android с Google play link.wiki.description = Официальная вики -linkfail = Не удалось открыть ссылку!\nURL-адрес была скопирована в буфер обмена. +linkfail = Не удалось открыть ссылку!\nURL-адрес был скопирован в буфер обмена. screenshot = Cкриншот сохранён в {0} screenshot.invalid = Карта слишком большая, возможно, не хватает памяти для скриншота. gameover = Игра окончена gameover.pvp = [accent] {0}[] команда победила! -highscore = [YELLOW]Новый рекорд! +highscore = [accent]Новый рекорд! stat.wave = Волн отражено:[accent] {0} stat.enemiesDestroyed = Врагов уничтожено:[accent] {0} stat.built = Строений построено:[accent] {0} stat.destroyed = Строений уничтожено:[accent] {0} stat.deconstructed = Строений деконструировано:[accent] {0} -stat.delivered = Ресурсов добыто: +stat.delivered = Ресурсов запущено: stat.rank = Финальный счёт: [accent]{0} -placeline = Вы выбрали блок.\nВы можете [accent]строить в линию[], [accent]удерживая палец в течение нескольких секунд[] и потом перетаскивая его.\n\n[scarlet]СДЕЛАЙ ЭТО. -removearea = Вы выбрали режим удаления.\nВы можете [accent]удалять блоки в выбранной области[], [accent]удерживая палец несколько секунд[] и потом перетаскивая его.\n\n[scarlet]СДЕЛАЙ ЭТО. -launcheditems = [accent]Запущенные предметы +placeline = Вы Выбрали блок.\nВы можете[accent] строить в линию[],[accent] удерживая палец в течение нескольких секунд[] и потом перетаскивая его.\n\n[scarlet]СДЕЛАЙ ЭТО. +removearea = Вы Выбрали режим удаления.\nВы можете[accent] удалять блоки в прямоугольной области[],[accent] удерживая палец несколько секунд[] и потом перетаскивая его.\n\n[scarlet]СДЕЛАЙ ЭТО. +launcheditems = [accent]Запущенные Предметы map.delete = Вы действительно хотите удалить карту «[accent]{0}[]»? level.highscore = Рекорд: [accent]{0} level.select = Выбор карты level.mode = Режим игры: showagain = Не показывать снова до следующей сессии coreattack = < Ядро находится под атакой! > -nearpoint = [[ [scarlet]ПОКИНЬТЕ ЗОНУ НЕМЕДЛЕННО[] ]\nАннигиляция неизбежна. -outofbounds = [[ ЗА ГРАНИЦАМИ ]]\n[]самоуничтожение через{0} +nearpoint = [[ [scarlet]ПОКИНЬТЕ ТОЧКУ ВЫСАДКИ ПРОТИВНИКОВ НЕМЕДЛЕННО[] ]\nАннигиляция неизбежна. database = База данных ядра savegame = Сохранить игру loadgame = Загрузить игру @@ -48,21 +47,21 @@ website = Веб-сайт quit = Выход maps = Карты continue = Продолжить -maps.none = [LIGHT_GRAY]Карты не найдены! +maps.none = [lightgray]Карты не найдены! about.button = Об игре name = Имя: noname = Для начала, придумайте[accent] себе имя[]. filename = Имя файла: unlocked = Новый контент разблокирован! completed = [accent]Завершено -techtree = Технологическое дерево -research.list = [LIGHT_GRAY]Исследование: +techtree = Дерево технологий +research.list = [lightgray]Исследование: research = Исследование -researched = [LIGHT_GRAY]{0} исследовано. +researched = [lightgray]{0} исследовано. players = Игроков на сервере: {0} players.single = {0} игрок на сервере -server.closing = [accent]Закрытие сервера... -server.kicked.kick = Вас выгнали с сервера! +server.closing = [accent]Закрытие сервера… +server.kicked.kick = Вас Выгнали с сервера! server.kicked.serverClose = Сервер закрыт. server.kicked.clientOutdated = Устаревший клиент! Обновите игру! server.kicked.serverOutdated = Устаревший сервер! Попросите администратора сервера обновить сервер/игру! @@ -73,18 +72,19 @@ server.kicked.nameEmpty = Ваше имя должно содержать хот server.kicked.idInUse = Вы уже на этом сервере! Соединение с двумя учетными записями не разрешено. server.kicked.customClient = Этот сервер не поддерживает пользовательские сборки. Загрузите официальную версию. server.kicked.gameover = Игра окончена! -host.info = Кнопка [accent]Сервер[] размещает сервер на порте [accent]6567[].[]\nЛюбой пользователь в той же [LIGHT_GRAY]сети[] получет возможность видеть ваш сервер в своём списке серверов.\n\nЕсли вы хотите, чтобы люди могли подключаться из любого места по IP, то требуется переадресация(проброс) портов.[].\n\n[LIGHT_GRAY] Примечание. Если у кого-то возникают проблемы с подключением к вашей локальной сети, убедитесь, что вы разрешили доступ Mindustry к вашей локальной сети в настройках брандмауэра. Обратите внимание, что публичные сети иногда не позволяют обнаружение сервера. -join.info = Здесь вы можете ввести IP-адрес [accent]сервера[] для подключения или открыть [accent]локальную сеть [] для подключения к другим серверам.\nПоддерживается многопользовательский режим LAN и WAN.\n\n[LIGHT_GRAY] Примечание: это не является автоматическим глобальным списком серверов; если вы хотите подключиться к кому-то по IP, вам нужно будет спросить у хоста его IP-адрес. -hostserver = Запустить многопользовательский сервер -hostserver.mobile = Запустить\nсервер +server.versions = Ваша версия:[accent] {0}[]\nВерсия сервера:[accent] {1}[] +host.info = Кнопка [accent]Сервер[] запускает сервер на порте [accent]6567[]. \nЛюбой пользователь в той же [lightgray]локальной сети или WiFi[] должен увидеть ваш сервер в своём списке серверов.\n\nЕсли Вы хотите, чтобы люди могли подключаться из откуда угодно по IP, то требуется [accent]переадресация (проброс) портов[].\n\n[lightgray]Примечание: Если у кого-то возникают проблемы с подключением к вашей игре по локальной сети, убедитесь, что Вы разрешили доступ Mindustry к вашей локальной сети в настройках брандмауэра. Обратите внимание, что публичные сети иногда не позволяют обнаружение сервера. +join.info = Здесь Вы можете ввести [accent]IP-адрес сервера[] для подключения или открыть [accent]локальную сеть[] для подключения к другим серверам.\nПоддерживаются оба многопользовательских режима: LAN и WAN.\n\n[lightgray]Примечание: это НЕ автоматический глобальный список серверов; если Вы хотите подключиться к кому-то по IP, вам нужно спросить у хоста его IP-адрес. +hostserver = Запустить многопользовательский cервер +hostserver.mobile = Запустить\ncервер host = Сервер -hosting = [accent]Открытие сервера... +hosting = [accent]Открытие сервера… hosts.refresh = Обновить hosts.discovering = Поиск локальных игр server.refreshing = Обновление сервера hosts.none = [lightgray]Локальных игр не обнаружено! host.invalid = [scarlet]Не удаётся подключиться к хосту. -trace = Слежка за игроком +trace = Отслеживать игрока trace.playername = Имя игрока: [accent]{0} trace.ip = IP: [accent]{0} trace.id = ID: [accent]{0} @@ -110,21 +110,21 @@ confirmunadmin = Вы действительно хотите убрать эт joingame.title = Присоединиться к игре joingame.ip = IP: disconnect = Отключено. -disconnect.data = Не удалось загрузить данные мира! -connecting = [accent]Подключение... -connecting.data = [accent]Загрузка данных мира... +disconnect.data = Ошибка при загрузке данных мира! +connecting = [accent]Подключение… +connecting.data = [accent]Загрузка данных мира… server.port = Порт: server.addressinuse = Данный адрес уже используется! server.invalidport = Неверный номер порта! -server.error = [crimson]Ошибка создания сервера: [accent] {0} -save.old = Это сохранение для более старой версии игры и больше не может использоваться.\n\n[LIGHT_GRAY]Совместимость сохранений будет реализована в финальной версии 4.0. +server.error = [crimson]Ошибка создания сервера: [accent]{0} +save.old = Это сохранение для старой версии игры и больше не может использоваться.\n\n[lightgray]Совместимость сохранений будет реализована в финальной версии 4.0. save.new = Новое сохранение -save.overwrite = Вы уверены,что хотите перезаписать этот слот для сохранения? +save.overwrite = Вы уверены, что хотите перезаписать\nэтот слот для сохранения? overwrite = Перезаписать save.none = Сохранения не найдены! -saveload = [accent]Сохранение... +saveload = Сохранение… savefail = Не удалось сохранить игру! -save.delete.confirm = Вы уверены,что хотите удалить это сохранение? +save.delete.confirm = Вы уверены, что хотите удалить это сохранение? save.delete = Удалить save.export = Экспортировать сохранение save.import.invalid = [accent]Это сохранение недействительно! @@ -136,17 +136,17 @@ save.rename = Переименовать save.rename.text = Новое название: selectslot = Выберите сохранение. slot = [accent]Слот {0} -save.corrupted = [accent]Сохранённый файл повреждён или имеет недействительный формат!\nЕсли вы только что обновили свою игру, это, вероятно, из-за изменения формата сохранения, [scarlet]и не является[] ошибкой. +save.corrupted = [accent]Сохранённый файл повреждён или имеет недопустимый формат!\nЕсли Вы только что обновили свою игру, это, вероятно, из-за изменения формата сохранения, и [scarlet]не является[] ошибкой. empty = <Пусто> on = Вкл off = Выкл save.autosave = Автосохранение: {0} save.map = Карта: {0} -save.wave = Волна: {0} +save.wave = Волна {0} save.difficulty = Сложность: {0} save.date = Последнее сохранение: {0} save.playtime = Время в игре: {0} -warning = Предупреждение +warning = Предупреждение. confirm = Подтверждение delete = Удалить ok = ОК @@ -157,18 +157,18 @@ openlink = Открыть ссылку copylink = Скопировать ссылку back = Назад classic.export = Экспортировать данные с классической версии? -classic.export.text = Классическое (версия 3.5 сборка 40) сохранение или карта были обнаруженыd. Вы хотите экспортировать эти данные в домашнюю папку вашего телефона, для использования в приложении Mindustry Classic? -quit.confirm = Вы уверены, что хотите выйти? -quit.confirm.tutorial = Вы уверены, что хотите выйти из обучения? -loading = [accent]Загрузка... -saving = [accent]Сохранение... +classic.export.text = [accent]Mindustry[] получил глобальное обновление.\nБыло обнаружено Классическое (версия 3.5 сборка 40) сохранение или карта. Вы хотите экспортировать эти сохранения в домашнюю папку вашего телефона, для использования в приложении Mindustry Classic? +quit.confirm = Вы уверены, что хотите Выйти? +quit.confirm.tutorial = Вы уверены, что знаете Что делаете?\nОбучение может быть повторно запущено через[accent] Настройки->Игра->Открыть обучение.[] +loading = [accent]Загрузка… +saving = [accent]Сохранение… wave = [accent]Волна {0} -wave.waiting = [LIGHT_GRAY]Волна через {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 = Неизвестно @@ -176,15 +176,15 @@ custom = Пользовательская builtin = Встроенная map.delete.confirm = Вы действительно хотите удалить эту карту? Это действие не может быть отменено! map.random = [accent]Случайная карта -map.nospawn = Эта карта не имеет ни одного ядра, в котором игрок может появиться! Добавьте [ROYAL]оранжевое[] ядро на эту карту в редакторе карт. -map.nospawn.pvp = У этой карты нет вражеских ядер, в которых игрок может появиться! Добавьте [SCARLET]не оранжевое[] ядро на эту карту в редакторе. -map.nospawn.attack = У этой карты нет вражеских ядер! Добавьте [scarlet]не синее[] ядро на эту карту в редакторе. +map.nospawn = Эта карта не имеет ни одного ядра, в котором игрок может появиться! Добавьте[accent] оранжевое[] ядро на эту карту в редакторе. +map.nospawn.pvp = У этой карты нет вражеских ядер, в которых игрок может появиться! Добавьте[SCARLET] не оранжевое[] ядро на эту карту в редакторе. +map.nospawn.attack = У этой карты нет вражеских ядер для атаки игроком! Добавьте[SCARLET] красное[] ядро на эту карту в редакторе. map.invalid = Ошибка загрузки карты: повреждённый или недопустимый файл карты. editor.brush = Кисть editor.openin = Открыть в редакторе editor.oregen = Генерация руд -editor.oregen.info = Генерация Руд: -editor.mapinfo = Информация о карте +editor.oregen.info = Генерация руд: +editor.mapinfo = Параметры карты editor.author = Автор: editor.description = Описание: editor.waves = Волны: @@ -195,26 +195,26 @@ editor.newmap = Новая карта waves.title = Волны waves.remove = Удалить waves.never = <никогда> -waves.every = Каждый +waves.every = каждый waves.waves = волна(ы) 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]<По умолчанию> -edit = Редактировать... +waves.none = Враги не были определены.\nОбратите внимание, что пустые волны будут автоматически заменены обычной волной. +editor.default = [lightgray]<По умолчанию> +edit = Редактировать… editor.name = Название: editor.spawn = Создать боевую единицу editor.removeunit = Удалить боевую единицу editor.teams = Команды -editor.errorload = Ошибка загрузки изображения: [accent] {0} -editor.errorsave = Ошибка сохранения изображения: [accent] {0} +editor.errorload = Ошибка загрузки файла:\n[accent]{0} +editor.errorsave = Ошибка сохранения файла:\n[accent]{0} editor.errorimage = Это изображение, а не карта. Не нужно менять расширение, ожидая, что это сработает.\n\nЕсли Вы хотите импортировать устаревшую карту, то используйте кнопку «Импортировать устаревшее изображение» в редакторе. editor.errorlegacy = Эта карта слишком старая и использует устаревший формат карты, который больше не поддерживается. editor.errorheader = Этот файл карты недействителен или повреждён. @@ -227,24 +227,24 @@ editor.resize = Изменить\nразмер editor.loadmap = Загрузить\nкарту editor.savemap = Сохранить\nкарту editor.saved = Сохранено! -editor.save.noname = У Вашей карты нет имени! Назовите её в «Информация о карте». +editor.save.noname = У Вашей карты нет имени! Назовите её в меню «Информация о карте». editor.save.overwrite = Ваша карта не может быть записана поверх встроенной карты! Введите другое название в меню «Информация о карте» -editor.import.exists = [scarlet]Не удалось импортировать: []карта с данным именем уже существует '{0}'! -editor.import = Импорт... +editor.import.exists = [scarlet]Не удалось импортировать:[] карта с именем «{0}» уже существует! +editor.import = Импорт… editor.importmap = Импортировать карту editor.importmap.description = Импортировать уже существующую карту editor.importfile = Импортировать файл -editor.importfile.description = Импортировать файл карты из вне +editor.importfile.description = Импортировать файл карты извне editor.importimage = Импортировать устаревшее изображение -editor.importimage.description = Импортировать файл с изображением ландшафта -editor.export = Экспорт... +editor.importimage.description = Импортировать изображение карты извне +editor.export = Экспорт… editor.exportfile = Экспортировать файл editor.exportfile.description = Экспорт файла карты editor.exportimage = Экспортировать изображение ландшафта editor.exportimage.description = Экспортировать файл с изображением карты -editor.loadimage = Загрузить\nизображение -editor.saveimage = Сохранить\nизображение -editor.unsaved = [scarlet]У вас есть несохранённые изменения![]\nВы уверены, что хотите выйти? +editor.loadimage = Импортировать\nизображение +editor.saveimage = Экспортировать\nизображение +editor.unsaved = [scarlet]У вас есть несохранённые изменения![]\nВы уверены, что хотите Выйти? editor.resizemap = Изменить размер карты editor.mapname = Название карты: editor.overwrite = [accent]Внимание! \nЭто перезапишет уже существующую карту. @@ -256,15 +256,15 @@ toolmode.replaceall = Заменить всё toolmode.replaceall.description = Заменяет все блоки на карте. toolmode.orthogonal = Ортогональная toolmode.orthogonal.description = Рисует только ортогональные линии. -toolmode.square = Прямоугольник -toolmode.square.description = Прямоугольная кисть. +toolmode.square = Квадрат +toolmode.square.description = Квадратная кисть. toolmode.eraseores = Стереть руды toolmode.eraseores.description = Стереть только руды. toolmode.fillteams = Изменить команду блоков -toolmode.fillteams.description = Изменяет блоки команды. +toolmode.fillteams.description = Изменяет принадлежность блоков к команде. toolmode.drawteams = Изменить команду блока -toolmode.drawteams.description = Изменяет блок команды. -filters.empty = [LIGHT_GRAY]Нет фильтров. Добавьте один при помощи кнопки ниже. +toolmode.drawteams.description = Изменяет принадлежность блока к команде. +filters.empty = [lightgray]Нет фильтров! Добавьте один при помощи кнопки ниже. filter.distort = Искажение filter.noise = Шум filter.median = Медиана @@ -273,18 +273,18 @@ filter.blend = Смешивание filter.defaultores = Руды по умолчанию filter.ore = Руда filter.rivernoise = Речной шум -filter.mirror = Зеркало +filter.mirror = Отражение filter.clear = Очистить filter.option.ignore = Игнорировать -filter.scatter = Распылитель +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.octaves = Октавы -filter.option.falloff = Спад +filter.option.mag = Сила применения +filter.option.threshold = Предельный порог +filter.option.circle-scale = Масштаб круга +filter.option.octaves = Цикличность применения +filter.option.falloff = Спад цикличности filter.option.angle = Угол filter.option.block = Блок filter.option.floor = Поверхность @@ -292,7 +292,7 @@ filter.option.flooronto = Целевая поверхность filter.option.wall = Стена filter.option.ore = Руда filter.option.floor2 = Вторая поверхность -filter.option.threshold2 = Вторичный спад +filter.option.threshold2 = Вторичный предельный порог filter.option.radius = Радиус filter.option.percentile = Спад width = Ширина: @@ -304,38 +304,38 @@ load = Загрузить save = Сохранить fps = FPS: {0} tps = TPS: {0} -ping = Пинг: {0} мс +ping = Пинг: {0}мс language.restart = Перезагрузите игру, чтобы языковые настройки вступили в силу. settings = Настройки tutorial = Обучение -tutorial.retake = Открыть обучение +tutorial.retake = Перепройти обучение editor = Редактор mapeditor = Редактор карт donate = Пожертво\nвать abandon = Покинуть -abandon.text = Эта зона и все ресурсы будут потеряны. +abandon.text = Эта зона и все её ресурсы будут отданы противнику. locked = Заблокировано -complete = [LIGHT_GRAY]Достигнута: +complete = [lightgray]Достигнута: zone.requirement = Волна {0} в зоне {1} -resume = Возобновить зону:\n[LIGHT_GRAY]{0} -bestwave = [LIGHT_GRAY]Наилучшая волна: {0} +resume = Возобновить зону:\n[lightgray]{0} +bestwave = [lightgray]Наилучшая волна: {0} launch = < ЗАПУСК > launch.title = Запуск успешен launch.next = [LIGHT_GRAY]Cледующая возможность на {0}-той волне launch.unable2 = [scarlet]ЗАПУСК невозможен.[] launch.confirm = Это удалит все ресурсы в Вашем ядре.\nВы не сможете вернуться на эту базу. -launch.skip.confirm = Если вы пропустите сейчас, вы не сможете запустить до более поздних волн. +launch.skip.confirm = Если Вы пропустите сейчас, Вы не сможете запустить до более поздних волн. uncover = Раскрыть configure = Выгрузить конфигурацию -configure.locked = [LIGHT_GRAY]Возможность разблокировки выгрузки ресурсов будет доступна на {0}-ой волне. +configure.locked = [LIGHT_GRAY]Возможность разблокировки Выгрузки ресурсов будет доступна на {0}-ой волне. zone.unlocked = Зона «[LIGHT_GRAY]{0}» теперь разблокирована. -zone.requirement.complete = Вы достигли {0}-ой волны,\nУсловия для зоны «{1}» выполнены. -zone.config.complete = Вы достигли {0}-ой волны,\Возможность выгрузки ресурсов теперь разблокирована. +zone.requirement.complete = Вы достигли {0}-ой волны,\nУсловия для зоны «{1}» Выполнены. +zone.config.complete = Вы достигли {0}-ой волны,Возможность Выгрузки ресурсов теперь разблокирована. zone.resources = Обнаруженные ресурсы: zone.objective = [lightgray]Цель: [accent]{0} zone.objective.survival = Выжить zone.objective.attack = Уничтожить вражеское ядро -add = Добавить... +add = Добавить… boss.health = Здоровье босса connectfail = [crimson]Ошибка подключения: [accent] {0} error.unreachable = Сервер недоступен. @@ -344,7 +344,7 @@ error.timedout = Время ожидания истекло!\nУбедитесь error.mismatch = Ошибка пакета:\nвозможное несоответствие версии клиента/сервера. \nУбедитесь, что у Вас и у создателя сервера установлена последняя версия Mindustry! error.alreadyconnected = Вы уже подключены. error.mapnotfound = Файл карты не найден! -error.io = Сетевая ошибка ввода-вывода. +error.io = Сетевая ошибка ввода-Вывода. error.any = Неизвестная сетевая ошибка. error.bloom = Не удалось инициализировать цветение.\nВозможно, ваше устройство не поддерживает это. zone.groundZero.name = Нулевая земля @@ -360,18 +360,19 @@ 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Отважтесь создать энергию. Постройте генераторы внутреннего сгорания. Научитесь пользоваться регенератором. 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.stainedMountains.description = Дальше вглубь материка лежат горы, но не заражённые спорами.\nИзвлеките изобилие титана в этой области. Узнайте, как его использовать.\n\nВражеское присутствие здесь больше. Не дайте им время, чтобы отправлять свои сильнейшие боеВые единицы. +zone.overgrowth.description = Эта область заросла и находится ближе к источнику спор.\nВраг создал здесь форпост. Постройте боеВые единицы Кинжал. Уничтожьте его. Восстановите то, что было потеряно. zone.tarFields.description = Окраина зоны нефтедобычи, между горами и пустыней. Один из немногих районов с доступными запасами смолы.\nХотя область заброшенна, у неё есть некоторые опасные вражеские силы поблизости. Не стоит их недооценивать.\n\n[lightgray]Исследуйте технологию переработки нефти, если это возможно. -zone.desolateRift.description = Чрезвычайно опасная зона. Много ресурсов, но мало места. Эвакуироваться нужно как можно скорее. Не расслабляйтесь между вражескими атаками +zone.desolateRift.description = ЧрезВычайно опасная зона. Много ресурсов, но мало места. Эвакуироваться нужно как можно скорее. Не расслабляйтесь между вражескими атаками zone.nuclearComplex.description = Бывший завод по производству и переработке тория, превращенный в руины.\n[lightgray]Исследуйте торий и его многократное использование.\n\nВраг здесь присутствует в большом количестве, постоянно разыскивая нападавших. -zone.fungalPass.description = Переходная зона между высокими и низкими горами, покрытыми спорами землями. Здесь находится небольшая разведывательная база противника. \nУничтожьте ее. \nИспользуйте подразделения Кинжала и Камикадзе. +zone.fungalPass.description = Переходная зона между Высокими и низкими горами, покрытыми спорами землями. Здесь находится небольшая разведывательная база противника. \nУничтожьте ее. \nИспользуйте подразделения Кинжала и Камикадзе. zone.impact0078.description = <вставить описание здесь> zone.crags.description = <вставить описание здесь> settings.language = Язык @@ -381,9 +382,9 @@ settings.controls = Управление settings.game = Игра settings.sound = Звук settings.graphics = Графика -settings.cleardata = Очистить данные ... +settings.cleardata = Очистить данные… settings.clear.confirm = Вы действительно хотите очистить свои данные?\nЭто нельзя отменить! -settings.clearall.confirm = [scarlet]ОСТОРОЖНО![]\nЭто уничтожит все данные, включая сохранения, карты, разблокированное и настройки управления.\nПосле того как вы нажмете ОК, игра уничтожит все данные и автоматически закроется. +settings.clearall.confirm = [scarlet]ОСТОРОЖНО![]\nЭто уничтожит все данные, включая сохранения, карты, разблокированное и настройки управления.\nПосле того как Вы нажмете ОК, игра уничтожит все данные и автоматически закроется. settings.clearunlocks = Очистить разблокированное settings.clearall = Очистить всё paused = Пауза @@ -398,7 +399,7 @@ blocks.output = Выход blocks.booster = Ускоритель block.unknown = [LIGHT_GRAY]??? blocks.powercapacity = Вместимость энергии -blocks.powershot = Энергия/выстрел +blocks.powershot = Энергия/Выстрел blocks.damage = Урон blocks.targetsair = Воздушные цели blocks.targetsground = Наземные цели @@ -418,7 +419,6 @@ blocks.speedincrease = Увеличение скорости blocks.range = Радиус действия blocks.drilltier = Добывает blocks.drillspeed = Базовая скорость бурения -blocks.drilltierreq = Требуется лучший бур blocks.boosteffect = Ускоряющий эффект blocks.maxunits = Максимальное количество активных единиц blocks.health = Здоровье @@ -466,7 +466,7 @@ category.general = Основные category.power = Энергия category.liquids = Жидкости category.items = Предметы -category.crafting = Ввод/вывод +category.crafting = Ввод/Вывод category.shooting = Стрельба category.optional = Дополнительные улучшения setting.landscape.name = Только альбомный(горизонтальный) режим @@ -504,12 +504,12 @@ setting.minimap.name = Показать миникарту setting.musicvol.name = Громкость музыки setting.ambientvol.name = Звуки окружающей среды setting.mutemusic.name = Заглушить музыку -setting.sfxvol.name = Громкость звуковых эффектов +setting.sfxvol.name = Громкость звукоВых эффектов setting.mutesound.name = Заглушить звук -setting.crashreport.name = Отправлять анонимные отчёты о вылетах +setting.crashreport.name = Отправлять анонимные отчёты о Вылетах setting.chatopacity.name = Непрозрачность чата setting.playerchat.name = Отображать чат в игре -uiscale.reset = Масштаб пользовательского интерфейса был изменён.\nНажмите «ОК» для подтверждения этого масштаба.\n[scarlet]Возврат настроек и выход через[accent] {0}[] ... +uiscale.reset = Масштаб пользовательского интерфейса был изменён.\nНажмите «ОК» для подтверждения этого масштаба.\n[scarlet]Возврат настроек и Выход через[accent] {0}[]… uiscale.cancel = Отменить & Выйти setting.bloom.name = Свечение keybind.title = Настройка управления @@ -522,8 +522,8 @@ command.retreat = Отступить command.patrol = Патрулирование keybind.gridMode.name = Выбрать блок keybind.gridModeShift.name = Выбрать категорию -keybind.press = Нажмите клавишу... -keybind.press.axis = Нажмите клавишу... +keybind.press = Нажмите клавишу… +keybind.press.axis = Нажмите клавишу… keybind.screenshot.name = Скриншот карты keybind.move_x.name = Движение по оси x keybind.move_y.name = Движение по оси y @@ -553,7 +553,7 @@ mode.help.title = Описание режимов mode.survival.name = Выживание mode.survival.description = Обычный режим. В этом режиме надо самим добывать ресурсы и сами волны идут автоматически. \n[gray]Требуются точки появления врагов для игры. mode.sandbox.name = Песочница -mode.sandbox.description = Бесконечные ресурсы и нет таймера для волн, но можно самим вызвать волну. +mode.sandbox.description = Бесконечные ресурсы и нет таймера для волн, но можно самим Вызвать волну. mode.pvp.name = PvP mode.pvp.description = Боритесь против других игроков.\n[gray]Для игры требуется как минимум 2 ядра разного цвета на карте. mode.attack.name = Атака @@ -564,7 +564,7 @@ rules.wavetimer = Интервал волн rules.waves = Волны rules.attack = Режим атаки rules.enemyCheat = Бескон. ресурсы (ИИ) -rules.unitdrops = Ресурсы боевых единиц +rules.unitdrops = Ресурсы боеВых единиц rules.unitbuildspeedmultiplier = Множитель скорости производства боев. ед. rules.unithealthmultiplier = Множитель здоровья боев. ед. rules.playerhealthmultiplier = Множитель здоровья игрока @@ -576,7 +576,7 @@ rules.wavespacing = Интервал волн: [LIGHT_GRAY] (сек) rules.buildcostmultiplier = Множитель затрат на строительство rules.buildspeedmultiplier = Множитель скорости строительства rules.waitForWaveToEnd = Волны ожидают врагов -rules.dropzoneradius = Радиус зоны высадки врагов:[LIGHT_GRAY] (блоков) +rules.dropzoneradius = Радиус зоны Высадки врагов:[LIGHT_GRAY] (блоков) rules.respawns = Макс. кол-во возрождений за волну rules.limitedRespawns = Ограничение возрождений rules.title.waves = Волны @@ -587,7 +587,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 = Медь @@ -606,7 +606,7 @@ item.blast-compound.name = Взрывная смесь item.pyratite.name = Пиротит item.metaglass.name = Метастекло item.scrap.name = Металлолом -iquid.water.name = Вода +liquid.water.name = Вода liquid.slag.name = Шлак liquid.oil.name = Нефть liquid.cryofluid.name = Криогенная жидкость @@ -646,25 +646,24 @@ mech.buildspeed = [LIGHT_GRAY]Скорость строительства: {0}% liquid.heatcapacity = [LIGHT_GRAY]Теплоёмкость: {0} liquid.viscosity = [LIGHT_GRAY]Вязкость: {0} liquid.temperature = [LIGHT_GRAY]Температура: {0} -block.sand-boulder.name = Sand Boulder -block.grass.name = Трава block.sand-boulder.name = Песочный валун +block.grass.name = Трава block.salt.name = Соль block.saltrocks.name = Соляные Камни block.pebbles.name = Галька block.tendrils.name = Щупальца block.sandrocks.name = Песчаные Скалы block.spore-pine.name = Споровая сосна -block.sporerocks.name = Споровые камни +block.sporerocks.name = СпороВые камни block.rock.name = Камень block.snowrock.name = Снежный камень block.snow-pine.name = Снежные сосны block.shale.name = Сланец -block.shale-boulder.name = Сланцевый валун +block.shale-boulder.name = СланцеВый валун block.moss.name = Мох block.shrubs.name = Кусты -block.spore-moss.name = Споровый Мох -block.shalerocks.name = Сланцевые Породы +block.spore-moss.name = СпороВый Мох +block.shalerocks.name = СланцеВые Породы block.scrap-wall.name = Стена из металлолома block.scrap-wall-large.name = Великая стена из металлолома block.scrap-wall-huge.name = Огромная стена из металлолома @@ -681,7 +680,7 @@ block.core-nucleus.name = Ядро «Атом» block.deepwater.name = Глубоководье block.water.name = Вода block.tainted-water.name = Загрязнённая вода -block.darksand-tainted-water.name = Тёмный песок с загрязнённой вода +block.darksand-tainted-water.name = Тёмный песок с загрязнённой водой block.tar.name = Дёготь block.stone.name = Камень block.sand.name = Песок @@ -716,7 +715,7 @@ block.dark-panel-6.name = Тёмная панель 6 block.dark-metal.name = Тёмный металл block.ignarock.name = Магматические горные породы block.hotrock.name = Горячий камень -block.magmarock.name = Магмовый камень +block.magmarock.name = МагмоВый камень block.cliffs.name = Скалы block.copper-wall.name = Медная стена block.copper-wall-large.name = Большая медная стена @@ -734,14 +733,14 @@ block.scatter.name = Рассеиватель block.hail.name = Град block.lancer.name = Копейщик block.conveyor.name = Конвейер -block.titanium-conveyor.name = Титановый конвейер +block.titanium-conveyor.name = ТитаноВый конвейер block.junction.name = Перекрёсток block.router.name = Маршрутизатор block.distributor.name = Разветвитель block.sorter.name = Сортировщик block.overflow-gate.name = Избыточный затвор -block.silicon-smelter.name = Кремниевый плавильный завод -block.phase-weaver.name = Фазовый ткач +block.silicon-smelter.name = КремниеВый плавильный завод +block.phase-weaver.name = ФазоВый ткач block.pulverizer.name = Измельчитель block.cryofluidmixer.name = Мешалка криогенной жидкости block.melter.name = Плавильня @@ -783,14 +782,14 @@ block.wave.name = Волна block.swarmer.name = Роевик block.salvo.name = Залп block.ripple.name = Рябь -block.phase-conveyor.name = Фазовый конвейер +block.phase-conveyor.name = ФазоВый конвейер block.bridge-conveyor.name = Мостовой конвейер -block.plastanium-compressor.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.oil-extractor.name = Нефтяная Вышка block.draug-factory.name = Завод дронов «Драугр» block.spirit-factory.name = Завод ремонтных дронов «Призрак» block.phantom-factory.name = Завод строительных дронов «Фантом» @@ -803,13 +802,13 @@ block.fortress-factory.name = Завод мехов «Крепость» block.revenant-factory.name = Завод бомбардировщиков «Потусторонний убийца» block.repair-point.name = Ремонтный пункт block.pulse-conduit.name = Импульсный трубопровод -block.phase-conduit.name = Фазовый трубопровод +block.phase-conduit.name = ФазоВый трубопровод block.liquid-router.name = Жидкостный маршрутизатор block.liquid-tank.name = Жидкостный резервуар block.liquid-junction.name = Жидкостный перекрёсток block.bridge-conduit.name = Мостовой трубопровод block.rotary-pump.name = Роторный насос -block.thorium-reactor.name = Ториевый реактор +block.thorium-reactor.name = ТориеВый реактор block.mass-driver.name = Электромагнитная катапульта block.blast-drill.name = Воздушная буровая установка block.thermal-pump.name = Термальный насос @@ -827,7 +826,7 @@ block.force-projector.name = Силовой проектор block.arc.name = Дуга block.rtg-generator.name = Радиоизотопный термоэлектрический генератор block.spectre.name = Призрак -block.meltdown.name = Катастрофа +block.meltdown.name = Плазмотрон block.container.name = Склад block.launch-pad.name = Стартовая площадка block.launch-pad-large.name = Большая стартовая площадка @@ -856,47 +855,47 @@ 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.drill.mobile = Ручная добыча не является эффективной.\n[accent]Буры []могут добывать автоматически.\nНажмите на вкладку с изображением сверла снизу справа.\nВыберите[accent] механический бур[]. \nРазместите его на медной жиле нажатием, затемм нажмите [accent] белую галку[] ниже, чтобы подтвердить построение выделенного.\nНажмите [accent] кнопку X[], чтобы отменить размещение. -tutorial.blockinfo = Каждый блок имеет разные характеричстики.\nЧтобы узнать информацию о блоке и о его характеристиках,[accent] нажмите на «?», когда он выбран в меню строительства.[]\n\n[accent]Сейчас, узнайте характеристики механического бура.[] +tutorial.drill.mobile = Ручная добыча не является эффективной.\n[accent]Буры []могут добывать автоматически.\nНажмите на вкладку с изображением сверла снизу справа.\nВыберите[accent] механический бур[]. \nРазместите его на медной жиле нажатием, затемм нажмите [accent] белую галку[] ниже, чтобы подтвердить построение Выделенного.\nНажмите [accent] кнопку X[], чтобы отменить размещение. +tutorial.blockinfo = Каждый блок имеет разные характеристики.\nЧтобы узнать информацию о блоке и о его характеристиках,[accent] нажмите на «?», когда он Выбран в меню строительства.[]\n\n[accent]Сейчас, узнайте характеристики механического бура.[] tutorial.conveyor = [accent]Конвейера[] используются для транспортировки ресуров в ядро.\nСделайте линию конвейеров от бура к ядру\n[accent]Удерживайте левую кнопку мыши, чтобы разместить конвейерную линию.[]\nУдерживайте[accent] CTRL[] при постройке линии блоков, чтобы сделать её диагональной\n\n[accent]{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.mobile = Во время битвы, Вы можете[accent] приостановить игру.[]\nВы можеть планировать строительство, когда игра стоит на паузе.\n\n[accent]Нажмите кнопку сверху слева, чтобы поставить игру на паузу. +tutorial.pause = Во время битВы Вы можете[accent] приостановить игру.[]\nВы можете планировать строительство, когда игра стоит на паузе.\n\n[accent]Нажмите ПРОБЕЛ для приостановки игры. +tutorial.pause.mobile = Во время битВы, Вы можете[accent] приостановить игру.[]\nВы можеть планировать строительство, когда игра стоит на паузе.\n\n[accent]Нажмите кнопку сверху слева, чтобы поставить игру на паузу. tutorial.unpause = Теперь нажмите пробел снова для снятия паузы. tutorial.unpause.mobile = Теперь нажмите снова туда для снятия паузы. -tutorial.breaking = Часто блоки нужно разрушать\n[accent]Зажмите ПКМ[], чтобы разрушить блоки в выбранной зоне.[]\n\n[accent]Разрушьте все стены из металлолома слева от вашего ядра. -tutorial.breaking.mobile = Часто блоки нужно разрушить.\n[accent]Выберите режим деконструкции[], после чего нажмите на нужный блок, чтобы его разрушить.\nРазрушьте блоки в выбранной зоне, зажав палец на несколько секунд[], и проводя его в нужном направлении.\nНажмите на галочку, чтобы подтвердить разрушение.\n\n[accent]Разрушьте все стены из металлолома слева от вашего ядра. +tutorial.breaking = Часто блоки нужно разрушать\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.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.lead.description = Основной стартоВый материал. Широко используется в электронике и блоках для транспортировки жидкостей. item.metaglass.description = Сверхпрочный сплав стекла. Широко используется для распределения и хранения жидкости. item.graphite.description = Минерализованный углерод, используемый для боеприпасов и электроизоляции. -item.sand.description = Обычный материал, который широко используется при выплавке, как при легировании, так и в качестве отходов. +item.sand.description = Обычный материал, который широко используется при Выплавке, как при легировании, так и в качестве отходов. item.coal.description = Окаменелое растительное вещество, образовавшееся задолго до посева. Широко используется для производства топлива и ресурсов. item.titanium.description = Редкий сверхлёгкий металл, широко используемый для транспортировки жидкостей, буров и авиации. item.thorium.description = Плотный радиоактивный металл, используемый в качестве структурной опоры и ядерного топлива. item.scrap.description = Остатки старых сооружений и подразделений. Содержит небольшие количества многих различных металлов. -item.silicon.description = Чрезвычайно полезный полупроводник. Применяется в солнечных панелях, сложной электронике и самонаводящихся боеприпасах. +item.silicon.description = ЧрезВычайно полезный полупроводник. Применяется в солнечных панелях, сложной электронике и самонаводящихся боеприпасах. item.plastanium.description = Лёгкий, пластичный материал, используемый в современных авиационных и осколочных боеприпасах. item.phase-fabric.description = Практически невесомое вещество, используемое в передовой электронике и технологиях самовосстановления. item.surge-alloy.description = Современный сплав с уникальными электрическими свойствами. item.spore-pod.description = Стручок синтетических спор, синтезированных из атмосферных концентраций для промышленных целей. Используется для превращения в нефть, взрывчатые вещества и топливо. item.blast-compound.description = Нестабильный соединение, используемый в бомбах и взрывчатых веществах. Синтезируется из стручков спор и других летучих веществ. Использовать в качестве топлива не рекомендуется. -item.pyratite.description = Чрезвычайно огнеопасное вещество, используемое в зажигательном оружии. +item.pyratite.description = ЧрезВычайно огнеопасное вещество, используемое в зажигательном оружии. liquid.water.description = Самая полезная жидкость. Обычно используется для охлаждения машин и переработки отходов. -liquid.slag.description = Всевозможно различные типы расплавленного металла, смешанные вместе. Может быть разделен на составляющие его минералы или распылён на вражеских боевые единицы в качестве оружия. +liquid.slag.description = Всевозможно различные типы расплавленного металла, смешанные вместе. Может быть разделен на составляющие его минералы или распылён на вражеских боеВые единицы в качестве оружия. liquid.oil.description = Жидкость, используемая в производстве современных материалов. Может быть превращена в уголь в качестве топлива или распылён и подожжён как оружие. -liquid.cryofluid.description = Инертная, неедкая жидкость, созданная из воды и титана. Обладает чрезвычайно высокой пропускной способностью. Широко используется в качестве охлаждающей жидкости. +liquid.cryofluid.description = Инертная, неедкая жидкость, созданная из воды и титана. Обладает чрезВычайно Высокой пропускной способностью. Широко используется в качестве охлаждающей жидкости. mech.alpha-mech.description = Стандартный управляемый мех. Основан на «Кинжале», с улучшенной броней и строительными возможностями. Имеет больший урон, чем «Дротик». -mech.delta-mech.description = Быстрый, легко бронированный мех, созданный для ударов «атакуй и беги». Наносит мало урона по строениям, но может очень быстро убить большие группы вражеских орудий с помощью дуговых молний. +mech.delta-mech.description = Быстрый, легко бронированный мех, созданный для ударов «атакуй и беги». Наносит мало урона по строениям, но может очень быстро убить большие группы вражеских орудий с помощью дугоВых молний. mech.tau-mech.description = Мех поддержки. Ремонтирует союзные блоки просто стреляя в них. Может лечить союзников в радиусе его ремонтирующей способности. -mech.omega-mech.description = Громоздкий и хорошо бронированный мех, созданный для передовых атак. Его броня может блокировать до 90% входящего урона. +mech.omega-mech.description = Громоздкий и хорошо бронированный мех, созданный для передоВых атак. Его броня может блокировать до 90% входящего урона. mech.dart-ship.description = Стандартный управляемый корабль. Достаточно быстрый и легкий, но мало атакующий и обладает низкой скоростью добычи. mech.javelin-ship.description = Корабль для тактики «атакуй и беги». Сначала он медленный, но позже может разгоняться до огромных скоростей и летать над аванпостами противника, нанося большой урон молниями и ракетами. mech.trident-ship.description = Тяжёлый бомбардировщик, построенный для строительства и уничтожения вражеских укреплений. Достаточно хорошо бронированный. @@ -904,12 +903,12 @@ mech.glaive-ship.description = Большой хорошо бронирован unit.draug.description = Примитивный добывающий дрон. Дёшево производить. Расходуемый. Автоматически добывает медь и свинец в непосредственной близости. Поставляет добытые ресурсы в ближайшее ядро. unit.spirit.description = Модифицированный «Драугр», предназначенный для ремонта вместо добычи ресурсов. Автоматически ремонтирует любые поврежденные блоки в области. unit.phantom.description = Продвинутый дрон. Следует за пользователями. Помогает в строительстве блоков. -unit.dagger.description = Самый основной наземный мех. Дешёвый в производстве. Очень сильный при использовании толпами. -unit.crawler.description = Наземный блок, состоящий из урезанной рамы с высоким взрывчатым веществом, прикрепленным сверху. Не особо прочный. Взрывается при контакте с врагами. +unit.dagger.description = Самый основной наземный мех. ДешёВый в производстве. Очень сильный при использовании толпами. +unit.crawler.description = Наземный блок, состоящий из урезанной рамы с Высоким взрывчатым веществом, прикрепленным сверху. Не особо прочный. Взрывается при контакте с врагами. unit.titan.description = Продвинутый, бронированный наземный юнит. Атакует как наземные, так и воздушные цели. Оборудован двумя миниатюрными огнеметами класса «Обжигатель». unit.fortress.description = Тяжёлый артиллерийский мех. Оснащен двумя модифицированными пушками типа «Град» для штурма дальних объектов и подразделений противника. unit.eruptor.description = Тяжёлый мех, предназначенный для разрушения строений. Выстреливает поток шлака по вражеским укреплениям, плавит их и поджигает летучие вещества. -unit.wraith.description = Быстрый перехватчик. Целевые генераторы энергии. +unit.wraith.description = Быстрый перехватчик. ЦелеВые генераторы энергии. unit.ghoul.description = Тяжёлый ковровой бомбардировщик. Проникает через вражеские структуры, нацеливаясь на критическую инфраструктуру. unit.revenant.description = Тяжёлый, парящий массив, который вооружён ракетами. block.graphite-press.description = Сжимает куски угля в чистые листы графита. @@ -919,7 +918,7 @@ block.kiln.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 = Расплавляет металлолом в шлак для дальнейшей обработки или использования в башнях «Волна». @@ -929,47 +928,47 @@ block.pulverizer.description = Измельчает металлолом в ме block.coal-centrifuge.description = Нефть превращается в куски угля. block.incinerator.description = Выпаривает любой лишний предмет или жидкость, которую он получает. block.power-void.description = Аннулирует всю энергию, введенную в него. Только песочница. -block.power-source.description = Бесконечно выводит энергию. Только песочница. -block.item-source.description = Бесконечно выводит элементы. Только песочница. +block.power-source.description = Бесконечно Выводит энергию. Только песочница. +block.item-source.description = Бесконечно Выводит элементы. Только песочница. block.item-void.description = Уничтожает любые предметы. Только песочница. -block.liquid-source.description = Бесконечно выводит жидкости. Только песочница. -block.copper-wall.description = Дешёвый защитный блок.\nПолезно для защиты ядра и турелей в первые несколько волн. -block.copper-wall-large.description = Дешёвый защитный блок.\nПолезно для защиты ядра и турелей в первые несколько волн.\nРазмещается на нескольких плиток. +block.liquid-source.description = Бесконечно Выводит жидкости. Только песочница. +block.copper-wall.description = ДешёВый защитный блок.\nПолезно для защиты ядра и турелей в перВые несколько волн. +block.copper-wall-large.description = ДешёВый защитный блок.\nПолезно для защиты ядра и турелей в перВые несколько волн.\nРазмещается на нескольких плитках. block.titanium-wall.description = Умеренно сильный защитный блок.\nОбеспечивает умеренную защиту от врагов. -block.titanium-wall-large.description = Умеренно сильный защитный блок.\nОбеспечивает умеренную защиту от врагов.\nРазмещается на нескольких плиток. +block.titanium-wall-large.description = Умеренно сильный защитный блок.\nОбеспечивает умеренную защиту от врагов.\nРазмещается на нескольких плитках. block.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.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-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.conveyor.description = БазоВый элемент транспортного блока. Перемещает предметы вперед и автоматически складывает их в блоки. Вращающийся. block.titanium-conveyor.description = Расширенный транспортный блок элемента. Перемещает предметы быстрее, чем стандартные конвейеры. block.junction.description = Действует как мост для двух пересекающихся конвейерных лент. Полезно в ситуациях, когда два разных конвейера перевозят разные материалы в разные места. -block.bridge-transpor.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.router.description = Принимает элементы в одном направлении и Выводит их до 3 других направлений в равной степени. Полезно для разделения материалов из одного источника на несколько целей.\n\n[scarlet]Никогда не используйте рядом с заводами и т.п., так как маршрутизатор будет забит Выходными предметами.[] block.distributor.description = Расширенный маршрутизатор. Разделение элементов до 7 других направлений в равной степени. block.overflow-gate.description = Комбинированный разделитель и маршрутизатор. Выводится только влево и вправо, если передний путь заблокирован. block.mass-driver.description = Конечный транспортный блок элемента. Собирает несколько предметов и затем стреляет в них другому массовому водителю на большом расстоянии. Требуется сила для работы. -block.mechanical-pump.description = Дешёвый насос с низкой производительностью, но без энергопотребления. +block.mechanical-pump.description = ДешёВый насос с низкой производительностью, но без энергопотребления. block.rotary-pump.description = Продвинутый насос. Насосы более жидкие, но требуют энергию. block.thermal-pump.description = Наилучший насос. block.conduit.description = Основной блок транспортировки жидкости. Перемещает жидкости вперед. Используется совместно с насосами и другими трубопроводами. block.pulse-conduit.description = Расширенный блок транспортировки жидкости. Транспортирует жидкости быстрее и хранит больше, чем стандартные трубопроводы. -block.liquid-router.description = Принимает жидкости из одного направления и выводит их до 3 других направлений в равной степени. Можно также хранить определенное количество жидкости. Полезно для разделения жидкостей из одного источника на несколько целей. +block.liquid-router.description = Принимает жидкости из одного направления и Выводит их до 3 других направлений в равной степени. Можно также хранить определенное количество жидкости. Полезно для разделения жидкостей из одного источника на несколько целей. block.liquid-tank.description = Хранит большое количество жидкости. Используется для создания буферов в ситуациях с непостоянной потребностью в материалах или в качестве защиты для охлаждения жизненно важных блоков. block.liquid-junction.description = Действует как мост для двух пересекающихся каналов. Полезно в ситуациях, когда два разных трубопровода переносят разные жидкости в разные места. block.bridge-conduit.description = Расширенный блок транспортировки жидкости. Позволяет транспортировать жидкости до 3 плиток любой местности или здания. -block.phase-conduit.description = Расширенный блок транспортировки жидкости. Использует энергию для телепортации жидкостей в подключенный фазовый канал по нескольким плиткам. +block.phase-conduit.description = Расширенный блок транспортировки жидкости. Использует энергию для телепортации жидкостей в подключенный фазоВый канал по нескольким плиткам. block.power-node.description = Передает питание на подключенные узлы. Узел будет получать питание или поставлять питание на любые соседние блоки. block.power-node-large.description = Усовершенствованный силовой узел с большей дальностью и большим количеством соединений. block.surge-tower.description = Очень дальний узел питания с меньшим количеством доступных соединений. @@ -977,30 +976,30 @@ 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.impact-reactor.description = Усовершенствованный генератор, способный создавать огромное количество энергии с максимальной эффективностью. Требуется значительное количество энергии для запуска процесса. -block.mechanical-drill.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.cultivator.description = Выращивает крошечные концентрации спор в атмосфере в готоВые к употреблению споры. block.oil-extractor.description = Использует большое количество энергии, песка и воды для бурения на нефть. block.core-shard.description = Первая итерация капсулы ядра. После уничтожения весь контакт с регионом теряется. Не позволяйте этому случиться. block.core-foundation.description = Вторая версия ядра. Лучше бронированное. Хранит больше ресурсов. block.core-nucleus.description = Третья и последняя итерация капсулы ядра. Очень хорошо бронированный. Хранит огромное количество ресурсов. block.vault.description = Хранит большое количество предметов каждого типа. Блок разгрузчика может быть использован для извлечения предметов из хранилища. block.container.description = Хранит небольшое количество предметов каждого типа. Блок разгрузчика может быть использован для извлечения элементов из контейнера. -block.unloader.description = Выгружает предметы из контейнера, хранилища или ядра на конвейер или непосредственно в соседний блок. Тип элемента, который необходимо выгрузить, можно изменить, коснувшись. +block.unloader.description = Выгружает предметы из контейнера, хранилища или ядра на конвейер или непосредственно в соседний блок. Тип элемента, который необходимо Выгрузить, можно изменить, коснувшись. block.launch-pad.description = Запускает партии предметов без необходимости запуска ядра. block.launch-pad-large.description = Улучшенная версия стартовой площадки. Хранит больше предметов. Запускается чаще. block.duo.description = Маленькая, дешёвая башня. Полезна против наземных юнитов. -block.scatter.description = Важная противовоздушная башня. Распыляет комки свинца или металлолома вражеских подразделений. +block.scatter.description = Важная противовоздушная башня. Распыляет комки свинца или металлолома на вражеские подразделения. block.scorch.description = Сжигает любых наземных врагов рядом с ним. Высокоэффективен на близком расстоянии. block.hail.description = Маленькая дальнобойная артиллерийская башня. block.wave.description = Башня среднего размера. Стреляет потоками жидкости по врагам. Автоматически тушит пожары при подаче воды. @@ -1016,15 +1015,15 @@ block.meltdown.description = Массивная лазерная пушка. З block.draug-factory.description = Производит добывающих дронов. block.spirit-factory.description = Производит дронов, которые помогают в строительстве. block.phantom-factory.description = Производит улучшенных дронов, которые помогают в строительстве. -block.wraith-factory.description = Производит быстрые и летающие боевые единицы. -block.ghoul-factory.description = Производит тяжёлых ковровых бомбардировщиков. -block.revenant-factory.description = Производит тяжёлые летающие боевые единицы. -block.dagger-factory.description = Производит основных наземных боевых единиц. -block.crawler-factory.description = Производит быстрых саморозрушающихся боевых единиц. -block.titan-factory.description = Производит продвинутые бронированне боевые единицы. -block.fortress-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.fortress-factory.description = Производит тяжёлые артиллерийские боеВые единицы. block.repair-point.description = Непрерывно лечит ближайший поврежденную боевую единицу или мех, находящийся рядом. -block.dart-mech-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Используйте, нажав, стоя на нём. diff --git a/core/assets/bundles/bundle_se.properties b/core/assets/bundles/bundle_se.properties index 9f9e81a8e2..2d6984585f 100644 --- a/core/assets/bundles/bundle_se.properties +++ b/core/assets/bundles/bundle_se.properties @@ -16,7 +16,6 @@ screenshot.invalid = Map too large, potentially not enough memory for screenshot gameover = Game Over gameover.pvp = The[accent] {0}[] team is victorious! highscore = [accent]Nytt rekord! - stat.wave = Waves Defeated:[accent] {0} stat.enemiesDestroyed = Enemies Destroyed:[accent] {0} stat.built = Buildings Built:[accent] {0} @@ -24,10 +23,8 @@ stat.destroyed = Buildings Destroyed:[accent] {0} stat.deconstructed = Buildings Deconstructed:[accent] {0} stat.delivered = Resources Launched: stat.rank = Final Rank: [accent]{0} - placeline = Du har valt ett block.\nDu kan[accent] placera i en linje[] genom att[accent] hålla ner ett finger i några sekunder[] och sedan dra åt ett håll.\n\n[scarlet]GÖR DET. removearea = Du har valt borttagningsläget.\nDu kan[accent] ta bort block inom en rektangel[] genom att[accent] hålla ner ett finger i några sekunder[] och dra.\n\n[scarlet]GÖR DET. - launcheditems = [accent]Launched Items map.delete = Are you sure you want to delete the map "[accent]{0}[]"? level.highscore = High Score: [accent]{0} @@ -40,11 +37,13 @@ database = Core Database savegame = Spara Spel loadgame = Importera Spel joingame = Join Game +addplayers = Add/Remove Players customgame = Anpassat Spel newgame = Nytt Spel none = minimap = Minikarta close = Stäng +website = Website quit = Avsulta maps = Kartor continue = Fortsätt @@ -73,6 +72,7 @@ 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.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}[] host.info = The [accent]host[] button hosts a server on port [scarlet]6567[]. \nAnybody on the same [lightgray]wifi or local network[] should be able to see your server in their server list.\n\nIf you want people to be able to connect from anywhere by IP, [accent]port forwarding[] is required.\n\n[lightgray]Note: If someone is experiencing trouble connecting to your LAN game, make sure you have allowed Mindustry access to your local network in your firewall settings. Note that public networks sometimes do not allow server discovery. join.info = Here, you can enter a [accent]server IP[] to connect to, or discover [accent]local network[] servers to connect to.\nBoth LAN and WAN multiplayer is supported.\n\n[lightgray]Note: There is no automatic global server list; if you want to connect to someone by IP, you would need to ask the host for their IP. hostserver = Host Multiplayer Game @@ -250,7 +250,6 @@ editor.mapname = Kartnamn: editor.overwrite = [accent]Warning!\nThis overwrites an existing map. editor.overwrite.confirm = [scarlet]Warning![] A map with this name already exists. Are you sure you want to overwrite it? editor.selectmap = Select a map to load: - toolmode.replace = Byt ut toolmode.replace.description = Draws only on solid blocks. toolmode.replaceall = Byt ut alla @@ -265,7 +264,6 @@ toolmode.fillteams = Fyll Lag toolmode.fillteams.description = Fill teams instead of blocks. toolmode.drawteams = Rita Lag toolmode.drawteams.description = Draw teams instead of blocks. - filters.empty = [lightgray]No filters! Add one with the button below. filter.distort = Distort filter.noise = Brus @@ -297,7 +295,6 @@ filter.option.floor2 = Secondary Floor filter.option.threshold2 = Secondary Threshold filter.option.radius = Radie filter.option.percentile = Percentile - width = Bredd: height = Höjd: menu = Meny @@ -315,7 +312,6 @@ 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 @@ -341,7 +337,6 @@ zone.objective.survival = Survive zone.objective.attack = Destroy Enemy Core add = Lägg till... boss.health = Boss Health - connectfail = [crimson]Connection error:\n\n[accent]{0} error.unreachable = Server unreachable.\nIs the address spelled correctly? error.invalidaddress = Ogiltig adress. @@ -352,7 +347,6 @@ error.mapnotfound = Map file not found! error.io = Network I/O error. error.any = Okänt nätverksfel. 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 = Kratrar @@ -367,7 +361,6 @@ 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. @@ -382,7 +375,6 @@ zone.nuclearComplex.description = A former facility for the production and proce zone.fungalPass.description = A transition area between high mountains and lower, spore-ridden lands. A small enemy reconnaissance base is located here.\nDestroy it.\nUse Dagger and Crawler units. Take out the two cores. zone.impact0078.description = zone.crags.description = - settings.language = Språk settings.reset = Återställ till Standardvärden settings.rebind = Byt @@ -435,7 +427,6 @@ blocks.inaccuracy = Inaccuracy blocks.shots = Skott blocks.reload = Shots/Second blocks.ammo = Ammunition - bar.drilltierreq = Bättre Borr Krävs bar.drillspeed = Drill Speed: {0}/s bar.efficiency = Effektivitet: {0}% @@ -448,7 +439,6 @@ bar.heat = Hetta bar.power = Power bar.progress = Build Progress bar.spawned = Units: {0}/{1} - bullet.damage = [stat]{0}[lightgray] skada bullet.splashdamage = [stat]{0}[lightgray] area dmg ~[stat] {1}[lightgray] tiles bullet.incendiary = [stat]incendiary @@ -460,7 +450,6 @@ bullet.freezing = [stat]freezing bullet.tarred = [stat]tarred bullet.multiplier = [stat]{0}[lightgray]x ammo multiplier bullet.reload = [stat]{0}[lightgray]x fire rate - unit.blocks = block unit.powersecond = power units/second unit.liquidsecond = liquid units/second @@ -513,6 +502,7 @@ setting.lasers.name = Show Power Lasers setting.pixelate.name = Pixellera[lightgray] (disables animations) setting.minimap.name = Visa Minikarta setting.musicvol.name = Musikvolym +setting.ambientvol.name = Ambient Volume setting.mutemusic.name = Stäng Av Musik setting.sfxvol.name = Ljudeffektvolym setting.mutesound.name = Stäng Av Ljudeffekter @@ -918,13 +908,9 @@ unit.crawler.description = A ground unit consisting of a stripped-down frame wit 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.chaos-array.description = -unit.eradicator.description = 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.revenant.description = A heavy, hovering missile array. -unit.lich.description = -unit.reaper.description = block.graphite-press.description = Compresses chunks of coal into pure sheets of graphite. block.multi-press.description = An upgraded version of the graphite press. Employs water and power to process coal quickly and efficiently. block.silicon-smelter.description = Reduces sand with pure coal. Produces silicon. @@ -1043,4 +1029,4 @@ block.tau-mech-pad.description = Provides transformation into an advanced suppor block.omega-mech-pad.description = Provides transformation into a heavily-armored missile mech.\nUse by tapping while standing on it. block.javelin-ship-pad.description = Provides transformation into a quick, lightly-armored interceptor.\nUse by tapping while standing on it. block.trident-ship-pad.description = Provides transformation into a heavy support bomber.\nUse by tapping while standing on it. -block.glaive-ship-pad.description = Provides transformation into a large, well-armored gunship.\nUse by tapping while standing on it. \ No newline at end of file +block.glaive-ship-pad.description = Provides transformation into a large, well-armored gunship.\nUse by tapping while standing on it. diff --git a/core/assets/bundles/bundle_tk.properties b/core/assets/bundles/bundle_tk.properties index 11fbefa9aa..1b7b93265a 100644 --- a/core/assets/bundles/bundle_tk.properties +++ b/core/assets/bundles/bundle_tk.properties @@ -43,6 +43,7 @@ newgame = New Game none = minimap = Minimap close = Kapat +website = Website quit = Cik maps = Haritalar continue = Devam et @@ -71,6 +72,7 @@ server.kicked.nameEmpty = ismin gecerli degil. server.kicked.idInUse = Zaten oyundasin! iki ayri hesapla oyuna katilamazsin! server.kicked.customClient = Bu oyun ayarlanmis vesiyonlara izin vermiyor. Orijinal bir versiyon dene! server.kicked.gameover = Game over! +server.versions = Your version:[accent] {0}[]\nServer version:[accent] {1}[] host.info = [accent]host[] su linkte bir oyun acti! [scarlet]6567[]. \nSeninle [LIGHT_GRAY]ayni internete[] sahip olan kisiler oyunu gorebilir.\n\neger baska yerlerden kisilerind de gelmesini istiyorsan, [accent]oyun acmak[]zorunludur.\n\n[LIGHT_GRAY]Not: eger baglanmakta gucluk cekiliyorsa, antivirusunun internetine baglanmasini izin vermesini sagla. join.info = Buradan,[accent]Oyunun linkini[] kullanarak katilabilir, yada, [accent]internetinle[] baglanacak oyun bulabilirsin\ninternetli ve Linkli oyunlar desteklenir.\n\n[LIGHT_GRAY]Not: Otomatik bir oyun listesi goruntulenemez. Yapimcidan linkini iste. hostserver = Oyun ac @@ -154,7 +156,10 @@ cancel = iptal openlink = Linki ac copylink = Linki kopyala back = Geri don +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 = 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... saving = [accent]Kaydediliyor... wave = [accent]Dalga {0} @@ -263,6 +268,7 @@ 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 @@ -302,6 +308,7 @@ ping = Ping: {0}ms language.restart = Lutfen dil degisiminin etkin olmasi icin oyunu yeniden baslatin settings = ayarlar tutorial = Tutorial +tutorial.retake = Re-Take Tutorial editor = Editor mapeditor = Harita yaraticisi donate = Bagis yap @@ -315,8 +322,9 @@ bestwave = [LIGHT_GRAY]Best: {0} launch = Launch launch.title = Launch Successful launch.next = [LIGHT_GRAY]next opportunity at wave {0} -launch.unable = [scarlet]Unable to LAUNCH.[] Enemies. +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. @@ -352,6 +360,7 @@ 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. @@ -363,6 +372,7 @@ zone.overgrowth.description = This area is overgrown, closer to the source of th zone.tarFields.description = The outskirts of an oil production zone, between the mountains and desert. One of the few areas with usable tar reserves.\nAlthough abandoned, this area has some dangerous enemy forces nearby. Do not underestimate them.\n\n[lightgray]Research oil processing technology if possible. zone.desolateRift.description = An extremely dangerous zone. Plentiful resources, but little space. High risk of destruction. Leave as soon as possible. Do not be fooled by the long spacing between enemy attacks. zone.nuclearComplex.description = A former facility for the production and processing of thorium, reduced to ruins.\n[lightgray]Research the thorium and its many uses.\n\nThe enemy is present here in great numbers, constantly scouting for attackers. +zone.fungalPass.description = A transition area between high mountains and lower, spore-ridden lands. A small enemy reconnaissance base is located here.\nDestroy it.\nUse Dagger and Crawler units. Take out the two cores. zone.impact0078.description = zone.crags.description = settings.language = Dil @@ -417,6 +427,7 @@ blocks.inaccuracy = sekme blocks.shots = vuruslar blocks.reload = Yeniden doldurma blocks.ammo = Ammo +bar.drilltierreq = Better Drill Required bar.drillspeed = Drill Speed: {0}/s bar.efficiency = Efficiency: {0}% bar.powerbalance = Power: {0} @@ -491,6 +502,7 @@ setting.lasers.name = Guc lazerlerini goster setting.pixelate.name = Pixelate [LIGHT_GRAY](may decrease performance) setting.minimap.name = Haritayi goster setting.musicvol.name = Ses yuksekligi +setting.ambientvol.name = Ambient Volume setting.mutemusic.name = Sesi kapat setting.sfxvol.name = Ses seviyesi setting.mutesound.name = Sesi kapat @@ -819,9 +831,10 @@ block.container.name = Container block.launch-pad.name = Launch Pad block.launch-pad-large.name = Large Launch Pad team.blue.name = blue -team.red.name = red +team.crux.name = red +team.sharded.name = orange team.orange.name = orange -team.none.name = gray +team.derelict.name = derelict team.green.name = green team.purple.name = purple unit.spirit.name = Spirit Drone @@ -839,27 +852,26 @@ unit.chaos-array.name = Chaos Array unit.eradicator.name = Eradicator unit.lich.name = Lich unit.reaper.name = Reaper -tutorial.begin = Your mission here is to eradicate the[LIGHT_GRAY] enemy[].\n\nBegin by[accent] mining copper[]. Tap a copper ore vein near your core to do this. +tutorial.next = [lightgray] +tutorial.intro = You have entered the[scarlet] Mindustry Tutorial.[]\nBegin by[accent] mining copper[]. Tap a copper ore vein near your core to do this.\n\n[accent]{0}/{1} copper tutorial.drill = Mining manually is inefficient.\n[accent]Drills []can mine automatically.\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.[] tutorial.conveyor = [accent]Conveyors[] are used to transport items to the core.\nMake a line of conveyors from the drill to the core. -tutorial.morecopper = More copper is required.\n\nEither mine it manually, or place more drills. +tutorial.conveyor.mobile = [accent]Conveyors[] are used to transport items to the core.\nMake a line of conveyors from the drill to the core.\n[accent] Place in a line by holding down your finger for a few seconds[] and dragging in a direction.\n\n[accent]{0}/{1} conveyors placed in line\n[accent]0/1 items delivered tutorial.turret = Defensive structures must be built to repel the[LIGHT_GRAY] enemy[].\nBuild a duo turret near your base. tutorial.drillturret = Duo turrets require[accent] copper ammo []to shoot.\nPlace a drill next to the turret to supply it with mined copper. +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[LIGHT_GRAY] enemy[] approaches.\n\nDefend your core for 2 waves. Build more turrets. -tutorial.lead = More ores are available. Explore and mine[accent] lead[].\n\nDrag from your unit to the core to transfer resources. -tutorial.smelter = Copper and lead are weak metals.\nSuperior[accent] Dense Alloy[] can be created in a smelter.\n\nBuild one. -tutorial.densealloy = The smelter will now produce alloy.\nGet some.\nImprove the production if necessary. -tutorial.siliconsmelter = The core will now create a[accent] spirit drone[] for mining and repairing blocks.\n\nFactories for other units can be created with [accent] silicon.\nMake a silicon smelter. -tutorial.silicondrill = Silicon requires[accent] coal[] and[accent] sand[].\nStart by making drills. -tutorial.generator = This technology requires power.\nCreate a[accent] combustion generator[] for it. -tutorial.generatordrill = Combustion generators need fuel.\nFuel it with coal from a drill. -tutorial.node = Power requires transport.\nCreate a[accent] power node[] next to your combustion generator to transfer its power. -tutorial.nodelink = Power can be transferred through contacting power blocks and generators, or by linked power nodes.\n\nLink power by tapping the node and selecting the generator and silicon smelter. -tutorial.silicon = Silicon is being produced. Get some.\n\nImproving the production system is advised. -tutorial.daggerfactory = Construct a[accent] dagger mech factory.[]\n\nThis will be used to create attack mechs. -tutorial.router = Factories need resources to function.\nCreate a router to split conveyor resources. -tutorial.dagger = Link power nodes to the factory.\nOnce requirements are met, a mech will be created.\n\nCreate more drills, generators and conveyors as necessary. -tutorial.battle = The[LIGHT_GRAY] enemy[] has revealed their core.\nDestroy it with your unit and dagger mechs. +tutorial.waves.mobile = The[lightgray] enemy[] approaches.\n\nDefend the core for 2 waves. Your ship will automatically fire at enemies.\nBuild more turrets and drills. Mine more copper. +tutorial.launch = Once you reach a specific wave, you are able to[accent] launch the core[], leaving your defenses behind and[accent] obtaining all the resources in your core.[]\nThese resources can then be used to research new technology.\n\n[accent]Press the launch button. item.copper.description = ise yayar bir materyal. Kazma makineleriyle yada tasimayla alinabilir. item.lead.description = Basit bir baslangic materyali. sivi tasimada kullanilabilir. item.metaglass.description = A super-tough glass compound. Extensively used for liquid distribution and storage. @@ -896,13 +908,9 @@ unit.crawler.description = A ground unit consisting of a stripped-down frame wit unit.titan.description = havaya sikabilen, gelismis bir unit unit.fortress.description = A heavy artillery ground unit. 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.chaos-array.description = -unit.eradicator.description = unit.wraith.description = A fast, hit-and-run interceptor unit. unit.ghoul.description = A heavy carpet bomber. Uses blast compound or pyratite as ammo. unit.revenant.description = A heavy, hovering missile array. -unit.lich.description = -unit.reaper.description = block.graphite-press.description = Compresses chunks of coal into pure sheets of graphite. block.multi-press.description = An upgraded version of the graphite press. Employs water and power to process coal quickly and efficiently. block.silicon-smelter.description = Reduces sand with highly pure coke in order to produce silicon. diff --git a/core/assets/bundles/bundle_tr.properties b/core/assets/bundles/bundle_tr.properties index dce426ac8b..9fe58d1b1b 100644 --- a/core/assets/bundles/bundle_tr.properties +++ b/core/assets/bundles/bundle_tr.properties @@ -1,21 +1,22 @@ -credits.text = Created by [ROYAL]Anuken[] - [SKY]anukendev@gmail.com[]\n\n[GRAY](In case you can't tell, this text is currently unfinished.\nTranslators, don't edit it yet!) -credits = Yapımcılar +credits.text = Created by [ROYAL]Anuken[] - [SKY]anukendev@gmail.com[] +credits = Credits contributors = Translators and Contributors -discord = Mindustry Discord'una katılın! -link.discord.description = Resmi Mindustry Discord iletişim kanalı -link.github.description = Oyunun kaynak kodu +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 -link.dev-builds.description = Geliştirme altında olan sürüm -link.trello.description = Planlanan özellikler için resmi Trello Bülteni -link.itch.io.description = PC yüklemeleri ve web sürümü ile itch.io sayfası -link.google-play.description = Google Play mağaza sayfası -link.wiki.description = Resmi Mindustry Wikipedi'si -linkfail = Bağlantı açılamadı! URL, yazı tahtanıza kopyalandı. +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. -gameover = Çekirdek yok edildi. -gameover.pvp = [accent] {0}[] takimi kazandi ! -highscore = [SARI] Yeni yüksek puan! +gameover = Game Over +gameover.pvp = The[accent] {0}[] team is victorious! +highscore = [accent]New highscore! + stat.wave = Waves Defeated:[accent] {0} stat.enemiesDestroyed = Enemies Destroyed:[accent] {0} stat.built = Buildings Built:[accent] {0} @@ -23,156 +24,163 @@ stat.destroyed = Buildings Destroyed:[accent] {0} stat.deconstructed = Buildings Deconstructed:[accent] {0} stat.delivered = Resources Launched: stat.rank = Final Rank: [accent]{0} -placeline = You have selected a block.\nYou can[accent] place in a line[] by[accent] holding down your finger for a few seconds[] and dragging in a direction.\nTry it. -removearea = You have selected removal mode.\nYou can[accent] remove blocks in a rectangle[] by[accent] holding down your finger for a few seconds[] and dragging.\nTry it. + +placeline = You have selected a block.\nYou can[accent] place in a line[] by[accent] holding down your finger for a few seconds[] and dragging in a direction.\n\n[scarlet]DO IT. +removearea = You have selected removal mode.\nYou can[accent] remove blocks in a rectangle[] by[accent] holding down your finger for a few seconds[] and dragging.\n\n[scarlet]DO IT. + launcheditems = [accent]Launched Items -map.delete = Su haritayi silmek istedigine emin misin? "[orange]{0}[]"? -level.highscore = Yüksek Puan: [accent] {0} -level.select = Seviye Seç -level.mode = Oyun Modu -showagain = Bunu gene gosterme -coreattack = < Cekirdek saldiri altinda! > +map.delete = Are you sure you want to delete the map "[accent]{0}[]"? +level.highscore = High Score: [accent]{0} +level.select = Level Select +level.mode = Gamemode: +showagain = Don't show again next session +coreattack = < Core is under attack! > nearpoint = [[ [scarlet]LEAVE DROP POINT IMMEDIATELY[] ]\nannihilation imminent database = Core Database -savegame = Oyunu Kaydet -loadgame = Oyunu yükle -joingame = Oyuna katıl -addplayers = Oyuncu ekle/cikar -customgame = Ozel oyun +savegame = Save Game +loadgame = Load Game +joingame = Join Game +addplayers = Add/Remove Players +customgame = Custom Game newgame = New Game none = minimap = Minimap -close = Kapat -quit = Çık -maps = Haritalar -continue = Devam et -maps.none = [LIGHT_GRAY]Harita bulunamadi! -about.button = Hakkında -name = Adı: +close = Close +website = Website +quit = Quit +maps = Maps +continue = Continue +maps.none = [lightgray]No maps found! +about.button = About +name = Name: noname = Pick a[accent] player name[] first. filename = File Name: -unlocked = New Block Unlocked! +unlocked = New content unlocked! completed = [accent]Completed techtree = Tech Tree -research.list = [LIGHT_GRAY]Research: +research.list = [lightgray]Research: research = Research -researched = [LIGHT_GRAY]{0} researched. -players = 1090 oyuncu çevrimiçi -players.single = {0} Oyuncu Çevrimiçi -server.closing = [accent] Sunucu kapatılıyor ... -server.kicked.kick = Sunucudan kovuldun! +researched = [lightgray]{0} researched. +players = {0} players online +players.single = {0} player online +server.closing = [accent]Closing server... +server.kicked.kick = You have been kicked from the server! server.kicked.serverClose = Server closed. -server.kicked.clientOutdated = Oyun sürümünüz geçerli değil. Oyununu güncelleyin! -server.kicked.serverOutdated = Eski sunucu! Ev sahibinden güncellemesini isteyin! -server.kicked.banned = Bu sunucudan yasaklandınız. -server.kicked.recentKick = Son zamanlarda tekmelendin. Tekrar bağlanmadan önce bekleyin. +server.kicked.clientOutdated = Outdated client! Update your game! +server.kicked.serverOutdated = Outdated server! Ask the host to update! +server.kicked.banned = You are banned on this server. +server.kicked.recentKick = You have been kicked recently.\nWait before connecting again. server.kicked.nameInUse = There is someone with that name\nalready on this server. -server.kicked.nameEmpty = Your name must contain at least one character or number. +server.kicked.nameEmpty = Your chosen name is invalid. server.kicked.idInUse = You are already on this server! Connecting with two accounts is not permitted. server.kicked.customClient = This server does not support custom builds. Download an official version. server.kicked.gameover = Game over! -host.info = [Vurgu] ana bilgisayarı [] düğmesi, [657] [65] [65] ve [65] [6568] bağlantı noktalarında bir sunucuyu barındırır. [] Aynı [LIGHT_GRAY] wifi veya yerel ağ [] üzerindeki herkes sunucunuzu sunucularında görebilir. liste. Kişilerin IP tarafından herhangi bir yerden bağlanabilmesini istiyorsanız [vurgu] bağlantı noktası iletme [] gereklidir. [LIGHT_GRAY] Not: Birisi LAN oyununuza bağlanırken sorun yaşıyorsa, güvenlik duvarı ayarlarınızda Mindustry'e yerel ağınıza erişebildiğinizden emin olun. -join.info = Burada, bağlanmak için yerel ağ [] sunucularına bağlanmak ya da [aksan] sunucularını bulmak için bir [vurgu] sunucunun IP [] girebilirsiniz. Hem LAN hem de WAN çok oyunculu desteklenir. [LIGHT_GRAY] Not: Otomatik bir global sunucu listesi yoktur; Birisine IP ile bağlanmak isterseniz, ana bilgisayardan kendi IP adreslerini sormanız gerekir. -hostserver = Oyunu Sun +server.versions = Your version:[accent] {0}[]\nServer version:[accent] {1}[] +host.info = The [accent]host[] button hosts a server on port [scarlet]6567[]. \nAnybody on the same [lightgray]wifi or local network[] should be able to see your server in their server list.\n\nIf you want people to be able to connect from anywhere by IP, [accent]port forwarding[] is required.\n\n[lightgray]Note: If someone is experiencing trouble connecting to your LAN game, make sure you have allowed Mindustry access to your local network in your firewall settings. Note that public networks sometimes do not allow server discovery. +join.info = Here, you can enter a [accent]server IP[] to connect to, or discover [accent]local network[] servers to connect to.\nBoth LAN and WAN multiplayer is supported.\n\n[lightgray]Note: There is no automatic global server list; if you want to connect to someone by IP, you would need to ask the host for their IP. +hostserver = Host Multiplayer Game hostserver.mobile = Host\nGame -host = evsahibi -hosting = [accent] Sunucu açılıyor ... -hosts.refresh = Yenile -hosts.discovering = LAN oyunlarını keşfetme -server.refreshing = Canlandırıcı sunucu -hosts.none = [lightgray] Hayır LAN oyunları bulundu! -host.invalid = [scarlet] Ana bilgisayara bağlanılamıyor. -trace = Oyuncuyu Takip Et -trace.playername = Oyuncu adı: [accent] {0} -trace.ip = IP: [vurgu] {0} -trace.id = Benzersiz kimlik: [accent] {0} +host = Host +hosting = [accent]Opening server... +hosts.refresh = Refresh +hosts.discovering = Discovering LAN games +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.ip = IP: [accent]{0} +trace.id = Unique ID: [accent]{0} trace.mobile = Mobile Client: [accent]{0} -trace.modclient = Özel Alıcı: [accent] {0} -invalidid = Geçersiz alıcı kimliği! Bir hata raporu gönderin. -server.bans = yasaklar -server.bans.none = Yasaklanmış oyuncu bulunamadı! -server.admins = Yöneticiler -server.admins.none = Yönetici bulunamadı! -server.add = Sunucu ekle -server.delete = Bu sunucuyu silmek istediğinizden emin misiniz? -server.edit = Sunucuyu Düzenle -server.outdated = [crimson] Eski Sunucu! -server.outdated.client = [crimson] Eski Alıcı! -server.version = [lightgray] Sürüm: {0} -server.custombuild = [sarı] Özel Yapım -confirmban = Bu oyuncuyu yasaklamak istediğinizden emin misiniz? +trace.modclient = Custom Client: [accent]{0} +invalidid = Invalid client ID! Submit a bug report. +server.bans = Bans +server.bans.none = No banned players found! +server.admins = Admins +server.admins.none = No admins found! +server.add = Add Server +server.delete = Are you sure you want to delete this server? +server.edit = Edit Server +server.outdated = [crimson]Outdated Server![] +server.outdated.client = [crimson]Outdated Client![] +server.version = [gray]v{0} {1} +server.custombuild = [yellow]Custom Build +confirmban = Are you sure you want to ban this player? confirmkick = Are you sure you want to kick this player? -confirmunban = Bu oyuncunun yasağını kaldırmak istediğinden emin misin? -confirmadmin = Bu oyuncunun yönetici yapmak istediğinden emin misin? -confirmunadmin = Bu oyuncudan yönetici durumunu kaldırmak istediğinizden emin misiniz? -joingame.title = Oyuna katılmak -joingame.ip = IP: -disconnect = Bağlantı Kesildi -disconnect.data = Dünya verileri yüklenemedi! -connecting = [Vurgu] bağlanıyor ... -connecting.data = [accent] Dünya verileri yükleniyor ... -server.port = Liman -server.addressinuse = Adres çoktan kullanımda! -server.invalidport = Bağlantı noktası numarası geçersiz. -server.error = [crimson] Sunucu barındırma hatası: [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 = 6349,Yeni Kayıt -save.overwrite = Bu kayıt yuvasının üzerine yazmak istediğinizden emin misiniz? -overwrite = Üzerine Yaz -save.none = Hiçbir kayıt bulunamadı! -saveload = [Vurgu] Kaydediliyor ... -savefail = Oyun kaydedilemedi! -save.delete.confirm = Bu kaydı silmek istediğinizden emin misiniz? -save.delete = Sil -save.export = Dışa Aktar -save.import.invalid = [turuncu] Bu kayıt geçersiz! -save.import.fail = [crimson] Kayıt oyuna aktarılamadı : [accent] {0} -save.export.fail = [crimson] Kayıt dışa aktarılamadı: [accent] {0} -save.import = İçe Aktar -save.newslot = İsmi kaydet: -save.rename = Yeniden Adlandır -save.rename.text = Yeni İsim: -selectslot = Bir kayıt seçin. -slot = [accent] Yuva {0} -save.corrupted = [accent] Kayıt dosyası bozuk veya geçersiz! -empty = -on = Açık -off = Kapalı -save.autosave = Otomatik kaydetme: {0} -save.map = harita -save.wave = Dalga -save.difficulty = zorluk -save.date = Son Kaydedilen: {0} +confirmunban = Are you sure you want to unban this player? +confirmadmin = Are you sure you want to make this player an admin? +confirmunadmin = Are you sure you want to remove admin status from this player? +joingame.title = Join Game +joingame.ip = Address: +disconnect = Disconnected. +disconnect.data = Failed to load world data! +connecting = [accent]Connecting... +connecting.data = [accent]Loading world data... +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[lightgray]Save backwards compatibility will be implemented in the full 4.0 release. +save.new = New Save +save.overwrite = Are you sure you want to overwrite\nthis save slot? +overwrite = Overwrite +save.none = No saves found! +saveload = Saving... +savefail = Failed to save game! +save.delete.confirm = Are you sure you want to delete this save? +save.delete = Delete +save.export = Export Save +save.import.invalid = [accent]This save is invalid! +save.import.fail = [crimson]Failed to import save: [accent]{0} +save.export.fail = [crimson]Failed to export save: [accent]{0} +save.import = Import Save +save.newslot = Save name: +save.rename = Rename +save.rename.text = New name: +selectslot = Select a save. +slot = [accent]Slot {0} +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 = On +off = Off +save.autosave = Autosave: {0} +save.map = Map: {0} +save.wave = Wave {0} +save.difficulty = Difficulty: {0} +save.date = Last Saved: {0} save.playtime = Playtime: {0} warning = Warning. -confirm = Onayla -delete = Sil -ok = Tamam -open = Açık -customize = Customize -cancel = İptal -openlink = Linki aç -copylink = Bağlantıyı kopyala -back = Geri -quit.confirm = Çıkmak istediğinden emin misin? -loading = [Vurgu] Yükleniyor ... +confirm = Confirm +delete = Delete +ok = OK +open = Open +customize = Customize Rules +cancel = Cancel +openlink = Open Link +copylink = Copy Link +back = Back +classic.export = Export Classic Data +classic.export.text = [accent]Mindustry[] has just had a major update.\nClassic (v3.5 build 40) save or map data has been detected. Would you like to export these saves to your phone's home folder, for use in the Mindustry Classic app? +quit.confirm = Are you sure you want to quit? +quit.confirm.tutorial = Are you sure you know what you're doing?\nThe tutorial can be re-taken in[accent] Settings->Game->Re-Take Tutorial.[] +loading = [accent]Loading... saving = [accent]Saving... -wave = [turuncu] Dalga {0} -wave.waiting = {0} içinde dalga -wave.waveInProgress = [LIGHT_GRAY]Wave in progress -waiting = Bekleniyor +wave = [accent]Wave {0} +wave.waiting = [lightgray]Wave in {0} +wave.waveInProgress = [lightgray]Wave in progress +waiting = [lightgray]Waiting... waiting.players = Waiting for players... -wave.enemies = [LIGHT_GRAY]{0} Enemies Remaining -wave.enemy = [LIGHT_GRAY]{0} Enemy Remaining -loadimage = Resmi yükle -saveimage = Resmi Kaydet +wave.enemies = [lightgray]{0} Enemies Remaining +wave.enemy = [lightgray]{0} Enemy Remaining +loadimage = Load Image +saveimage = Save Image unknown = Unknown custom = Custom builtin = Built-In map.delete.confirm = Are you sure you want to delete this map? This action cannot be undone! map.random = [accent]Random Map -map.nospawn = This map does not have any cores for the player to spawn in! Add a [ROYAL]blue[] core to this map in the editor. -map.nospawn.pvp = This map does not have any enemy cores for player to spawn into! Add[SCARLET] red[] cores to this map in the editor. +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.invalid = Error loading map: corrupted or invalid map file. editor.brush = Brush @@ -202,7 +210,7 @@ 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] +editor.default = [lightgray] edit = Edit... editor.name = Name: editor.spawn = Spawn Unit @@ -213,14 +221,14 @@ 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.errorheader = This map file is either not valid or corrupt. -editor.errorname = Map has no name defined. +editor.errorname = Map has no name defined. Are you trying to load a save file? editor.update = Update editor.randomize = Randomize editor.apply = Apply -editor.generate = Üretmek -editor.resize = Yeniden Boyutlandırma -editor.loadmap = Harita Yükle -editor.savemap = Harita Kaydet +editor.generate = Generate +editor.resize = Resize +editor.loadmap = Load Map +editor.savemap = Save Map editor.saved = Saved! editor.save.noname = Your map does not have a name! Set one in the 'map info' menu. editor.save.overwrite = Your map overwrites a built-in map! Pick a different name in the 'map info' menu. @@ -230,21 +238,22 @@ editor.importmap = Import Map editor.importmap.description = Import an already existing map editor.importfile = Import File editor.importfile.description = Import an external map file -editor.importimage = Import Terrain Image +editor.importimage = Import Legacy Image editor.importimage.description = Import an external map image file editor.export = Export... editor.exportfile = Export File editor.exportfile.description = Export a map file editor.exportimage = Export Terrain Image editor.exportimage.description = Export a map image file -editor.loadimage = Resmi yükle -editor.saveimage = Resmi Kaydet -editor.unsaved = [scarlet] Kaydedilmemiş değişiklikleriniz var! [] Çıkmak istediğinizden emin misiniz? -editor.resizemap = Haritayı Yeniden Boyutlandır -editor.mapname = Harita Adı -editor.overwrite = [Vurgu] Uyarı! Bu mevcut bir haritanın üzerine yazar. +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.selectmap = Yüklenecek bir harita seçin: +editor.selectmap = Select a map to load: + toolmode.replace = Replace toolmode.replace.description = Draws only on solid blocks. toolmode.replaceall = Replace All @@ -259,10 +268,12 @@ 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. + +filters.empty = [lightgray]No filters! Add one with the button below. filter.distort = Distort filter.noise = Noise filter.median = Median +filter.oremedian = Ore Median filter.blend = Blend filter.defaultores = Default Ores filter.ore = Ore @@ -289,56 +300,62 @@ filter.option.floor2 = Secondary Floor filter.option.threshold2 = Secondary Threshold filter.option.radius = Radius filter.option.percentile = Percentile -width = Genişliği: -height = Boy: -menu = Menü -play = Oyna + +width = Width: +height = Height: +menu = Menu +play = Play campaign = Campaign -load = Yükle -save = Kaydet +load = Load +save = Save fps = FPS: {0} tps = TPS: {0} ping = Ping: {0}ms -language.restart = Lütfen dil ayarlarının etkili olması için oyununuzu yeniden başlatın. -settings = Ayarlar -tutorial = Eğitim -editor = Editör -mapeditor = Harita Editörü -donate = Bağışlamak +language.restart = Please restart your game for the language settings to take effect. +settings = Settings +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: +complete = [lightgray]Reach: zone.requirement = Wave {0} in zone {1} -resume = Resume Zone:\n[LIGHT_GRAY]{0} -bestwave = [LIGHT_GRAY]Best: {0} -launch = Launch +resume = Resume Zone:\n[lightgray]{0} +bestwave = [lightgray]Best Wave: {0} +launch = < LAUNCH > launch.title = Launch Successful -launch.next = [LIGHT_GRAY]next opportunity at wave {0} -launch.unable = [scarlet]Unable to LAUNCH.[] Enemies. +launch.next = [lightgray]next opportunity at wave {0} +launch.unable2 = [scarlet]Unable to LAUNCH.[] launch.confirm = This will launch all resources in your core.\nYou will not be able to return to this base. +launch.skip.confirm = If you skip now, you will not be able to launch until later waves. uncover = Uncover configure = Configure Loadout -configure.locked = [LIGHT_GRAY]Reach wave {0}\nto configure loadout. -zone.unlocked = [LIGHT_GRAY]{0} unlocked. +configure.locked = [lightgray]Unlock configuring loadout: Wave {0}. +zone.unlocked = [lightgray]{0} unlocked. zone.requirement.complete = Wave {0} reached:\n{1} zone requirements met. zone.config.complete = Wave {0} reached:\nLoadout config unlocked. -zone.resources = Resources Detected: +zone.resources = [lightgray]Resources Detected: zone.objective = [lightgray]Objective: [accent]{0} zone.objective.survival = Survive zone.objective.attack = Destroy Enemy Core add = Add... boss.health = Boss Health -connectfail = [crimson] Sunucuya bağlanılamadı: [accent] {0} -error.unreachable = Server unreachable. + +connectfail = [crimson]Connection error:\n\n[accent]{0} +error.unreachable = Server unreachable.\nIs the address spelled correctly? error.invalidaddress = Invalid address. error.timedout = Timed out!\nMake sure the host has port forwarding set up, and that the address is correct! error.mismatch = Packet error:\npossible client/server version mismatch.\nMake sure you and the host have the latest version of Mindustry! error.alreadyconnected = Already connected. error.mapnotfound = Map file not found! error.io = Network I/O error. -error.any = Unkown network 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 @@ -352,56 +369,60 @@ 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.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 dagger units. Destroy it. Reclaim that which was lost. +zone.overgrowth.description = This area is overgrown, closer to the source of the spores.\nThe enemy has established an outpost here. Build Titan units. Destroy it. Reclaim that which was lost. zone.tarFields.description = The outskirts of an oil production zone, between the mountains and desert. One of the few areas with usable tar reserves.\nAlthough abandoned, this area has some dangerous enemy forces nearby. Do not underestimate them.\n\n[lightgray]Research oil processing technology if possible. zone.desolateRift.description = An extremely dangerous zone. Plentiful resources, but little space. High risk of destruction. Leave as soon as possible. Do not be fooled by the long spacing between enemy attacks. zone.nuclearComplex.description = A former facility for the production and processing of thorium, reduced to ruins.\n[lightgray]Research the thorium and its many uses.\n\nThe enemy is present here in great numbers, constantly scouting for attackers. +zone.fungalPass.description = A transition area between high mountains and lower, spore-ridden lands. A small enemy reconnaissance base is located here.\nDestroy it.\nUse Dagger and Crawler units. Take out the two cores. zone.impact0078.description = zone.crags.description = -settings.language = Dil -settings.reset = Varsayılanlara Dön + +settings.language = Language +settings.reset = Reset to Defaults settings.rebind = Rebind -settings.controls = kontroller -settings.game = Oyun -settings.sound = Ses -settings.graphics = Grafik +settings.controls = Controls +settings.game = Game +settings.sound = Sound +settings.graphics = Graphics settings.cleardata = Clear Game Data... settings.clear.confirm = Are you sure you want to clear this data?\nWhat is done cannot be undone! settings.clearall.confirm = [scarlet]WARNING![]\nThis will clear all data, including saves, maps, unlocks and keybinds.\nOnce you press 'ok' the game will wipe all data and automatically exit. settings.clearunlocks = Clear Unlocks settings.clearall = Clear All -paused = Duraklatıldı +paused = [accent]< Paused > yes = Yes no = No -info.title = [Vurgu] Bilgi -error.title = [crimson] Bir hata oluştu -error.crashtitle = Bir hata oluştu +info.title = Info +error.title = [crimson]An error has occured +error.crashtitle = An error has occured attackpvponly = [scarlet]Only available in Attack/PvP modes blocks.input = Input blocks.output = Output blocks.booster = Booster -block.unknown = [LIGHT_GRAY]??? -blocks.powercapacity = Güç kapasitesi -blocks.powershot = Güç / atış +block.unknown = [lightgray]??? +blocks.powercapacity = Power Capacity +blocks.powershot = Power/Shot blocks.damage = Damage blocks.targetsair = Targets Air blocks.targetsground = Targets Ground blocks.itemsmoved = Move Speed blocks.launchtime = Time Between Launches blocks.shootrange = Range -blocks.size = Boyut -blocks.liquidcapacity = Sıvı kapasitesi -blocks.powerrange = Güç aralığı +blocks.size = Size +blocks.liquidcapacity = Liquid Capacity +blocks.powerrange = Power Range blocks.poweruse = Power Use blocks.powerdamage = Power/Damage -blocks.itemcapacity = Ürün kapasitesi +blocks.itemcapacity = Item Capacity blocks.basepowergeneration = Base Power Generation blocks.productiontime = Production Time blocks.repairtime = Block Full Repair Time @@ -411,15 +432,17 @@ blocks.drilltier = Drillables blocks.drillspeed = Base Drill Speed blocks.boosteffect = Boost Effect blocks.maxunits = Max Active Units -blocks.health = Can +blocks.health = Health blocks.buildtime = Build Time -blocks.inaccuracy = yanlışlık -blocks.shots = atışlar -blocks.reload = Reload +blocks.inaccuracy = Inaccuracy +blocks.shots = Shots +blocks.reload = Shots/Second blocks.ammo = Ammo + +bar.drilltierreq = Better Drill Required bar.drillspeed = Drill Speed: {0}/s bar.efficiency = Efficiency: {0}% -bar.powerbalance = Power: {0} +bar.powerbalance = Power: {0}/s bar.poweramount = Power: {0} bar.poweroutput = Power Output: {0} bar.items = Items: {0} @@ -428,7 +451,8 @@ bar.heat = Heat bar.power = Power bar.progress = Build Progress bar.spawned = Units: {0}/{1} -bullet.damage = [stat]{0}[lightgray] dmg + +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 @@ -438,7 +462,8 @@ 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 +bullet.reload = [stat]{0}[lightgray]x fire rate + unit.blocks = blocks unit.powersecond = power units/second unit.liquidsecond = liquid units/second @@ -455,7 +480,7 @@ category.general = General category.power = Power category.liquids = Liquids category.items = Items -category.crafting = Crafting +category.crafting = Input/Output category.shooting = Shooting category.optional = Optional Enhancements setting.landscape.name = Lock Landscape @@ -463,8 +488,8 @@ 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.indicators.name = Ally Indicators +setting.antialias.name = Antialias[lightgray] (requires restart)[] +setting.indicators.name = Enemy/Ally Indicators setting.autotarget.name = Auto-Target setting.keyboard.name = Mouse+Keyboard Controls setting.fpscap.name = Max FPS @@ -472,35 +497,36 @@ setting.fpscap.none = None setting.fpscap.text = {0} FPS setting.uiscale.name = UI Scaling[lightgray] (require restart)[] setting.swapdiagonal.name = Always Diagonal Placement -setting.difficulty.training = training -setting.difficulty.easy = kolay -setting.difficulty.normal = orta -setting.difficulty.hard = zor -setting.difficulty.insane = deli -setting.difficulty.name = Zorluk: -setting.screenshake.name = Ekran Sallamak -setting.effects.name = Görüntü Efektleri -setting.sensitivity.name = Denetleyici hassasiyeti -setting.saveinterval.name = Otomatik Kaydetme Aralığı -setting.seconds = saniye -setting.fullscreen.name = Tam ekran -setting.borderlesswindow.name = Borderless Window[LIGHT_GRAY] (may require restart) -setting.fps.name = Saniyede ... Kare göstermek +setting.difficulty.training = Training +setting.difficulty.easy = Easy +setting.difficulty.normal = Normal +setting.difficulty.hard = Hard +setting.difficulty.insane = Insane +setting.difficulty.name = Difficulty: +setting.screenshake.name = Screen Shake +setting.effects.name = Display Effects +setting.sensitivity.name = Controller Sensitivity +setting.saveinterval.name = Save Interval +setting.seconds = {0} Seconds +setting.fullscreen.name = Fullscreen +setting.borderlesswindow.name = Borderless Window[lightgray] (may require restart) +setting.fps.name = Show FPS setting.vsync.name = VSync -setting.lasers.name = Güç Lazerleri Göster -setting.pixelate.name = Pixelate [LIGHT_GRAY](may decrease performance) +setting.lasers.name = Show Power Lasers +setting.pixelate.name = Pixelate[lightgray] (disables animations) setting.minimap.name = Show Minimap -setting.musicvol.name = Müzik sesi -setting.mutemusic.name = Müziği Kapat -setting.sfxvol.name = SFX Hacmi -setting.mutesound.name = Sesi kapat +setting.musicvol.name = Music Volume +setting.ambientvol.name = Ambient Volume +setting.mutemusic.name = Mute Music +setting.sfxvol.name = SFX Volume +setting.mutesound.name = Mute Sound setting.crashreport.name = Send Anonymous Crash Reports setting.chatopacity.name = Chat Opacity setting.playerchat.name = Display In-Game Chat -uiscale.reset = UI scale has been changed.\nPress "OK" to confirm this scale.\n[scarlet]Reverting and exiting in[accent] {0}[] settings... +uiscale.reset = UI scale has been changed.\nPress "OK" to confirm this scale.\n[scarlet]Reverting and exiting in[accent] {0}[] seconds... uiscale.cancel = Cancel & Exit setting.bloom.name = Bloom -keybind.title = Tuşları yeniden ayarla +keybind.title = Rebind Keys keybinds.mobile = [scarlet]Most keybinds here are not functional on mobile. Only basic movement is supported. category.general.name = General category.view.name = View @@ -513,58 +539,59 @@ keybind.gridModeShift.name = Category Select keybind.press = Press a key... keybind.press.axis = Press an axis or key... keybind.screenshot.name = Map Screenshot -keybind.move_x.name = sağ / sol -keybind.move_y.name = yukarı / aşağı -keybind.select.name = seçmek +keybind.move_x.name = Move x +keybind.move_y.name = Move y +keybind.select.name = Select/Shoot keybind.diagonal_placement.name = Diagonal Placement keybind.pick.name = Pick Block keybind.break_block.name = Break Block keybind.deselect.name = Deselect -keybind.shoot.name = ateş etme -keybind.zoom_hold.name = tut ve büyüt -keybind.zoom.name = Yakınlaştır -keybind.menu.name = menü -keybind.pause.name = duraklatma +keybind.shoot.name = Shoot +keybind.zoom_hold.name = Zoom Hold +keybind.zoom.name = Zoom +keybind.menu.name = Menu +keybind.pause.name = Pause keybind.minimap.name = Minimap -keybind.dash.name = tire -keybind.chat.name = Sohbet -keybind.player_list.name = oyuncu listesi -keybind.console.name = KONTROL MASASI -keybind.rotate.name = Döndür +keybind.dash.name = Dash +keybind.chat.name = Chat +keybind.player_list.name = Player list +keybind.console.name = Console +keybind.rotate.name = Rotate keybind.toggle_menus.name = Toggle menus keybind.chat_history_prev.name = Chat history prev keybind.chat_history_next.name = Chat history next keybind.chat_scroll.name = Chat scroll -keybind.drop_unit.name = drop unit +keybind.drop_unit.name = Drop Unit keybind.zoom_minimap.name = Zoom minimap -mode.help.title = Modların açıklaması +mode.help.title = Description of modes mode.survival.name = Survival -mode.survival.description = The normal mode. Limited resources and automatic incoming waves. -mode.sandbox.name = Limitsiz Oynama -mode.sandbox.description = sonsuz kaynaklar ve dalgalar için zamanlayıcı yok. +mode.survival.description = The normal mode. Limited resources and automatic incoming waves.\n[gray]Requires enemy spawns in the map to play. +mode.sandbox.name = Sandbox +mode.sandbox.description = Infinite resources and no timer for waves. mode.pvp.name = PvP -mode.pvp.description = fight against other players locally. +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 = No waves, with the goal to destroy the enemy base. +mode.attack.description = Destroy the enemy's base. No waves.\n[gray]Requires a red core in the map to play. mode.custom = Custom Rules + rules.infiniteresources = Infinite Resources rules.wavetimer = Wave Timer rules.waves = Waves rules.attack = Attack Mode -rules.enemyCheat = Infinite AI Resources +rules.enemyCheat = Infinite AI (Red Team) Resources rules.unitdrops = Unit Drops -rules.unitbuildspeedmultiplier = Unit Creation Speed Multiplier +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:[LIGHT_GRAY] (tiles) -rules.respawntime = Respawn Time:[LIGHT_GRAY] (sec) -rules.wavespacing = Wave Spacing:[LIGHT_GRAY] (sec) +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:[LIGHT_GRAY] (tiles) +rules.dropzoneradius = Drop Zone Radius:[lightgray] (tiles) rules.respawns = Max respawns per wave rules.limitedRespawns = Limit Respawns rules.title.waves = Waves @@ -573,6 +600,7 @@ rules.title.resourcesbuilding = Resources & Building rules.title.player = Players rules.title.enemy = Enemies rules.title.unit = Units + content.item.name = Items content.liquid.name = Liquids content.unit.name = Units @@ -580,27 +608,27 @@ content.block.name = Blocks content.mech.name = Mechs item.copper.name = Copper item.lead.name = Lead -item.coal.name = kömür +item.coal.name = Coal item.graphite.name = Graphite -item.titanium.name = titanyum +item.titanium.name = Titanium item.thorium.name = Thorium item.silicon.name = Silicon item.plastanium.name = Plastanium item.phase-fabric.name = Phase Fabric item.surge-alloy.name = Surge Alloy item.spore-pod.name = Spore Pod -item.sand.name = kum +item.sand.name = Sand item.blast-compound.name = Blast Compound item.pyratite.name = Pyratite item.metaglass.name = Metaglass item.scrap.name = Scrap -liquid.water.name = su +liquid.water.name = Water liquid.slag.name = Slag -liquid.oil.name = petrol +liquid.oil.name = Oil liquid.cryofluid.name = Cryofluid mech.alpha-mech.name = Alpha mech.alpha-mech.weapon = Heavy Repeater -mech.alpha-mech.ability = Drone Swarm +mech.alpha-mech.ability = Regeneration mech.delta-mech.name = Delta mech.delta-mech.weapon = Arc Generator mech.delta-mech.ability = Discharge @@ -619,21 +647,22 @@ mech.trident-ship.name = Trident mech.trident-ship.weapon = Bomb Bay mech.glaive-ship.name = Glaive mech.glaive-ship.weapon = Flame Repeater -item.explosiveness = [LIGHT_GRAY]Explosiveness: {0} -item.flammability = [LIGHT_GRAY]Flammability: {0} -item.radioactivity = [LIGHT_GRAY]Radioactivity: {0} -unit.health = [LIGHT_GRAY]Health: {0} -unit.speed = [LIGHT_GRAY]Speed: {0} -mech.weapon = [LIGHT_GRAY]Weapon: {0} -mech.health = [LIGHT_GRAY]Health: {0} -mech.itemcapacity = [LIGHT_GRAY]Item Capacity: {0} -mech.minespeed = [LIGHT_GRAY]Mining Speed: {0} -mech.minepower = [LIGHT_GRAY]Mining Power: {0} -mech.ability = [LIGHT_GRAY]Ability: {0} -mech.buildspeed = [LIGHT_GRAY]Building Speed: {0}% -liquid.heatcapacity = [LIGHT_GRAY]Heat Capacity: {0} -liquid.viscosity = [LIGHT_GRAY]Viscosity: {0} -liquid.temperature = [LIGHT_GRAY]Temperature: {0} +item.explosiveness = [lightgray]Explosiveness: {0}% +item.flammability = [lightgray]Flammability: {0}% +item.radioactivity = [lightgray]Radioactivity: {0}% +unit.health = [lightgray]Health: {0} +unit.speed = [lightgray]Speed: {0} +mech.weapon = [lightgray]Weapon: {0} +mech.health = [lightgray]Health: {0} +mech.itemcapacity = [lightgray]Item Capacity: {0} +mech.minespeed = [lightgray]Mining Speed: {0}% +mech.minepower = [lightgray]Mining Power: {0} +mech.ability = [lightgray]Ability: {0} +mech.buildspeed = [lightgray]Building Speed: {0}% +liquid.heatcapacity = [lightgray]Heat Capacity: {0} +liquid.viscosity = [lightgray]Viscosity: {0} +liquid.temperature = [lightgray]Temperature: {0} + block.sand-boulder.name = Sand Boulder block.grass.name = Grass block.salt.name = Salt @@ -660,21 +689,21 @@ block.thruster.name = Thruster block.kiln.name = Kiln block.graphite-press.name = Graphite Press block.multi-press.name = Multi-Press -block.constructing = {0}\n[LIGHT_GRAY](Constructing) +block.constructing = {0} [lightgray](Constructing) block.spawn.name = Enemy Spawn block.core-shard.name = Core: Shard block.core-foundation.name = Core: Foundation block.core-nucleus.name = Core: Nucleus -block.deepwater.name = deepwater -block.water.name = water +block.deepwater.name = Deep Water +block.water.name = Water block.tainted-water.name = Tainted Water block.darksand-tainted-water.name = Dark Sand Tainted Water block.tar.name = Tar -block.stone.name = stone -block.sand.name = sand +block.stone.name = Stone +block.sand.name = Sand block.darksand.name = Dark Sand -block.ice.name = ice -block.snow.name = snow +block.ice.name = Ice +block.snow.name = Snow block.craters.name = Craters block.sand-water.name = Sand water block.darksand-water.name = Dark Sand Water @@ -689,10 +718,10 @@ block.pine.name = Pine block.white-tree-dead.name = White Tree Dead block.white-tree.name = White Tree block.spore-cluster.name = Spore Cluster -block.metal-floor.name = Metal Floor +block.metal-floor.name = Metal Floor 1 block.metal-floor-2.name = Metal Floor 2 block.metal-floor-3.name = Metal Floor 3 -block.metal-floor-5.name = Metal Floor 5 +block.metal-floor-5.name = Metal Floor 4 block.metal-floor-damaged.name = Metal Floor Damaged block.dark-panel-1.name = Dark Panel 1 block.dark-panel-2.name = Dark Panel 2 @@ -713,19 +742,19 @@ block.phase-wall.name = Phase Wall block.phase-wall-large.name = Large Phase Wall block.thorium-wall.name = Thorium Wall block.thorium-wall-large.name = Large Thorium Wall -block.door.name = kapı -block.door-large.name = büyük kapı +block.door.name = Door +block.door-large.name = Large Door block.duo.name = Duo block.scorch.name = Scorch block.scatter.name = Scatter block.hail.name = Hail block.lancer.name = Lancer -block.conveyor.name = konveyör +block.conveyor.name = Conveyor block.titanium-conveyor.name = Titanium Conveyor -block.junction.name = Kavşak noktası -block.router.name = yönlendirici +block.junction.name = Junction +block.router.name = Router block.distributor.name = Distributor -block.sorter.name = ayrıştırıcı +block.sorter.name = Sorter block.overflow-gate.name = Overflow Gate block.silicon-smelter.name = Silicon Smelter block.phase-weaver.name = Phase Weaver @@ -742,7 +771,7 @@ block.surge-tower.name = Surge Tower block.battery.name = Battery block.battery-large.name = Large Battery block.combustion-generator.name = Combustion Generator -block.turbine-generator.name = Turbine Generator +block.turbine-generator.name = Steam Generator block.differential-generator.name = Differential Generator block.impact-reactor.name = Impact Reactor block.mechanical-drill.name = Mechanical Drill @@ -750,14 +779,14 @@ block.pneumatic-drill.name = Pneumatic Drill block.laser-drill.name = Laser Drill block.water-extractor.name = Water Extractor block.cultivator.name = Cultivator -block.dart-mech-pad.name = Dart Mech Pad +block.dart-mech-pad.name = Alpha Mech Pad block.delta-mech-pad.name = Delta Mech Pad block.javelin-ship-pad.name = Javelin Ship Pad block.trident-ship-pad.name = Trident Ship Pad block.glaive-ship-pad.name = Glaive Ship Pad block.omega-mech-pad.name = Omega Mech Pad block.tau-mech-pad.name = Tau Mech Pad -block.conduit.name = sıvı borusu +block.conduit.name = Conduit block.mechanical-pump.name = Mechanical Pump block.item-source.name = Item Source block.item-void.name = Item Void @@ -779,8 +808,8 @@ block.solar-panel.name = Solar Panel block.solar-panel-large.name = Large Solar Panel block.oil-extractor.name = Oil Extractor block.draug-factory.name = Draug Miner Drone Factory -block.spirit-factory.name = Spirit Drone Factory -block.phantom-factory.name = Phantom 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 @@ -798,10 +827,10 @@ block.bridge-conduit.name = Bridge Conduit block.rotary-pump.name = Rotary Pump block.thorium-reactor.name = Thorium Reactor block.mass-driver.name = Mass Driver -block.blast-drill.name = Blast Drill +block.blast-drill.name = Airblast Drill block.thermal-pump.name = Thermal Pump block.thermal-generator.name = Thermal Generator -block.alloy-smelter.name = Alloy Smtler +block.alloy-smelter.name = Alloy Smelter block.mender.name = Mender block.mend-projector.name = Mend Projector block.surge-wall.name = Surge Wall @@ -819,14 +848,15 @@ block.container.name = Container block.launch-pad.name = Launch Pad block.launch-pad-large.name = Large Launch Pad team.blue.name = blue -team.red.name = red +team.crux.name = red +team.sharded.name = orange team.orange.name = orange -team.none.name = gray +team.derelict.name = derelict team.green.name = green team.purple.name = purple -unit.spirit.name = Spirit Drone +unit.spirit.name = Spirit Repair Drone unit.draug.name = Draug Miner Drone -unit.phantom.name = Phantom Drone +unit.phantom.name = Phantom Builder Drone unit.dagger.name = Dagger unit.crawler.name = Crawler unit.titan.name = Titan @@ -839,186 +869,183 @@ unit.chaos-array.name = Chaos Array unit.eradicator.name = Eradicator unit.lich.name = Lich unit.reaper.name = Reaper -tutorial.begin = Your mission here is to eradicate the[LIGHT_GRAY] enemy[].\n\nBegin by[accent] mining copper[]. Tap a copper ore vein near your core to do this. -tutorial.drill = Mining manually is inefficient.\n[accent]Drills []can mine automatically.\nPlace one on a copper vein. -tutorial.conveyor = [accent]Conveyors[] are used to transport items to the core.\nMake a line of conveyors from the drill to the core. -tutorial.morecopper = More copper is required.\n\nEither mine it manually, or place more drills. -tutorial.turret = Defensive structures must be built to repel the[LIGHT_GRAY] enemy[].\nBuild a duo turret near your base. -tutorial.drillturret = Duo turrets require[accent] copper ammo []to shoot.\nPlace a drill next to the turret to supply it with mined copper. -tutorial.waves = The[LIGHT_GRAY] enemy[] approaches.\n\nDefend your core for 2 waves. Build more turrets. -tutorial.lead = More ores are available. Explore and mine[accent] lead[].\n\nDrag from your unit to the core to transfer resources. -tutorial.smelter = Copper and lead are weak metals.\nSuperior[accent] Dense Alloy[] can be created in a smelter.\n\nBuild one. -tutorial.densealloy = The smelter will now produce alloy.\nGet some.\nImprove the production if necessary. -tutorial.siliconsmelter = The core will now create a[accent] spirit drone[] for mining and repairing blocks.\n\nFactories for other units can be created with [accent] silicon.\nMake a silicon smelter. -tutorial.silicondrill = Silicon requires[accent] coal[] and[accent] sand[].\nStart by making drills. -tutorial.generator = This technology requires power.\nCreate a[accent] combustion generator[] for it. -tutorial.generatordrill = Combustion generators need fuel.\nFuel it with coal from a drill. -tutorial.node = Power requires transport.\nCreate a[accent] power node[] next to your combustion generator to transfer its power. -tutorial.nodelink = Power can be transferred through contacting power blocks and generators, or by linked power nodes.\n\nLink power by tapping the node and selecting the generator and silicon smelter. -tutorial.silicon = Silicon is being produced. Get some.\n\nImproving the production system is advised. -tutorial.daggerfactory = Construct a[accent] dagger mech factory.[]\n\nThis will be used to create attack mechs. -tutorial.router = Factories need resources to function.\nCreate a router to split conveyor resources. -tutorial.dagger = Link power nodes to the factory.\nOnce requirements are met, a mech will be created.\n\nCreate more drills, generators and conveyors as necessary. -tutorial.battle = The[LIGHT_GRAY] enemy[] has revealed their core.\nDestroy it with your unit and dagger mechs. -item.copper.description = A useful structure material. Used extensively in all types of blocks. +tutorial.next = [lightgray] +tutorial.intro = You have entered the[scarlet] Mindustry Tutorial.[]\nBegin by[accent] mining copper[]. Tap a copper ore vein near your core to do this.\n\n[accent]{0}/{1} copper +tutorial.drill = Mining manually is inefficient.\n[accent]Drills []can mine automatically.\nClick the drill tab in the bottom right.\nSelect the[accent] mechanical drill[]. Place it on a copper vein by clicking.\n[accent]Right-click[] to stop building. +tutorial.drill.mobile = Mining manually is inefficient.\n[accent]Drills []can mine automatically.\nTap the drill tab in the bottom right.\nSelect the[accent] mechanical drill[].\nPlace it on a copper vein by tapping, then press the[accent] checkmark[] below to confirm your selection.\nPress the[accent] X button[] to cancel placement. +tutorial.blockinfo = Each block has different stats. Each drill can only mine certain ores.\nTo check a block's info and stats,[accent] tap the "?" button while selecting it in the build menu.[]\n\n[accent]Access the Mechanical Drill's stats now.[] +tutorial.conveyor = [accent]Conveyors[] are used to transport items to the core.\nMake a line of conveyors from the drill to the core.\n[accent]Hold down the mouse to place in a line.[]\nHold[accent] CTRL[] while selecting a line to place diagonally.\n\n[accent]{0}/{1} conveyors placed in line\n[accent]0/1 items delivered +tutorial.conveyor.mobile = [accent]Conveyors[] are used to transport items to the core.\nMake a line of conveyors from the drill to the core.\n[accent] Place in a line by holding down your finger for a few seconds[] and dragging in a direction.\n\n[accent]{0}/{1} conveyors placed in line\n[accent]0/1 items delivered +tutorial.turret = Once an item enters your core, it can be used for building.\nKeep in mind that not all items can be used for building.\nItems that are not used for building, such as[accent] coal[] or[accent] scrap[], cannot be put into the core.\nDefensive structures must be built to repel the[lightgray] enemy[].\nBuild a[accent] duo turret[] near your base. +tutorial.drillturret = Duo turrets require[accent] copper ammo []to shoot.\nPlace a drill near the turret.\nLead conveyors into the turret to supply it with copper.\n\n[accent]Ammo delivered: 0/1 +tutorial.pause = During battle, you are able to[accent] pause the game.[]\nYou may queue buildings while paused.\n\n[accent]Press space to pause. +tutorial.pause.mobile = During battle, you are able to[accent] pause the game.[]\nYou may queue buildings while paused.\n\n[accent]Press this button in the top left to pause. +tutorial.unpause = Now press space again to unpause. +tutorial.unpause.mobile = Now press it again to unpause. +tutorial.breaking = Blocks frequently need to be destroyed.\n[accent]Hold down right-click[] to destroy all blocks in a selection.[]\n\n[accent]Destroy all the scrap blocks to the left of your core using area selection. +tutorial.breaking.mobile = Blocks frequently need to be destroyed.\n[accent]Select deconstruction mode[], then tap a block to begin breaking it.\nDestroy an area by holding down your finger for a few seconds[] and dragging in a direction.\nPress the checkmark button to confirm breaking.\n\n[accent]Destroy all the scrap blocks to the left of your core using area selection. +tutorial.withdraw = In some situations, taking items directly from blocks is necessary.\nTo do this, [accent]tap a block[] with items in it, then [accent]tap the item[] in the inventory.\nMultiple items can be withdrawn by [accent]tapping and holding[].\n\n[accent]Withdraw some copper from the core.[] +tutorial.deposit = Deposit items into blocks by dragging from your ship to the destination block.\n\n[accent]Deposit your copper back into the core.[] +tutorial.waves = The[lightgray] enemy[] approaches.\n\nDefend the core for 2 waves.[accent] Click[] to shoot.\nBuild more turrets and drills. Mine more copper. +tutorial.waves.mobile = The[lightgray] enemy[] approaches.\n\nDefend the core for 2 waves. Your ship will automatically fire at enemies.\nBuild more turrets and drills. Mine more copper. +tutorial.launch = Once you reach a specific wave, you are able to[accent] launch the core[], leaving your defenses behind and[accent] obtaining all the resources in your core.[]\nThese resources can then be used to research new technology.\n\n[accent]Press the launch button. + + +item.copper.description = The most basic structural material. Used extensively in all types of blocks. item.lead.description = A basic starter material. Used extensively in electronics and liquid transportation blocks. item.metaglass.description = A super-tough glass compound. Extensively used for liquid distribution and storage. item.graphite.description = Mineralized carbon, used for ammunition and electrical insulation. item.sand.description = A common material that is used extensively in smelting, both in alloying and as a flux. -item.coal.description = A common and readily available fuel. +item.coal.description = Fossilized plant matter, formed long before the seeding event. Used extensively for fuel and resource production. item.titanium.description = A rare super-light metal used extensively in liquid transportation, drills and aircraft. item.thorium.description = A dense, radioactive metal used as structural support and nuclear fuel. item.scrap.description = Leftover remnants of old structures and units. Contains trace amounts of many different metals. -item.silicon.description = An extremely useful semiconductor, with applications in solar panels and many complex electronics. +item.silicon.description = An extremely useful semiconductor. Applications in solar panels, complex electronics and homing turret ammunition. item.plastanium.description = A light, ductile material used in advanced aircraft and fragmentation ammunition. item.phase-fabric.description = A near-weightless substance used in advanced electronics and self-repairing technology. item.surge-alloy.description = An advanced alloy with unique electrical properties. -item.spore-pod.description = Used for conversion into oil, explosives and fuel. -item.blast-compound.description = A volatile compound used in bombs and explosives. While it can burned as fuel, this is not advised. +item.spore-pod.description = A pod of synthetic spores, synthesized from atmospheric concentrations for industrial purposes. Used for conversion into oil, explosives and fuel. +item.blast-compound.description = An unstable compound used in bombs and explosives. Synthesized from spore pods and other volatile substances. Use as fuel is not advised. item.pyratite.description = An extremely flammable substance used in incendiary weapons. -liquid.water.description = Commonly used for cooling machines and waste processing. +liquid.water.description = The most useful liquid. Commonly used for cooling machines and waste processing. liquid.slag.description = Various different types of molten metal mixed together. Can be separated into its constituent minerals, or sprayed at enemy units as a weapon. -liquid.oil.description = Can be burnt, exploded or used as a coolant. -liquid.cryofluid.description = The most efficient liquid for cooling things down. -mech.alpha-mech.description = The standard mech. Has decent speed and damage output; can create up to 3 drones for increased offensive capability. +liquid.oil.description = A liquid used in advanced material production. Can be converted into coal as fuel, or sprayed and set on fire as a weapon. +liquid.cryofluid.description = An inert, non-corrosive liquid created from water and titanium. Has extremely high heat capacity. Extensively used as coolant. +mech.alpha-mech.description = The standard control mech. Based on a Dagger unit, with upgraded armor and building capabilities. Has more damage output than a Dart ship. mech.delta-mech.description = A fast, lightly-armored mech made for hit-and-run attacks. Does little damage against structures, but can kill large groups of enemy units very quickly with its arc lightning weapons. -mech.tau-mech.description = The support mech. Heals allied blocks by shooting at them. Can extinguish fires and 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 ability can block up to 90% of incoming damage. -mech.dart-ship.description = The standard 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 ability and missiles. -mech.trident-ship.description = A heavy bomber. Reasonably well armored. -mech.glaive-ship.description = A large, well-armored gunship. Equipped with an incendiary repeater. Good acceleration and maximum speed. +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 = The starter drone unit. Spawns in the core by default. Automatically mines ores, collects items and repairs blocks. -unit.phantom.description = An advanced drone unit. Automatically mines ores, collects items and repairs blocks. Significantly more effective than a drone. -unit.dagger.description = A basic ground unit. Useful in swarms. +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. Uses carbide as ammo. Attacks both ground and air targets. -unit.fortress.description = A heavy artillery ground unit. +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.chaos-array.description = -unit.eradicator.description = -unit.wraith.description = A fast, hit-and-run interceptor unit. -unit.ghoul.description = A heavy carpet bomber. Uses blast compound or pyratite as ammo. +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. -unit.lich.description = -unit.reaper.description = block.graphite-press.description = Compresses chunks of coal into pure sheets of graphite. block.multi-press.description = An upgraded version of the graphite press. Employs water and power to process coal quickly and efficiently. -block.silicon-smelter.description = Reduces sand with highly pure coke in order to produce silicon. -block.kiln.description = Smelts sand and lead into metaglass. Requires small amounts of power. +block.silicon-smelter.description = Reduces sand with pure coal. Produces silicon. +block.kiln.description = Smelts sand and lead into the compound known as metaglass. Requires small amounts of power to run. block.plastanium-compressor.description = Produces plastanium from oil and titanium. -block.phase-weaver.description = Produces phase fabric from radioactive thorium and high amounts of sand. -block.alloy-smelter.description = Produces surge alloy from titanium, lead, silicon and copper. -block.cryofluidmixer.description = Combines water and titanium into cryofluid which is much more efficient for cooling. -block.blast-mixer.description = Uses oil for transforming pyratite into the less flammable but more explosive blast compound. +block.phase-weaver.description = Synthesizes phase fabric from radioactive thorium and sand. Requires massive amounts of power to function. +block.alloy-smelter.description = Combines titanium, lead, silicon and copper to produce surge alloy. +block.cryofluidmixer.description = Mixes water and fine titanium powder into cryofluid. Essential for thorium reactor usage. +block.blast-mixer.description = Crushes and mixes clusters of spores with pyratite to produce blast compound. block.pyratite-mixer.description = Mixes coal, lead and sand into highly flammable pyratite. -block.melter.description = Heats up stone to very high temperatures to obtain lava. -block.separator.description = Exposes stone to water pressure in order to obtain various minerals contained in the stone. -block.spore-press.description = Compresses spore pods into oil. -block.pulverizer.description = Crushes stone into sand. Useful when there is a lack of natural sand. +block.melter.description = Melts down scrap into slag for further processing or usage in wave turrets. +block.separator.description = Separates slag into its mineral components. Outputs the cooled result. +block.spore-press.description = Compresses spore pods under extreme pressure to synthesize oil. +block.pulverizer.description = Crushes scrap into fine sand. block.coal-centrifuge.description = Solidifes oil into chunks of coal. -block.incinerator.description = Gets rid of any excess item or liquid. +block.incinerator.description = Vaporizes any excess item or liquid it receives. block.power-void.description = Voids all power inputted into it. Sandbox only. block.power-source.description = Infinitely outputs power. Sandbox only. block.item-source.description = Infinitely outputs items. Sandbox only. -block.item-void.description = Destroys any items which go into it without using power. Sandbox only. +block.item-void.description = Destroys any items. Sandbox only. block.liquid-source.description = Infinitely outputs liquids. Sandbox only. block.copper-wall.description = A cheap defensive block.\nUseful for protecting the core and turrets in the first few waves. block.copper-wall-large.description = A cheap defensive block.\nUseful for protecting the core and turrets in the first few waves.\nSpans multiple tiles. block.titanium-wall.description = A moderately strong defensive block.\nProvides moderate protection from enemies. block.titanium-wall-large.description = A moderately strong defensive block.\nProvides moderate protection from enemies.\nSpans multiple tiles. -block.thorium-wall.description = A strong defensive block.\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. -block.phase-wall-large.description = Not as strong as a thorium wall but will deflect bullets unless they are too powerful.\nSpans multiple tiles. -block.surge-wall.description = The strongest defensive block.\nHas a small chance of triggering lightning towards the attacker. -block.surge-wall-large.description = The strongest defensive block.\nHas a small chance of triggering lightning towards the attacker.\nSpans multiple tiles. -block.door.description = A small door that can be opened and closed by tapping on it.\nIf opened, enemies can shoot and move through. -block.door-large.description = A large door that can be opened and closed by tapping on it.\nIf opened, enemies can shoot and move through.\nSpans multiple tiles. +block.thorium-wall.description = A strong defensive block.\nDecent protection from enemies. +block.thorium-wall-large.description = A strong defensive block.\nDecent protection from enemies.\nSpans multiple tiles. +block.phase-wall.description = A wall coated with special phase-based reflective compound. Deflects most bullets upon impact. +block.phase-wall-large.description = A wall coated with special phase-based reflective compound. Deflects most bullets upon impact.\nSpans multiple tiles. +block.surge-wall.description = An extremely durable defensive block.\nBuilds up charge on bullet contact, releasing it randomly. +block.surge-wall-large.description = An extremely durable defensive block.\nBuilds up charge on bullet contact, releasing it randomly.\nSpans multiple tiles. +block.door.description = A small door. Can be opened or closed by tapping. +block.door-large.description = A large door. Can be opened and closed by tapping.\nSpans multiple tiles. block.mender.description = Periodically repairs blocks in its vicinity. Keeps defenses repaired in-between waves.\nOptionally uses silicon to boost range and efficiency. -block.mend-projector.description = Periodically heals buildings in its vicinity. -block.overdrive-projector.description = Increases the speed of nearby buildings like drills and conveyors. -block.force-projector.description = Creates a hexagonal force field around itself, protecting buildings and units inside from damage through bullets. +block.mend-projector.description = An upgraded version of the Mender. Repairs blocks in its vicinity.\nOptionally uses phase fabric to boost range and efficiency. +block.overdrive-projector.description = Increases the speed of nearby buildings.\nOptionally uses phase fabric to boost range and efficiency. +block.force-projector.description = Creates a hexagonal force field around itself, protecting buildings and units inside from damage.\nOverheats if too much damage is sustained. Optionally uses coolant to prevent overheating. Phase fabric can be used to increase shield size. block.shock-mine.description = Damages enemies stepping on the mine. Nearly invisible to the enemy. -block.conveyor.description = Basic item transport block. Moved items forward and automatically deposits them into turrets or crafters. Rotatable. +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 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. -block.mass-driver.description = Ultimate item transport block. Collects several items and then shoots them to another mass driver over a long range. +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 which doubles up speed by using power. -block.thermal-pump.description = The ultimate pump. Three times as fast as a mechanical pump and the only pump which is able to retrieve lava. -block.conduit.description = Basic liquid transport block. Works like a conveyor, but with liquids. Best used with extractors, pumps or other conduits. -block.pulse-conduit.description = Advanced liquid transport block. Transports liquids faster and stores more than standard conduits. +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 it for creating buffers when there is a non-constant demand of materials or as a safeguard for cooling vital blocks. +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. Up to four power sources, sinks or nodes can be connected. The node will receive power from or supply power to any adjacent blocks. -block.power-node-large.description = Has a larger radius than the power node and connects to up to six power sources, sinks or nodes. +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 whenever there is an abundance and provides power whenever there is a shortage, as long as there is capacity left. +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 oil or flammable materials. -block.thermal-generator.description = Generates a large amount of power from lava. -block.turbine-generator.description = More efficient than a combustion generator, but requires additional water. +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 radioisotope thermoelectric generator which does not require cooling but provides less power than a thorium reactor. +block.rtg-generator.description = A simple, reliable generator. Uses the heat of decaying radioactive compounds to produce energy at a slow rate. block.solar-panel.description = Provides a small amount of power from the sun. -block.solar-panel-large.description = Provides much better power supply than a standard solar panel, but is also much more expensive to build. -block.thorium-reactor.description = Generates huge amounts of power from highly radioactive thorium. Requires constant cooling. Will explode violently if insufficient amounts of coolant are supplied. +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. -block.pneumatic-drill.description = An improved drill which is faster and able to process harder materials by making use of air pressure. -block.laser-drill.description = Allows drilling even faster through laser technology, but requires power. Additionally, radioactive thorium can be retrieved with this drill. +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 water from the ground. Use it when there is no lake nearby. -block.cultivator.description = Cultivates the soil with water in order to obtain biomatter. -block.oil-extractor.description = Uses large amounts of power in order to extract oil from sand. Use it when there is no direct source of oil nearby. +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. Use it for creating buffers when there is a non-constant demand of materials. An[LIGHT_GRAY] unloader[] can be used to retrieve items from the vault. -block.container.description = Stores a small amount of items. Use it for creating buffers when there is a non-constant demand of materials. An[LIGHT_GRAY] unloader[] 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 on the unloader. -block.launch-pad.description = Launches batches of items without any need for a core launch. Unfinished. +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. -block.scatter.description = A medium-sized anti-air turret. Sprays clumps of lead or scrap flak at enemy units. +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 artillery turret. -block.wave.description = A medium-sized rapid-fire turret which shoots liquid bubbles. -block.lancer.description = A medium-sized turret which shoots charged electricity beams. -block.arc.description = A small turret which shoots electricity in a random arc towards the enemy. -block.swarmer.description = A medium-sized turret which shoots burst missiles. -block.salvo.description = A medium-sized turret which fires shots in salvos. -block.fuse.description = A large turret which shoots powerful short-range beams. -block.ripple.description = A large artillery turret which fires several shots simultaneously. -block.cyclone.description = A large rapid fire turret. -block.spectre.description = A large turret which shoots two powerful bullets at once. -block.meltdown.description = A large turret which shoots powerful long-range beams. +block.hail.description = A small, long-range artillery turret. +block.wave.description = A medium-sized turret. Shoots streams of liquid at enemies. Automatically extinguishes fires when supplied with water. +block.lancer.description = A medium-sized anti-ground laser turret. Charges and fires powerful beams of energy. +block.arc.description = A small close-range electric turret. Fires arcs of electricity at enemies. +block.swarmer.description = A medium-sized missile turret. Attacks both air and ground enemies. Fires homing missiles. +block.salvo.description = A larger, more advanced version of the Duo turret. Fires quick salvos of bullets at the enemy. +block.fuse.description = A large, close-range energy turret. Fires three piercing beams at nearby enemies. +block.ripple.description = An extremely powerful artillery turret. Shoots clusters of shells at enemies over long distances. +block.cyclone.description = A large anti-air and anti-ground turret. Fires explosive clumps of flak at nearby units. +block.spectre.description = A massive dual-barreled cannon. Shoots large armor-piercing bullets at air and ground targets. +block.meltdown.description = A massive laser cannon. Charges and fires a persistent laser beam at nearby enemies. Requires coolant to operate. block.draug-factory.description = Produces Draug mining drones. -block.spirit-factory.description = Produces light drones which mine ore and repair blocks. -block.phantom-factory.description = Produces advanced drone units which are significantly more effective than a spirit drone. +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 laser ground units. +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 = Leave your current vessel and change into a fast, lightly-armored mech made for hit-and-run attacks.\nUse the pad by double tapping while standing on it. -block.tau-mech-pad.description = Leave your current vessel and change into a support mech which can heal friendly buildings and units.\nUse the pad by double tapping while standing on it. -block.omega-mech-pad.description = Leave your current vessel and change into a bulky and well-armored mech, made for front-line assaults.\nUse the pad by double tapping while standing on it. -block.javelin-ship-pad.description = Leave your current vessel and change into a strong and fast interceptor with lightning weapons.\nUse the pad by double tapping while standing on it. -block.trident-ship-pad.description = Leave your current vessel and change into a reasonably well armored heavy bomber.\nUse the pad by double tapping while standing on it. -block.glaive-ship-pad.description = Leave your current vessel and change into a large, well-armored gunship.\nUse the pad by double 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. diff --git a/core/assets/bundles/bundle_uk_UA.properties b/core/assets/bundles/bundle_uk_UA.properties index 45d2069fe5..5c1c6ebcf6 100644 --- a/core/assets/bundles/bundle_uk_UA.properties +++ b/core/assets/bundles/bundle_uk_UA.properties @@ -33,7 +33,6 @@ level.mode = Режим гри: showagain = Не показувати знову до наступного сеансу coreattack = < Ядро знаходиться під атакою! > nearpoint = [[ [scarlet]ЗАЛИШТЕ ЦЮ ЗОНУ НЕГАЙНО[] ]\nАннігіляція неминуча. -outofbounds = [ ПОЗА МЕЖАМИ ]\nСаморуйнування через{0} database = База даних ядра savegame = Зберегти гру loadgame = Завантажити гру @@ -44,8 +43,8 @@ newgame = Нова гра none = <нічого> minimap = Міні-мапа close = Закрити -quit = Вихід website = Веб-сайт +quit = Вихід maps = Мапи continue = Продовжити maps.none = [LIGHT_GRAY]Мап не знайдено! @@ -73,6 +72,7 @@ server.kicked.nameEmpty = Ваше ім’я має містити принай server.kicked.idInUse = Ви вже на цьому сервері! Підключення двох облікових записів не допускається. server.kicked.customClient = Цей сервер не підтримує користувальницькі збірки. Завантажте офіційну версію. server.kicked.gameover = Гра завершена! +server.versions = Your version:[accent] {0}[]\nServer version:[accent] {1}[] host.info = Кнопка [accent]Сервер[] розміщує сервер на порті [scarlet]6567[]. \nКористувачі, які знаходяться у тій же [LIGHT_GRAY]WiFi або локальній мережі[] повинні бачити ваш сервер у своєму списку серверів.\n\nЯкщо ви хочете, щоб люди могли приєднуватися з будь-якої точки через IP, то [accent] переадресація порту [] обов’язкова.\n\n[LIGHT_GRAY] Примітка. Якщо у вас виникли проблеми з підключенням до вашої локальної гри, переконайтеся, що ви дозволили Mindustry доступ до вашої локальної мережі в налаштуваннях брандмауера. Зауважте, що публічні мережі іноді не дозволяють виявити сервер. join.info = Тут Ви можете ввести [accent]IP серверу[] для підключення або знайти сервери у [accent]локальній мережі[] для підключення до них.\nПідтримується локальна мережа(LAN) і широкосмугова мережа(WAN).\n\n[LIGHT_GRAY] Примітка. Тут немає автоматичного глобального списку серверів; якщо ви хочете підключитися до когось через IP, вам доведеться попросити створювача серверу дати свій ip. hostserver = Запустити багатокористувальницький сервер @@ -360,13 +360,14 @@ 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\Зважтесь створити енергію. Побудуйте генератори внутрішнього згорання. Навчіться користуватися регенераторами. +zone.frozenForest.description = Навіть тут, ближче до гір, спори поширилися. Холодна температура не може їх утримувати тут завжди.\nЗважтесь створити енергію. Побудуйте генератори внутрішнього згорання. Навчіться користуватися регенераторами. zone.desertWastes.description = Ці відходи є величезними, непередбачуваними і перетинаються з занедбаними секторальними структурами.\nВугілля присутнє в регіоні. Спаліть його для енергії або синтезуйте у графіт.\n\n[lightgray]Це місце посадки не можна гарантувати. zone.saltFlats.description = На околиці пустелі лежать соляні рівнини. У цьому місці можна знайти небагато ресурсів.\n\nТут вороги спорудили комплекс сховищ ресурсів. Викорініть їх ядро. Не залишайте нічого цінного. zone.craters.description = У цьому кратері накопичилася вода, пережиток старих воєн. Відновіть місцевість. Зберіть пісок. Виплавіть метакскло. Накачайте воду, щоб охолодити турелі і бури. zone.ruinousShores.description = Минулі відходи - це берегова лінія. Колись у цьому місці розташувався береговий оборонний масив. Залишилося не так багато чого. Тільки найосновніші оборонні споруди залишилися непошкодженими, все інше зводиться до брухту.\nПродовжуйте експансію назовні. Повторно розкрийте технологію. -zone.stainedMountains.description =Далі у вглиб материка лежать гори, ще не заражені спорами.\nВидобудьте надлишковий титан у цій місцевості. Дізнайтеся, як використовувати його.\n\nТут ворожа присутність більша. Не дайте їм часу відправити свої найсильніші одиниці. +zone.stainedMountains.description = Далі у вглиб материка лежать гори, ще не заражені спорами.\nВидобудьте надлишковий титан у цій місцевості. Дізнайтеся, як використовувати його.\n\nТут ворожа присутність більша. Не дайте їм часу відправити свої найсильніші одиниці. zone.overgrowth.description = Ця територія заросла, ближче до джерела спор.\nВорог тут встановив форпост. Побудуйте бойові одиниці Кинджал. Знищте його. Поверніть те, що було втрачено. zone.tarFields.description = Окраїна зони видобутку нафти, між горами та пустелею. Один з небагатьох районів із корисними запасами смоли.\nНезважаючи на те, що покинута, ця територія має поблизу небезпечні сили противника. Не варто їх недооцінювати.\n\n[lightgray]Якщо можливо, дослідіть технологію переробки нафти. zone.desolateRift.description = Надзвичайно небезпечна зона. Багато ресурсів, але мало місця. Евакуюватися потрібно якомога швидше. Не розслабляйтеся між ворожими атаками. @@ -418,7 +419,6 @@ blocks.speedincrease = Збільшення швидкості blocks.range = Радіус дії blocks.drilltier = Видобуває blocks.drillspeed = Базова швидкість буріння -blocks.drilltierreq = Потребується кращий бур blocks.boosteffect = Прискорювальний ефект blocks.maxunits = Максимальна кількість активних одиниць blocks.health = Здоров’я @@ -646,9 +646,8 @@ mech.buildspeed = [LIGHT_GRAY]Швидкість будування: {0}% liquid.heatcapacity = [LIGHT_GRAY]Теплоємність: {0} liquid.viscosity = [LIGHT_GRAY]В’язкість: {0} liquid.temperature = [LIGHT_GRAY]Температура: {0} -block.sand-boulder.name = Sand Boulder -block.grass.name = Трава block.sand-boulder.name = Пісочний валун +block.grass.name = Трава block.salt.name = Сіль block.saltrocks.name = Сіляні камні block.pebbles.name = Галька @@ -839,6 +838,7 @@ team.derelict.name = Залишена team.green.name = Зелена team.purple.name = Фіолетова unit.spirit.name = Ремонтувальний дрон «Привид» +unit.draug.name = Draug Miner Drone unit.phantom.name = Будівельний дрон «Фантом» unit.dagger.name = Кинджал unit.crawler.name = Камікадзе @@ -961,7 +961,7 @@ block.overflow-gate.description = Комбінований розгалужув block.mass-driver.description = Кінцевий елемент транспортного блоку. Збирає кілька предметів, а потім вистрілює їх до іншої електромагнитної катапульти на великій відстані. Для роботи потрібна енергія. block.mechanical-pump.description = Недорогий насос з повільним виходом, але без енергоспоживання. block.rotary-pump.description = Удосконалений насос. Насоси більше викачують, але потребують енергію. -block.thermal-pump.description = Кінцевий насос. +block.thermal-pump.description = Найкращий насос. block.conduit.description = Основний блок транспортування рідини. Пересуває рідини вперед. Застосовується спільно з насосами та іншими трубопроводами. block.pulse-conduit.description = Вдосконалений блок транспортування рідини. Транспортує рідини швидше і зберігає більше, ніж стандартні трубопроводи. block.liquid-router.description = Приймає рідини з одного напрямку та виводить їх до трьох інших напрямків порівну. Також можна зберігати певну кількість рідини. Корисно для розщеплення рідин від одного джерела до кількох мішеней. @@ -971,7 +971,7 @@ block.bridge-conduit.description = Розширений блок транспо 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 = Виробляє енергію, спалюючи легкозаймисті матеріали, такі як вугілля. @@ -995,7 +995,7 @@ block.core-foundation.description = Друга версія ядра. Краще block.core-nucleus.description = Третя і остання ітерація капсули ядра. Надзвичайно добре броньований. Зберігає величезні обсяги ресурсів. block.vault.description = Зберігає велику кількість предметів кожного типу. Блок розвантажувача може використовуватися для отримання предметів із сховища. block.container.description = Зберігає велику кількість предметів кожного типу. Блок розвантажувача може використовуватися для отримання предметів із сховища. -block.unloader.description =Вивантажує предмети з контейнера, склепіння або серцевини на конвеєр або безпосередньо в сусідній блок. Тип предмета для завантаження можна змінити, натиснувши на блок. +block.unloader.description = Вивантажує предмети з контейнера, склепіння або серцевини на конвеєр або безпосередньо в сусідній блок. Тип предмета для завантаження можна змінити, натиснувши на блок. block.launch-pad.description = Запускає партії предметів без необхідності запуску ядра. block.launch-pad-large.description = Покращена версія стартового майданчика. Зберігає більше предметів. Запускається частіше. block.duo.description = Невелика дешева башта. Корисна проти наземних одиниць. diff --git a/core/assets/bundles/bundle_zh_CN.properties b/core/assets/bundles/bundle_zh_CN.properties index 4974494ce2..d60a33a198 100644 --- a/core/assets/bundles/bundle_zh_CN.properties +++ b/core/assets/bundles/bundle_zh_CN.properties @@ -16,7 +16,6 @@ screenshot.invalid = 地图太大,可能没有足够的内存用于截图。 gameover = 你的核心被摧毁了! gameover.pvp = [accent] {0}[] 队获胜! highscore = [accent]新纪录! - stat.wave = 战胜的波数:[accent]{0} stat.enemiesDestroyed = 消灭的敌人:[accent]{0} stat.built = 建造的建筑:[accent]{0} @@ -24,10 +23,8 @@ stat.destroyed = 摧毁的建筑:[accent]{0} stat.deconstructed = 拆除的建筑:[accent]{0} stat.delivered = 发射的资源: stat.rank = 最终等级:[accent]{0} - placeline = 你选择了一个方块。\n你可以[accent]长按几秒钟[]并向一个方向拖动来[accent]直线放置方块[]。\n试试看吧。 removearea = 你选择了拆除模式。\n你可以[accent]长按几秒钟[]并拖动来[accent]删除矩形内的方块[]。\n试试看吧。 - launcheditems = [accent]发射的资源 map.delete = 确定要删除 "[accent]{0}[]" 地图吗? level.highscore = 最高分:[accent]{0} @@ -46,6 +43,7 @@ newgame = 新游戏 none = <无> minimap = 小地图 close = 关闭 +website = Website quit = 退出 maps = 地图 continue = 继续 @@ -74,6 +72,7 @@ server.kicked.nameEmpty = 无效的名字! server.kicked.idInUse = 你已在这个服务器上!不允许用两个账号连接。 server.kicked.customClient = 这个服务器不支持定制版本。下载官方版本。 server.kicked.gameover = 游戏结束! +server.versions = Your version:[accent] {0}[]\nServer version:[accent] {1}[] host.info = [accent]创建局域网游戏[]按钮会在[scarlet]6567[]端口运行一个服务器。[]\n任何在同一个[LIGHT_GRAY]wifi或本地网络[]下的人都应该可以在服务器列表中看到你的服务器。\n\n如果你想让别人在任何地方都能通过IP地址连接,你需要设定[accent]端口转发[]。\n\n[LIGHT_GRAY]注意:如果某人无法连接到你的局域网游戏,请确保你在防火墙设置里允许了Mindustry访问本地网络。 join.info = 此时,可以输入[accent]服务器的IP地址[]来连接,或寻找[accent]本地网络[]中的服务器来连接。\n局域网或广域网多人游戏都被支持。\n\n[LIGHT_GRAY]注意:没有全球服务器列表;如果你想通过IP地址连接某个服务器,你需要向房主询问IP地址。 hostserver = 创建服务器 @@ -157,7 +156,10 @@ cancel = 取消 openlink = 打开链接 copylink = 复制链接 back = 返回 +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 = 确定退出? +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]加载中…… saving = [accent]保存中…… wave = [accent]波次 {0} @@ -172,7 +174,7 @@ saveimage = 保存图片 unknown = 未知 custom = 自定义 builtin = 内建的 -map.delete.confirm = 你确定你想要删除这张地图吗?这个操作无法取消! +map.delete.confirm = 你确定你想要删除这张地图吗?这个操作无法撤销! map.random = [accent]随机地图 map.nospawn = 这个地图没有核心!请在编辑器中添加一个[ROYAL]蓝色[]的核心。 map.nospawn.pvp = 这个地图没有敌人的核心!请在编辑器中添加一个[ROYAL]红色[]的核心。 @@ -248,7 +250,6 @@ editor.mapname = 地图名称: editor.overwrite = [accent]警告!\n这将会覆盖一个已经存在的地图。 editor.overwrite.confirm = [scarlet]警告![]存在同名地图。你确定你想要覆盖? editor.selectmap = 选择一个地图加载: - toolmode.replace = 替换 toolmode.replace.description = 仅在实心块上绘制。 toolmode.replaceall = 全部替换 @@ -263,11 +264,11 @@ toolmode.fillteams = 填充团队 toolmode.fillteams.description = 填充团队而不是方块。 toolmode.drawteams = 绘制团队 toolmode.drawteams.description = 绘制团队而不是方块。 - filters.empty = [LIGHT_GRAY]没有筛选器!用下方的按钮添加一个。 filter.distort = Distort filter.noise = Noise filter.median = Median +filter.oremedian = Ore Median filter.blend = Blend filter.defaultores = Default Ores filter.ore = Ore @@ -294,13 +295,12 @@ filter.option.floor2 = Secondary Floor filter.option.threshold2 = Secondary Threshold filter.option.radius = Radius filter.option.percentile = Percentile - width = 宽度: height = 高度: menu = 菜单 play = 开始游戏 -load = 载入游戏 campaign = 战役模式 +load = 载入游戏 save = 保存 fps = FPS:{0} tps = TPS:{0} @@ -308,10 +308,10 @@ ping = 延迟:{0}毫秒 language.restart = 为了使语言设置生效请重启游戏。 settings = 设置 tutorial = 教程 +tutorial.retake = Re-Take Tutorial editor = 编辑器 mapeditor = 地图编辑器 donate = 打赏 - abandon = 放弃 abandon.text = 这个区域和它的所有资源会被敌人重置。 locked = 已被锁定 @@ -322,8 +322,9 @@ bestwave = [LIGHT_GRAY]最高波次:{0} launch = < 发射 > launch.title = 发射成功 launch.next = [LIGHT_GRAY]下一个发射机会在第 {0} 波 -launch.unable = [scarlet]发射失败。[]敌人未被全部消灭。 +launch.unable2 = [scarlet]Unable to LAUNCH.[] launch.confirm = 您将发射核心中所有资源。\n此地图将被重置。 +launch.skip.confirm = If you skip now, you will not be able to launch until later waves. uncover = 解锁 configure = 设定发射资源数量 configure.locked = [LIGHT_GRAY]到达第 {0} 波\n才设定发射资源。 @@ -336,7 +337,6 @@ zone.objective.survival = 生存 zone.objective.attack = 摧毁敌方核心 add = 添加…… boss.health = BOSS 生命值 - connectfail = [crimson]服务器连接失败:[accent]{0} error.unreachable = 服务器无法访问。 error.invalidaddress = 地址无效。 @@ -347,21 +347,20 @@ error.mapnotfound = 找不到地图文件! error.io = 网络 I/O 错误。 error.any = 未知网络错误。 error.bloom = 未能初始化特效。\n您的设备可能不支持它。 - zone.groundZero.name = 零号地区 -zone.desertWastes.name = 沙漠废物 +zone.desertWastes.name = 荒芜沙漠 zone.craters.name = 陨石带 zone.frozenForest.name = 冰冻森林 -zone.ruinousShores.name = 毁灭海岸 +zone.ruinousShores.name = 遗迹海岸 zone.stainedMountains.name = 绵延群山 zone.desolateRift.name = 荒芜裂谷 -zone.nuclearComplex.name = 核裂变 +zone.nuclearComplex.name = 核裂阵 zone.overgrowth.name = 增生区 zone.tarFields.name = 石油田 zone.saltFlats.name = 盐碱荒滩 zone.impact0078.name = 0078号冲击 zone.crags.name = 悬崖 - +zone.fungalPass.name = Fungal Pass zone.groundZero.description = 重新开始的最佳位置。敌人威胁很小,资源少。\n尽可能收集多的铅和铜。\n行动。 zone.frozenForest.description = 即使在这里,靠近山脉的地方,孢子也已经扩散。寒冷的温度不可能永远容纳它们。\n\n此行动须投入电力。建造燃烧发电机并学会使用修理者。 zone.desertWastes.description = 这些废物是巨大的,不可预测的,并且与废弃的结构交错在一起。燃烧它以获取动力或合成石墨。\n\n[lightgray]无法保证此着陆位置。 @@ -373,9 +372,9 @@ zone.overgrowth.description = 这个地区生长过度,靠近孢子的来源 zone.tarFields.description = 位于山脉和沙漠之间的产油区的郊区是少数几个有可用焦油储量的地区之一。\n尽管被废弃,但附近仍有一些危险的敌军。不要低估它们。\n\n[lightgray]如果可能,研究石油加工技术。 zone.desolateRift.description = 非常危险的区域。资源丰富但空间小。破坏风险高。尽快离开,不要被敌人的攻击间隔太长所愚弄。 zone.nuclearComplex.description = 以前生产和加工钍的设施已变成废墟。\n[浅灰色]研究钍及其多种用途。\n\n敌人在这里大量存在,不断侦察入侵者。 +zone.fungalPass.description = A transition area between high mountains and lower, spore-ridden lands. A small enemy reconnaissance base is located here.\nDestroy it.\nUse Dagger and Crawler units. Take out the two cores. zone.impact0078.description = <在此处插入说明> zone.crags.description = <在此处插入说明> - settings.language = 语言 settings.reset = 恢复默认 settings.rebind = 重新绑定 @@ -428,7 +427,7 @@ blocks.inaccuracy = 误差 blocks.shots = 发射数 blocks.reload = 重新装弹 blocks.ammo = 子弹 - +bar.drilltierreq = Better Drill Required bar.drillspeed = 挖掘速度:{0}/s bar.efficiency = 效率:{0}% bar.powerbalance = 能量:{0} @@ -440,7 +439,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] 燃烧 @@ -452,7 +450,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 = 液体单位/秒 @@ -498,13 +495,14 @@ setting.sensitivity.name = 控制器灵敏度 setting.saveinterval.name = 自动保存间隔 setting.seconds = {0} 秒 setting.fullscreen.name = 全屏 -setting.borderlesswindow.name = 全屏化[LIGHT_GRAY] (可能需要重启) +setting.borderlesswindow.name = 无边框窗口[LIGHT_GRAY] (可能需要重启) setting.fps.name = 显示 FPS -setting.vsync.name = 帧同步 +setting.vsync.name = 垂直同步 setting.lasers.name = 显示能量射线 setting.pixelate.name = 像素画面 [LIGHT_GRAY](可能会降低性能) setting.minimap.name = 显示小地图 setting.musicvol.name = 音乐音量 +setting.ambientvol.name = Ambient Volume setting.mutemusic.name = 静音 setting.sfxvol.name = 音效音量 setting.mutesound.name = 静音 @@ -561,7 +559,6 @@ mode.pvp.description = 和本地玩家对战。 mode.attack.name = 攻击 mode.attack.description = 没有波数,但是有摧毁敌人基地的任务。 mode.custom = 自定义模式 - rules.infiniteresources = 无限资源 rules.wavetimer = 波次计时器 rules.waves = 波次 @@ -588,7 +585,6 @@ rules.title.resourcesbuilding = 资源和建造 rules.title.player = 玩家 rules.title.enemy = 敌人 rules.title.unit = 单位 - content.item.name = 物品 content.liquid.name = 液体 content.unit.name = 部队 @@ -650,7 +646,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 = 盐碱地 @@ -736,7 +731,7 @@ block.duo.name = 双管炮 block.scorch.name = 火焰炮 block.scatter.name = 分裂炮 block.hail.name = 冰雹炮 -block.lancer.name = 蓝瑟炮 +block.lancer.name = 激光矛 block.conveyor.name = 传送带 block.titanium-conveyor.name = 钛传送带 block.junction.name = 连接点 @@ -825,7 +820,7 @@ block.surge-wall.name = 波动墙 block.surge-wall-large.name = 大型波动墙 block.cyclone.name = 气旋炮 block.fuse.name = 融合炮 -block.shock-mine.name = 休克地雷 +block.shock-mine.name = 脉冲地雷 block.overdrive-projector.name = 超速投影器 block.force-projector.name = 力墙投影器 block.arc.name = 电弧 @@ -836,13 +831,14 @@ block.container.name = 容器 block.launch-pad.name = 发射台 block.launch-pad-large.name = 大型发射台 team.blue.name = 蓝 -team.red.name = 红 +team.crux.name = red +team.sharded.name = orange team.orange.name = 橙 -team.none.name = 灰 +team.derelict.name = derelict team.green.name = 绿 team.purple.name = 紫 -unit.draug.name = 德鲁格采矿机 unit.spirit.name = 幽灵修理机 +unit.draug.name = 德鲁格采矿机 unit.phantom.name = 鬼怪建造机 unit.dagger.name = 尖刀 unit.crawler.name = 爬行者 @@ -856,28 +852,26 @@ unit.chaos-array.name = 混沌者 unit.eradicator.name = 根除者 unit.lich.name = 尸鬼 unit.reaper.name = 死神 -tutorial.begin = 你的任务是消灭[LIGHT_GRAY] 敌人 [].\n\n首先开始[accent] 采集铜矿 []。点击核心附近的铜矿开始。 +tutorial.next = [lightgray] +tutorial.intro = You have entered the[scarlet] Mindustry Tutorial.[]\nBegin by[accent] mining copper[]. Tap a copper ore vein near your core to do this.\n\n[accent]{0}/{1} copper tutorial.drill = 手动采矿效率低.\n[accent] 钻头 []可以自动采矿.\n放一个在铜矿上吧. +tutorial.drill.mobile = Mining manually is inefficient.\n[accent]Drills []can mine automatically.\nTap the drill tab in the bottom right.\nSelect the[accent] mechanical drill[].\nPlace it on a copper vein by tapping, then press the[accent] checkmark[] below to confirm your selection.\nPress the[accent] X button[] to cancel placement. +tutorial.blockinfo = Each block has different stats. Each drill can only mine certain ores.\nTo check a block's info and stats,[accent] tap the "?" button while selecting it in the build menu.[]\n\n[accent]Access the Mechanical Drill's stats now.[] tutorial.conveyor = [accent]传送带[] 可以把物资传送到核心.\n请造一个传送线,从钻头到核心. -tutorial.morecopper = 需要更多的铜.\n\n手动采矿或者放更多的钻头吧. +tutorial.conveyor.mobile = [accent]Conveyors[] are used to transport items to the core.\nMake a line of conveyors from the drill to the core.\n[accent] Place in a line by holding down your finger for a few seconds[] and dragging in a direction.\n\n[accent]{0}/{1} conveyors placed in line\n[accent]0/1 items delivered tutorial.turret = 必须建造防御建筑来击退[LIGHT_GRAY] 敌人[].\n请在你核心附近造一个双人炮塔. tutorial.drillturret = 双人炮塔需要[accent] 铜质弹药 []来射击.\n可以放一个钻头在炮塔附近供应铜. +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 = [LIGHT_GRAY]敌人[] 来了.\n\n保护基地,防御2波攻击. 造更多的炮塔. -tutorial.lead = 有更多的矿可用. 探索和采集[accent] 铅[].\n\n按住你的采矿单位拖放到核心来传送资源. -tutorial.smelter = 铜和铅是弱金属.\n超级[accent] 致密合金[] 可以从冶炼厂生产.\n\n造一个吧. -tutorial.densealloy = 冶炼厂将生产合金.\n生产一些.\n有必要可以改进一下生产. -tutorial.siliconsmelter = 基地现在将制作一个[accent] 无人机[] 来采矿和维修方块.\n\n其他单位的工程可以用[accent] 硅 []来建造.\n造一个硅冶炼厂. -tutorial.silicondrill = 硅需要[accent] 煤[] 和[accent] 沙[].\n开始制作钻头吧. -tutorial.generator = 这项技术需要能源.\n造一个[accent] 燃烧发电机[] 来发电. -tutorial.generatordrill = 燃烧发电机需要燃料.\n用钻头采集煤来供给燃料. -tutorial.node = 能源需要传输.\n造一个[accent] 能量节点[] 靠近火力发电机来传输它的能源. -tutorial.nodelink = 使耗能方块紧靠发电机或者用能源节点连接来传输电力.\n\n点击能源节点并选择发电机和硅冶炼厂来链接能源. -tutorial.silicon = 正在生产硅. 多生产点.\n\n建议优化一下生产系统. -tutorial.daggerfactory = 建造一个[accent] 尖刀机甲工厂.[]\n\n它可以用来生产机甲 -tutorial.router = 工厂需要资源来运作.\n造一个路由器来分发传送资源. -tutorial.dagger = 链接能源节点到工厂.\n一旦需求满足, 将会制作一个机甲.\n\n根据需要制作更多的钻头,发电机,传送带. -tutorial.battle = [LIGHT_GRAY] 敌人[] 的核心已经暴露。\n用你的尖刀机甲摧毁它。 - +tutorial.waves.mobile = The[lightgray] enemy[] approaches.\n\nDefend the core for 2 waves. Your ship will automatically fire at enemies.\nBuild more turrets and drills. Mine more copper. +tutorial.launch = Once you reach a specific wave, you are able to[accent] launch the core[], leaving your defenses behind and[accent] obtaining all the resources in your core.[]\nThese resources can then be used to research new technology.\n\n[accent]Press the launch button. item.copper.description = 一种有用的结构材料。在各种类型的方块中广泛使用。 item.lead.description = 一种基本的起始材料。被广泛用于电子设备和液体运输方块。 item.metaglass.description = 一种超级强硬的复合玻璃。通常用来传送和收藏液体。 @@ -914,13 +908,9 @@ unit.crawler.description = 一种地面装置,由一个框架和绑在上面 unit.titan.description = 一种先进的装甲地面部队。攻击地面和空中目标。配备两个微型灼烧级火焰喷射器。 unit.fortress.description = 一种重型炮兵机甲。装备两门改进型冰雹炮,用于对敌军建筑物和部队进行远程攻击。 unit.eruptor.description = 一种用来拆除建筑物的重型机甲。在敌人的防御工事上发射一股熔渣,将它们熔化并点燃挥发物。 -unit.chaos-array.description = -unit.eradicator.description = unit.wraith.description = 一种快速、一击即退的拦截器机甲。目标是发电机。 unit.ghoul.description = 一种地毯式轰炸机。通过敌人的结构进行攻击,并瞄准关键的基础设施。 unit.revenant.description = 一种发射导弹的重型飞行机甲 -unit.lich.description = -unit.reaper.description = block.graphite-press.description = 把大块的煤压缩成纯石墨片。 block.multi-press.description = 石墨压缩机的升级版。利用水和电力快速高效地处理煤炭。 block.silicon-smelter.description = 用高纯度的焦炭来加工沙子以生产硅。 @@ -928,20 +918,20 @@ block.kiln.description = 将铅和沙子熔炼成钢化玻璃,需要少量电 block.plastanium-compressor.description = 用石油和钛生产塑钢。 block.phase-weaver.description = 用放射性钍和大量沙子生产相织物。 block.alloy-smelter.description = 用钛,铅,硅和铜生产浪涌合金。 -block.pulverizer.description = 将废料压碎成沙子。当缺少天然沙子时很有用。 -block.pyratite-mixer.description = 用煤,铅和沙子混合成高度易燃的硫。 -block.blast-mixer.description = 用油将硫转化为不易燃但更具爆炸性的爆炸化合物。 block.cryofluidmixer.description = 水和钛结合到低温流体中,冷却效率更高。 +block.blast-mixer.description = 用油将硫转化为不易燃但更具爆炸性的爆炸化合物。 +block.pyratite-mixer.description = 用煤,铅和沙子混合成高度易燃的硫。 block.melter.description = 将废料熔化成矿渣,以便进一步加工或用于炮塔子弹。 -block.incinerator.description = 用于除掉任何多余的物品或液体。 -block.spore-press.description = 压缩孢子荚得到石油。 block.separator.description = 从矿渣中提取有用的矿物。 +block.spore-press.description = 压缩孢子荚得到石油。 +block.pulverizer.description = 将废料压碎成沙子。当缺少天然沙子时很有用。 block.coal-centrifuge.description = 使石油凝固成煤块。 -block.item-source.description = 无限输出物品。仅限沙盒。 -block.liquid-source.description = 无限输出液体。仅限沙盒。 -block.item-void.description = 在不使用电源的情况下销毁任何进入它的物品。仅限沙盒。 -block.power-source.description = 无限输出功率。仅限沙盒。 +block.incinerator.description = 用于除掉任何多余的物品或液体。 block.power-void.description = 消耗输入的所有功率。仅限沙盒。 +block.power-source.description = 无限输出功率。仅限沙盒。 +block.item-source.description = 无限输出物品。仅限沙盒。 +block.item-void.description = 在不使用电源的情况下销毁任何进入它的物品。仅限沙盒。 +block.liquid-source.description = 无限输出液体。仅限沙盒。 block.copper-wall.description = 廉价的防守区块。\n用于保护前几波中的核心和炮塔。 block.copper-wall-large.description = 廉价的防御块。\n用于保护前几个波浪中的核心和炮塔。\n跨越多个区块。 block.titanium-wall.description = 中等强度的防御挡块。\n提供中等强度的防御以抵御敌人。 @@ -955,30 +945,30 @@ block.surge-wall-large.description = 强大的防御区块。\n有很小的机 block.door.description = 一扇小门,可以通过点击打开和关闭。\n如果打开,敌人可以射击并穿过。 block.door-large.description = 一扇大门,可以通过点击打开和关闭。\n如果打开,敌人可以射击并穿过。\n跨越多个区块。 block.mender.description = 定期修理附近的方块,使防御系统在波与波之间得到修复。\n通常使用硅来提高范围和效率。 -block.mend-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 = 高级传送带。能比初级传送带更快地移动物品。 -block.router.description = 从一个方向接受物品,并将它们平均输出到最多3个其他方向。用于将材料从一个源分割为多个目标。 -block.distributor.description = 一个高级路由器,可以将物品分成最多7个方向。 +block.junction.description = 两条交叉传送带的桥梁。适用于两条不同传送带将不同材料运送到不同位置的情况。 block.bridge-conveyor.description = 高级项目传输块。允许在跨越任何地形或建筑物上运输物品,最多跨越3个块。 block.phase-conveyor.description = 高级传送带。使用电力将物品传送到距离几个块的相位传送带上。 block.sorter.description = 对物品进行分类。如果物品与所选种类,则允许其通过。否则,物品将从左边和右边输出。 +block.router.description = 从一个方向接受物品,并将它们平均输出到最多3个其他方向。用于将材料从一个源分割为多个目标。 +block.distributor.description = 一个高级路由器,可以将物品分成最多7个方向。 block.overflow-gate.description = 分离器和路由器的组合,如果前面被挡住,则向从左和右输出。 -block.junction.description = 两条交叉传送带的桥梁。适用于两条不同传送带将不同材料运送到不同位置的情况。 block.mass-driver.description = 终极传送带。收集几件物品,然后将它们射向长距离外的另一个批量传送带。 +block.mechanical-pump.description = 一种输出速度慢但没有功耗的廉价泵。 +block.rotary-pump.description = 一种先进的泵,通过使用动力使速度加倍。 +block.thermal-pump.description = 终级水泵。 block.conduit.description = 基本液体传输块。像输送机一样工作,但用于液体。最适用于提取器,泵或其他导管。 block.pulse-conduit.description = 高级液体传输块。比标准导管更快地输送液体并储存更多液体。 -block.phase-conduit.description = 高级液体传输块。使用电力将液体传送到多个块上的连接相管道。 block.liquid-router.description = 接受来自一个方向的液体并将它们平均输出到最多3个其他方向。也可以储存一定量的液体。用于将液体从一个源分成多个目标。 block.liquid-tank.description = 存储大量液体。当存在对材料的非恒定需求或作为冷却重要块的安全措施时,将其用于创建缓冲区。 block.liquid-junction.description = 作为两个交叉管道的桥梁。适用于两种不同导管将不同液体输送到不同位置的情况。 block.bridge-conduit.description = 高级液体传输块。允许在任何地形或建筑物的最多3个块上运输液体。 -block.mechanical-pump.description = 一种输出速度慢但没有功耗的廉价泵。 -block.rotary-pump.description = 一种先进的泵,通过使用动力使速度加倍。 -block.thermal-pump.description = 终级水泵。 +block.phase-conduit.description = 高级液体传输块。使用电力将液体传送到多个块上的连接相管道。 block.power-node.description = 连接节点传输电源。最多可连接四个电源,用电器或节点。节点将从任何相邻块接收电力或向其供电。 block.power-node-large.description = 传输径大于电源节点,最多可连接六个电源,接收器或节点。 block.surge-tower.description = 具有较少可用连接的远程电源节点。 @@ -987,11 +977,11 @@ block.battery-large.description = 比普通电池容量更大。 block.combustion-generator.description = 通过燃烧油或易燃材料产生电力。 block.thermal-generator.description = 当放置在热的地方时发电。 block.turbine-generator.description = 比燃烧发电机更有效,但需要额外的水。 +block.differential-generator.description = 产生大量的能量。利用低温流体和燃烧的硫之间的温差。 block.rtg-generator.description = 一种放射性同位素热电发电机,它不需要冷却,但功率低于钍反应堆。 block.solar-panel.description = 标准太阳能面板,提供少量电力。 block.solar-panel-large.description = 比标准太阳能电池板提供更好的电源,但构建起来要贵得多。 block.thorium-reactor.description = 高放射性钍产生大量电力。需要持续冷却。如果供应的冷却剂量不足,会剧烈爆炸。 -block.differential-generator.description = 产生大量的能量。利用低温流体和燃烧的硫之间的温差。 block.impact-reactor.description = 一种先进的发电机,能够以最高效率产生大量的电力。需要大量的电源输入才能启动进程。 block.mechanical-drill.description = 便宜的钻头。放置在适当的块上时,无限期地以缓慢的速度输出物品。 block.pneumatic-drill.description = 一种改进的钻头,它更快,能够利用气压处理更硬的材料。 @@ -1003,40 +993,40 @@ block.oil-extractor.description = 使用大量的电力从沙子中提取石油 block.core-shard.description = 核心第一代。一旦被摧毁,与该地区的所有联系都将失去。不要让这种情况发生。 block.core-foundation.description = 核心第二代。有更好的装甲。可以存储更多资源。 block.core-nucleus.description = 核心第三代,也是最后一代。装甲非常好。存储大量资源。 -block.unloader.description = 物品从容器,仓库或核心卸载到传送带上或直接卸载到相邻的块中。可以通过点击卸载器来更改要卸载的项目类型。 -block.container.description = 存储少量物品。当存在非恒定的材料需求时,使用它来创建缓冲区。 [LIGHT_GRAY]卸载器[]可用于从容器中获取物品。 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.duo.description = 小而便宜的炮塔。对地高效。 +block.scatter.description = 不可或缺的防空炮塔,向空中单位发射铅或废料。 +block.scorch.description = 小型炮塔,燃烧任何靠近它的地面敌人。近距离非常有效。 +block.hail.description = 小型,远程炮台。 +block.wave.description = 中型快速炮塔,射出液体泡泡。有液体输入时自动灭火。 +block.lancer.description = 中型对地炮塔。遇敌时会充能并发射强有力的的能量束。 block.arc.description = 小型炮塔,发射电弧。 -block.hail.description = 小型炮兵炮台。 -block.lancer.description = 中型炮塔,发射带电的电子束。 -block.wave.description = 中型快速炮塔,射出液体泡泡。 -block.salvo.description = 中型炮塔,齐射射击。 -block.swarmer.description = 中型炮塔,发射爆炸导弹。 -block.ripple.description = 大型炮兵炮塔,可同时向多个目标开火。 -block.cyclone.description = 大型快速炮塔。 -block.fuse.description = 大型炮塔,发射强大的短程光束。 -block.spectre.description = 大型炮塔,一次射出两颗强大的子弹。 -block.meltdown.description = 发射强大的远程光束的大型炮塔。 -block.crawler-factory.description = 生产快速自毁单元。 +block.swarmer.description = 中型炮塔,对空对地,发射跟踪爆炸导弹。 +block.salvo.description = 双管炮的升级。中型,齐射射击。 +block.fuse.description = 大型炮塔,发射三道刺穿敌人的短程光束。 +block.ripple.description = 大型远程炮台,非常强力,向远处的敌人投射一簇弹药。 +block.cyclone.description = 大型快速炮塔,对空对地,向周围敌人发射爆炸弹。 +block.spectre.description = 超大型炮塔,对空对地,一次射出两颗强大的穿甲子弹。 +block.meltdown.description = 超大型激光炮塔,充能之后持续发射光束,需要冷却剂。 block.draug-factory.description = 生产德鲁格釆矿机。 block.spirit-factory.description = 生产幽灵修理机。 block.phantom-factory.description = 生产鬼怪建造机。 block.wraith-factory.description = 生产快速截击机。 block.ghoul-factory.description = 生产重型地毯轰炸机。 +block.revenant-factory.description = 生产重型导弹部队。 block.dagger-factory.description = 生产基本地面单位。 +block.crawler-factory.description = 生产快速自毁单元。 block.titan-factory.description = 生产先进的装甲地面单位。 block.fortress-factory.description = 生产重型地面火炮部队。 -block.revenant-factory.description = 生产重型导弹部队。 block.repair-point.description = 连续治疗附近最近的受损单位。 block.dart-mech-pad.description = 离开你当前的装置,换成一个基本攻击机甲。\n站在上面时双击切换。 -block.trident-ship-pad.description = 离开你当前的装置,换成一个装甲合理的重型轰炸机。\n站在上面时双击切换。 -block.javelin-ship-pad.description = 离开你当前的装置,换成一个强大而快速的截击机,用闪电武器。\n站在上面时双击切换。 -block.glaive-ship-pad.description = 离开现有的装置,换成装甲良好的大型武装直升机。\n站在上面时双击切换。 -block.tau-mech-pad.description = 离开你当前的装置并换成一个可以治愈友方建筑物和单位的支撑机械。\n站在上面时双击切换。 block.delta-mech-pad.description = 离开你当前的装置并换成一个快速,轻装甲的机械装置,用于快速攻击。\n站在上面时双击切换。 -block.omega-mech-pad.description = 离开你当前的装置并换成一个笨重且装甲良好的机甲,用于前线攻击。\n站在上面时双击切换。 \ No newline at end of file +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 a3dfa3d560..a760f1bf4a 100644 --- a/core/assets/bundles/bundle_zh_TW.properties +++ b/core/assets/bundles/bundle_zh_TW.properties @@ -43,6 +43,7 @@ newgame = 新遊戲 none = 〈沒有〉 minimap = 小地圖 close = 關閉 +website = Website quit = 退出 maps = 地圖 continue = 繼續 @@ -71,6 +72,7 @@ server.kicked.nameEmpty = 你的名稱必須至少包含一個字母或數字。 server.kicked.idInUse = 你已經在伺服器中!不允許用兩個賬號。 server.kicked.customClient = 這個伺服器不支持自訂客戶端,請下載官方版本。 server.kicked.gameover = 遊戲結束! +server.versions = Your version:[accent] {0}[]\nServer version:[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位址。 hostserver = 建立伺服器 @@ -154,7 +156,10 @@ cancel = 取消 openlink = 開啟連結 copylink = 複製連結 back = 返回 +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 = 您確定要退出嗎? +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]載入中…… saving = [accent]儲存中…… wave = [accent]第{0}波 @@ -263,6 +268,7 @@ filters.empty = [LIGHT_GRAY]沒有過濾器!使用下面的按鈕添加一個 filter.distort = 歪曲 filter.noise = 噪聲 filter.median = Median +filter.oremedian = Ore Median filter.blend = Blend filter.defaultores = Default Ores filter.ore = 礦石 @@ -302,6 +308,7 @@ ping = 延遲:{0}ms language.restart = 請重新啟動遊戲以使選取的語言生效。 settings = 設定 tutorial = 教學 +tutorial.retake = Re-Take Tutorial editor = 地圖編輯器 mapeditor = 地圖編輯器 donate = 贊助 @@ -315,8 +322,9 @@ bestwave = [LIGHT_GRAY]高分:{0} launch = 發射 launch.title = 發射成功 launch.next = [LIGHT_GRAY]下次的機會於波次{0} -launch.unable = [scarlet]無法發射。[]有敵人。 +launch.unable2 = [scarlet]Unable to LAUNCH.[] launch.confirm = 這將發射核心中的所有資源。\n你將無法返回這個基地。 +launch.skip.confirm = If you skip now, you will not be able to launch until later waves. uncover = 揭露 configure = 配置裝載 configure.locked = [LIGHT_GRAY]到達波次{0}\n以配置裝載。 @@ -352,6 +360,7 @@ zone.tarFields.name = 焦油田 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. @@ -363,6 +372,7 @@ zone.overgrowth.description = This area is overgrown, closer to the source of th zone.tarFields.description = The outskirts of an oil production zone, between the mountains and desert. One of the few areas with usable tar reserves.\nAlthough abandoned, this area has some dangerous enemy forces nearby. Do not underestimate them.\n\n[lightgray]Research oil processing technology if possible. zone.desolateRift.description = An extremely dangerous zone. Plentiful resources, but little space. High risk of destruction. Leave as soon as possible. Do not be fooled by the long spacing between enemy attacks. zone.nuclearComplex.description = A former facility for the production and processing of thorium, reduced to ruins.\n[lightgray]Research the thorium and its many uses.\n\nThe enemy is present here in great numbers, constantly scouting for attackers. +zone.fungalPass.description = A transition area between high mountains and lower, spore-ridden lands. A small enemy reconnaissance base is located here.\nDestroy it.\nUse Dagger and Crawler units. Take out the two cores. zone.impact0078.description = zone.crags.description = settings.language = 語言 @@ -417,6 +427,7 @@ blocks.inaccuracy = 誤差 blocks.shots = 射擊數 blocks.reload = 重裝彈藥 blocks.ammo = 彈藥 +bar.drilltierreq = Better Drill Required bar.drillspeed = 鑽頭速度:{0}/秒 bar.efficiency = 效率:{0}% bar.powerbalance = 能量變化:{0} @@ -491,6 +502,7 @@ setting.lasers.name = 顯示雷射光束 setting.pixelate.name = 像素化[LIGHT_GRAY](可能降低性能) setting.minimap.name = 顯示小地圖 setting.musicvol.name = 音樂音量 +setting.ambientvol.name = Ambient Volume setting.mutemusic.name = 靜音 setting.sfxvol.name = 音效音量 setting.mutesound.name = 靜音 @@ -819,9 +831,10 @@ block.container.name = 容器 block.launch-pad.name = 發射台 block.launch-pad-large.name = 大型發射台 team.blue.name = 藍 -team.red.name = 紅 +team.crux.name = red +team.sharded.name = orange team.orange.name = 橙 -team.none.name = 灰 +team.derelict.name = derelict team.green.name = 綠 team.purple.name = 紫 unit.spirit.name = 輕型無人機 @@ -839,27 +852,26 @@ unit.chaos-array.name = 混沌陣 unit.eradicator.name = 消除者 unit.lich.name = 巫妖 unit.reaper.name = 收割者 -tutorial.begin = 你的任務是毀滅[LIGHT_GRAY]敵人[]。\n\n首先[accent]挖掘銅礦[]。點擊核心附近的銅脈以開始。 +tutorial.next = [lightgray] +tutorial.intro = You have entered the[scarlet] Mindustry Tutorial.[]\nBegin by[accent] mining copper[]. Tap a copper ore vein near your core to do this.\n\n[accent]{0}/{1} copper tutorial.drill = 手動挖掘礦石是低效率的。\n[accent]鑽頭[]能夠自動挖掘礦石。\n在銅脈上放置一個鑽頭。 +tutorial.drill.mobile = Mining manually is inefficient.\n[accent]Drills []can mine automatically.\nTap the drill tab in the bottom right.\nSelect the[accent] mechanical drill[].\nPlace it on a copper vein by tapping, then press the[accent] checkmark[] below to confirm your selection.\nPress the[accent] X button[] to cancel placement. +tutorial.blockinfo = Each block has different stats. Each drill can only mine certain ores.\nTo check a block's info and stats,[accent] tap the "?" button while selecting it in the build menu.[]\n\n[accent]Access the Mechanical Drill's stats now.[] tutorial.conveyor = [accent]輸送帶[]能夠將物品運輸到核心。\n製作一條從鑽頭開始到核心的輸送帶。 -tutorial.morecopper = 需要更多銅。\n\n請手動挖掘銅礦或放置更多鑽頭。 +tutorial.conveyor.mobile = [accent]Conveyors[] are used to transport items to the core.\nMake a line of conveyors from the drill to the core.\n[accent] Place in a line by holding down your finger for a few seconds[] and dragging in a direction.\n\n[accent]{0}/{1} conveyors placed in line\n[accent]0/1 items delivered tutorial.turret = 防禦建築是必須的以擊退[LIGHT_GRAY]敵人[]。\n於核心附近建造一個雙炮。 tutorial.drillturret = 雙炮需要[accent]銅彈[]以射擊。\n在雙炮旁邊放置一個鑽頭以供應銅。 +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 = [LIGHT_GRAY]敵人[]來臨。\n\n防衛核心2波。建造更多的砲塔以防衛。 -tutorial.lead = 有更多的礦石可用。探索和挖掘[accent]鉛[]。\n\n點擊您的單位拖動到核心以傳輸資源。 -tutorial.smelter = 銅和鉛是柔軟的金屬。\n優良的[accent]稠密合金[]可以在冶煉廠中生產。\n\n建造一個冶煉廠。 -tutorial.densealloy = 冶煉廠現在將生產稠密合金。\n請獲取更多的稠密合金。\n必要時改善生產系統。 -tutorial.siliconsmelter = 核心現在將製作一個[accent]輕型無人機[]以挖掘礦石和修理方塊。\n\n製作其他單位的工廠可以使用[accent]矽[]以建造。\n建造一個冶矽廠。 -tutorial.silicondrill = 矽需要[accent]煤[]和[accent]沙[]以製作。\n放置鑽頭以開始。 -tutorial.generator = 這項技術需要能量。\n建造一個[accent]燃燒發電機[]。 -tutorial.generatordrill = 燃燒發電機需要燃料。\n用鑽頭挖的煤為它加燃料。 -tutorial.node = 電源需要運輸。\n在燃燒發電機旁邊建造一個[accent]能量節點[]以傳遞其能量。 -tutorial.nodelink = 能量可透過接觸的能量方塊和發電機,或者通過連接的能量節點傳遞。\n\n點擊能量節點並選擇發電機和冶矽廠以連接能量。 -tutorial.silicon = 正在製作矽。請獲取更多的矽。\n\n建議改善生產系統。 -tutorial.daggerfactory = 建造一個[accent]匕首機甲工廠[]。\n\n這將製作攻擊機甲。 -tutorial.router = 工廠需要資源以運作。\n建造一個分配器以均分輸送帶的資源。 -tutorial.dagger = 連接能量節點至工廠。\n一旦要求滿足,將製作一個機甲。\n\n根據需要建造更多鑽頭、發電機和輸送帶。發電機和輸送帶。 -tutorial.battle = [LIGHT_GRAY]敵人[]透露了他們的核心。\n用你的單位和匕首機甲以摧毀它。 +tutorial.waves.mobile = The[lightgray] enemy[] approaches.\n\nDefend the core for 2 waves. Your ship will automatically fire at enemies.\nBuild more turrets and drills. Mine more copper. +tutorial.launch = Once you reach a specific wave, you are able to[accent] launch the core[], leaving your defenses behind and[accent] obtaining all the resources in your core.[]\nThese resources can then be used to research new technology.\n\n[accent]Press the launch button. item.copper.description = 一種有用的結構材料。在各種類型的方塊中廣泛使用。 item.lead.description = 一種基本的起始材料。被廣泛用於電子設備和運輸液體方塊。 item.metaglass.description = 一種超級強硬玻璃混合物。廣泛用於液體分配和存儲。 @@ -896,13 +908,9 @@ unit.crawler.description = A ground unit consisting of a stripped-down frame wit unit.titan.description = 一種高級的具有裝甲的地面單位。使用碳化物作為彈藥。攻擊地面單位和空中單位。 unit.fortress.description = 一種具有重型大砲的地面單位。 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.chaos-array.description = -unit.eradicator.description = unit.wraith.description = 一種快速、打了就跑的攔截機。 unit.ghoul.description = 一種重型的鋪蓋性的轟炸機。使用爆炸化合物或黃鐵礦作為彈藥。 unit.revenant.description = A heavy, hovering missile array. -unit.lich.description = -unit.reaper.description = block.graphite-press.description = Compresses chunks of coal into pure sheets of graphite. block.multi-press.description = An upgraded version of the graphite press. Employs water and power to process coal quickly and efficiently. block.silicon-smelter.description = 使用高純度焦炭還原沙子以生產矽。 diff --git a/core/assets/contributors b/core/assets/contributors index 0b022ae2f0..46c5a0b47f 100644 --- a/core/assets/contributors +++ b/core/assets/contributors @@ -26,7 +26,7 @@ beito BeefEX Lorex laohuaji233 -CrazyBearTR +Spico The Spirit Guy Zachary Fenr1r Jaiun Lee @@ -71,3 +71,4 @@ Paul T Dominik Arkanic Potion +Markus G diff --git a/core/assets/maps/glacier.msav b/core/assets/maps/glacier.msav index 12c693556a..1494079697 100644 Binary files a/core/assets/maps/glacier.msav and b/core/assets/maps/glacier.msav differ diff --git a/core/assets/maps/tarFields.msav b/core/assets/maps/tarFields.msav index 45a9848818..e4a99d71bf 100644 Binary files a/core/assets/maps/tarFields.msav and b/core/assets/maps/tarFields.msav differ diff --git a/core/assets/maps/veins.msav b/core/assets/maps/veins.msav index 133d783abc..6ad97e728a 100644 Binary files a/core/assets/maps/veins.msav and b/core/assets/maps/veins.msav differ diff --git a/core/assets/music/game6.ogg b/core/assets/music/game6.ogg index d57cdae0c2..45b063ae9c 100644 Binary files a/core/assets/music/game6.ogg and b/core/assets/music/game6.ogg differ diff --git a/core/assets/sprites/block_colors.png b/core/assets/sprites/block_colors.png index 608d97218e..2f8914711b 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/error.png b/core/assets/sprites/error.png new file mode 100644 index 0000000000..f784bec923 Binary files /dev/null and b/core/assets/sprites/error.png differ diff --git a/core/assets/sprites/sprites.atlas b/core/assets/sprites/sprites.atlas index 7a58d8b576..2edb78ecc7 100644 --- a/core/assets/sprites/sprites.atlas +++ b/core/assets/sprites/sprites.atlas @@ -6,4550 +6,4564 @@ filter: Nearest,Nearest repeat: none force-projector rotate: false - xy: 521, 480 + xy: 1423, 1659 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 force-projector-icon-full rotate: false - xy: 521, 480 + xy: 1423, 1659 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 force-projector-top rotate: false - xy: 489, 382 + xy: 1521, 1659 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 mend-projector rotate: false - xy: 1610, 1597 + xy: 715, 1322 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 mend-projector-icon-full rotate: false - xy: 1610, 1597 + xy: 715, 1322 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 mend-projector-top rotate: false - xy: 1676, 1597 + xy: 781, 1322 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 mender rotate: false - xy: 1307, 1057 + xy: 907, 696 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 mender-icon-full rotate: false - xy: 1307, 1057 + xy: 907, 696 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 mender-top rotate: false - xy: 1341, 1091 + xy: 847, 662 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 overdrive-projector rotate: false - xy: 1808, 1593 + xy: 913, 1331 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 overdrive-projector-icon-full rotate: false - xy: 1808, 1593 + xy: 913, 1331 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 overdrive-projector-top rotate: false - xy: 1874, 1593 + xy: 649, 1190 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 shock-mine rotate: false - xy: 1341, 717 + xy: 1043, 739 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 bridge-arrow rotate: false - xy: 1763, 1319 + xy: 962, 909 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 bridge-conveyor rotate: false - xy: 1113, 86 + xy: 1132, 909 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 bridge-conveyor-icon-full rotate: false - xy: 1113, 86 + xy: 1132, 909 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 bridge-conveyor-bridge rotate: false - xy: 1113, 52 + xy: 1166, 909 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 bridge-conveyor-end rotate: false - xy: 1113, 18 + xy: 1200, 909 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 center rotate: false - xy: 1545, 1215 + xy: 1234, 909 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conveyor-0-0 rotate: false - xy: 1137, 1033 + xy: 1444, 931 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conveyor-icon-full rotate: false - xy: 1137, 1033 + xy: 1444, 931 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conveyor-0-1 rotate: false - xy: 1137, 999 + xy: 1478, 931 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conveyor-0-2 rotate: false - xy: 1137, 965 + xy: 1512, 931 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conveyor-0-3 rotate: false - xy: 1137, 931 + xy: 1546, 931 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conveyor-1-0 rotate: false - xy: 1137, 897 + xy: 1580, 931 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conveyor-1-1 rotate: false - xy: 1137, 863 + xy: 1614, 931 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conveyor-1-2 rotate: false - xy: 1137, 829 + xy: 1444, 897 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conveyor-1-3 rotate: false - xy: 1137, 795 + xy: 1478, 897 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conveyor-2-0 rotate: false - xy: 1137, 761 + xy: 1512, 897 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conveyor-2-1 rotate: false - xy: 1137, 727 + xy: 1546, 897 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conveyor-2-2 rotate: false - xy: 1137, 693 + xy: 1580, 897 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conveyor-2-3 rotate: false - xy: 2006, 1625 + xy: 1614, 897 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conveyor-3-0 rotate: false - xy: 2006, 1591 + xy: 1656, 975 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conveyor-3-1 rotate: false - xy: 2006, 1557 + xy: 1690, 975 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conveyor-3-2 rotate: false - xy: 2006, 1523 + xy: 1724, 975 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conveyor-3-3 rotate: false - xy: 2006, 1489 + xy: 1758, 975 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conveyor-4-0 rotate: false - xy: 1133, 659 + xy: 1792, 975 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conveyor-4-1 rotate: false - xy: 1133, 625 + xy: 1826, 975 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conveyor-4-2 rotate: false - xy: 1133, 591 + xy: 1860, 975 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conveyor-4-3 rotate: false - xy: 1133, 557 + xy: 1656, 941 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-conveyor-0-0 rotate: false - xy: 1235, 615 + xy: 1145, 739 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-conveyor-icon-full rotate: false - xy: 1235, 615 + xy: 1145, 739 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-conveyor-0-1 rotate: false - xy: 1269, 649 + xy: 1179, 773 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-conveyor-0-2 rotate: false - xy: 1235, 581 + xy: 1213, 807 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-conveyor-0-3 rotate: false - xy: 1269, 615 + xy: 1247, 841 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-conveyor-1-0 rotate: false - xy: 1303, 649 + xy: 1145, 705 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-conveyor-1-1 rotate: false - xy: 1269, 581 + xy: 1179, 739 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-conveyor-1-2 rotate: false - xy: 1303, 615 + xy: 1213, 773 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-conveyor-1-3 rotate: false - xy: 1337, 649 + xy: 1247, 807 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-conveyor-2-0 rotate: false - xy: 1303, 581 + xy: 1179, 705 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-conveyor-2-1 rotate: false - xy: 1337, 615 + xy: 1213, 739 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-conveyor-2-2 rotate: false - xy: 1371, 649 + xy: 1247, 773 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-conveyor-2-3 rotate: false - xy: 1337, 581 + xy: 1213, 705 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-conveyor-3-0 rotate: false - xy: 1371, 615 + xy: 1247, 739 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-conveyor-3-1 rotate: false - xy: 1371, 581 + xy: 1247, 705 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-conveyor-3-2 rotate: false - xy: 1167, 547 + xy: 983, 671 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-conveyor-3-3 rotate: false - xy: 1201, 547 + xy: 983, 637 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-conveyor-4-0 rotate: false - xy: 1235, 547 + xy: 1017, 671 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-conveyor-4-1 rotate: false - xy: 1269, 547 + xy: 983, 603 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-conveyor-4-2 rotate: false - xy: 1303, 547 + xy: 1017, 637 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-conveyor-4-3 rotate: false - xy: 1337, 547 + xy: 1051, 671 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 distributor rotate: false - xy: 459, 120 + xy: 1325, 1399 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 distributor-icon-full rotate: false - xy: 459, 120 + xy: 1325, 1399 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 junction rotate: false - xy: 1239, 1091 + xy: 839, 798 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 junction-icon-full rotate: false - xy: 1239, 1091 + xy: 839, 798 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 mass-driver-base rotate: false - xy: 651, 752 + xy: 1619, 1463 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 overflow-gate rotate: false - xy: 1341, 1023 + xy: 915, 628 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 overflow-gate-icon-full rotate: false - xy: 1341, 1023 + xy: 915, 628 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 phase-conveyor rotate: false - xy: 1307, 955 + xy: 897, 424 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 phase-conveyor-icon-full rotate: false - xy: 1307, 955 + xy: 897, 424 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 phase-conveyor-arrow rotate: false - xy: 1341, 989 + xy: 897, 390 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 phase-conveyor-bridge rotate: false - xy: 1375, 1023 + xy: 897, 356 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 phase-conveyor-end rotate: false - xy: 1171, 785 + xy: 931, 458 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 router rotate: false - xy: 1205, 717 + xy: 1009, 841 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 router-icon-full rotate: false - xy: 1205, 717 + xy: 1009, 841 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 sorter rotate: false - xy: 1307, 683 + xy: 1111, 773 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 sorter-icon-full rotate: false - xy: 1307, 683 + xy: 1111, 773 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 blast-drill rotate: false - xy: 1804, 1919 + xy: 645, 1716 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 blast-drill-rim rotate: false - xy: 526, 1597 + xy: 453, 1355 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 blast-drill-rotator rotate: false - xy: 453, 1394 + xy: 775, 1716 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 blast-drill-top rotate: false - xy: 163, 1033 + xy: 905, 1757 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 drill-top rotate: false - xy: 525, 54 + xy: 649, 1454 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 turbine-generator-liquid rotate: false - xy: 525, 54 + xy: 649, 1454 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 laser-drill rotate: false - xy: 685, 186 + xy: 423, 265 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 laser-drill-rim rotate: false - xy: 583, 1438 + xy: 683, 769 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 laser-drill-rotator rotate: false - xy: 681, 1438 + xy: 683, 671 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 laser-drill-top rotate: false - xy: 609, 1340 + xy: 933, 1463 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 mechanical-drill rotate: false - xy: 1346, 1559 + xy: 1177, 1397 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 mechanical-drill-rotator rotate: false - xy: 1478, 1597 + xy: 649, 1322 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 mechanical-drill-top rotate: false - xy: 1544, 1597 + xy: 649, 1256 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 oil-extractor rotate: false - xy: 749, 1144 + xy: 1717, 1401 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 oil-extractor-liquid rotate: false - xy: 749, 948 + xy: 553, 509 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 oil-extractor-rotator rotate: false - xy: 749, 850 + xy: 651, 573 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 oil-extractor-top rotate: false - xy: 749, 752 + xy: 651, 475 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 pneumatic-drill rotate: false - xy: 1148, 1493 + xy: 1045, 1331 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 pneumatic-drill-rotator rotate: false - xy: 1280, 1493 + xy: 913, 1199 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 pneumatic-drill-top rotate: false - xy: 1346, 1493 + xy: 715, 1124 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 water-extractor rotate: false - xy: 913, 891 + xy: 922, 1001 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 water-extractor-liquid rotate: false - xy: 913, 825 + xy: 988, 1001 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 water-extractor-rotator rotate: false - xy: 979, 825 + xy: 1120, 1067 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 water-extractor-top rotate: false - xy: 913, 759 + xy: 1054, 1001 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 block-border rotate: false - xy: 1943, 1361 + xy: 1920, 995 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-middle rotate: false - xy: 1695, 1315 + xy: 285, 11 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-select rotate: false - xy: 1729, 1319 + xy: 319, 11 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conduit-liquid rotate: false - xy: 1103, 829 + xy: 1588, 999 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 place-arrow rotate: false - xy: 717, 556 + xy: 1913, 1597 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 rubble-1-0 rotate: false - xy: 1676, 1465 + xy: 979, 1199 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 rubble-1-1 rotate: false - xy: 1742, 1461 + xy: 913, 1133 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 rubble-2-0 rotate: false - xy: 1808, 1461 + xy: 1177, 1331 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 rubble-2-1 rotate: false - xy: 1874, 1461 + xy: 1111, 1265 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 rubble-3-0 rotate: false - xy: 783, 262 + xy: 749, 475 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 rubble-3-1 rotate: false - xy: 783, 262 + xy: 749, 475 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 rubble-4-0 rotate: false - xy: 293, 744 + xy: 423, 705 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 rubble-4-1 rotate: false - xy: 293, 744 + xy: 423, 705 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 bridge-conduit rotate: false - xy: 1797, 1323 + xy: 996, 909 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 bridge-conduit-icon-full rotate: false - xy: 1797, 1323 + xy: 996, 909 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 bridge-conduit-arrow rotate: false - xy: 1831, 1323 + xy: 1030, 909 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 bridge-conveyor-arrow rotate: false - xy: 1831, 1323 + xy: 1030, 909 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 bridge-conduit-bridge rotate: false - xy: 1865, 1323 + xy: 1064, 909 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 bridge-conduit-end rotate: false - xy: 1113, 120 + xy: 1098, 909 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conduit-bottom rotate: false - xy: 1103, 1033 + xy: 1418, 975 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conduit-bottom-0 rotate: false - xy: 1103, 999 + xy: 1410, 907 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conduit-bottom-1 rotate: false - xy: 1103, 965 + xy: 1452, 999 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conduit-bottom-2 rotate: false - xy: 1103, 931 + xy: 1486, 999 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conduit-bottom-3 rotate: false - xy: 1103, 931 + xy: 1486, 999 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conduit-bottom-4 rotate: false - xy: 1103, 931 + xy: 1486, 999 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conduit-bottom-6 rotate: false - xy: 1103, 931 + xy: 1486, 999 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conduit-bottom-5 rotate: false - xy: 1103, 897 + xy: 1520, 999 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conduit-top-0 rotate: false - xy: 1103, 795 + xy: 1622, 999 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conduit-top-1 rotate: false - xy: 1103, 761 + xy: 1452, 965 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conduit-top-2 rotate: false - xy: 1103, 727 + xy: 1486, 965 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conduit-top-3 rotate: false - xy: 1103, 693 + xy: 1520, 965 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 pulse-conduit-top-3 rotate: false - xy: 1103, 693 + xy: 1520, 965 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conduit-top-4 rotate: false - xy: 1144, 1135 + xy: 1554, 965 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conduit-top-5 rotate: false - xy: 1137, 1101 + xy: 1588, 965 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conduit-top-6 rotate: false - xy: 1137, 1067 + xy: 1622, 965 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 liquid-junction rotate: false - xy: 1205, 1023 + xy: 873, 832 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 liquid-junction-icon-full rotate: false - xy: 1205, 1023 + xy: 873, 832 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 liquid-router-bottom rotate: false - xy: 1273, 1091 + xy: 873, 798 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 liquid-router-liquid rotate: false - xy: 1205, 989 + xy: 839, 730 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 liquid-router-top rotate: false - xy: 1239, 1023 + xy: 873, 764 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 liquid-tank-bottom rotate: false - xy: 651, 1242 + xy: 1129, 1463 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 liquid-tank-liquid rotate: false - xy: 651, 1046 + xy: 1325, 1465 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 liquid-tank-top rotate: false - xy: 651, 948 + xy: 1423, 1463 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 mechanical-pump rotate: false - xy: 1239, 989 + xy: 873, 696 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 mechanical-pump-icon-full rotate: false - xy: 1239, 989 + xy: 873, 696 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 phase-conduit rotate: false - xy: 1171, 819 + xy: 915, 560 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 phase-conduit-icon-full rotate: false - xy: 1171, 819 + xy: 915, 560 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 phase-conduit-arrow rotate: false - xy: 1205, 853 + xy: 915, 526 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 phase-conduit-bridge rotate: false - xy: 1239, 887 + xy: 915, 492 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 phase-conduit-end rotate: false - xy: 1273, 921 + xy: 897, 458 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 pulse-conduit-top-0 rotate: false - xy: 1171, 751 + xy: 941, 764 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 pulse-conduit-top-1 rotate: false - xy: 1205, 785 + xy: 941, 730 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 pulse-conduit-top-2 rotate: false - xy: 1239, 819 + xy: 941, 696 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 pulse-conduit-top-4 rotate: false - xy: 1273, 853 + xy: 949, 662 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 pulse-conduit-top-5 rotate: false - xy: 1307, 887 + xy: 949, 628 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 pulse-conduit-top-6 rotate: false - xy: 1341, 921 + xy: 949, 594 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 rotary-pump rotate: false - xy: 1544, 1465 + xy: 1111, 1331 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 rotary-pump-icon-full rotate: false - xy: 1544, 1465 + xy: 1111, 1331 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 thermal-pump rotate: false - xy: 881, 164 + xy: 521, 215 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 thermal-pump-icon-full rotate: false - xy: 881, 164 + xy: 521, 215 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 dart-mech-pad rotate: false - xy: 1009, 1485 + xy: 821, 13 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 dart-mech-pad-icon-full rotate: false - xy: 1009, 1485 + xy: 821, 13 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 delta-mech-pad rotate: false - xy: 393, 60 + xy: 887, 13 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 delta-mech-pad-icon-full rotate: false - xy: 393, 60 + xy: 887, 13 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 glaive-ship-pad rotate: false - xy: 685, 284 + xy: 1815, 1597 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 glaive-ship-pad-icon-full rotate: false - xy: 685, 284 + xy: 1815, 1597 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 javelin-ship-pad rotate: false - xy: 1148, 1559 + xy: 781, 1388 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 javelin-ship-pad-icon-full rotate: false - xy: 1148, 1559 + xy: 781, 1388 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 omega-mech-pad rotate: false - xy: 749, 654 + xy: 1913, 1695 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 omega-mech-pad-icon-full rotate: false - xy: 749, 654 + xy: 1913, 1695 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 tau-mech-pad rotate: false - xy: 913, 1287 + xy: 1375, 1133 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 tau-mech-pad-icon-full rotate: false - xy: 913, 1287 + xy: 1375, 1133 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 trident-ship-pad rotate: false - xy: 913, 1089 + xy: 790, 1058 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 trident-ship-pad-icon-full rotate: false - xy: 913, 1089 + xy: 790, 1058 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 battery rotate: false - xy: 797, 1738 + xy: 1960, 1033 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 battery-icon-full rotate: false - xy: 797, 1738 + xy: 1960, 1033 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 battery-large rotate: false - xy: 293, 386 + xy: 423, 363 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 battery-large-icon-full rotate: false - xy: 293, 386 + xy: 423, 363 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 combustion-generator rotate: false - xy: 1103, 1101 + xy: 359, 19 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 combustion-generator-icon-full rotate: false - xy: 1103, 1101 + xy: 359, 19 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 combustion-generator-top rotate: false - xy: 1103, 1067 + xy: 1410, 941 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 differential-generator rotate: false - xy: 656, 1536 + xy: 1129, 1561 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 differential-generator-icon-full rotate: false - xy: 656, 1536 + xy: 1129, 1561 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 differential-generator-liquid rotate: false - xy: 293, 190 + xy: 1227, 1659 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 differential-generator-top rotate: false - xy: 391, 386 + xy: 1227, 1561 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 impact-reactor rotate: false - xy: 1888, 1789 + xy: 519, 1225 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 impact-reactor-bottom rotate: false - xy: 1498, 1663 + xy: 519, 1095 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 impact-reactor-light rotate: false - xy: 1758, 1659 + xy: 594, 965 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 impact-reactor-plasma-0 rotate: false - xy: 1888, 1659 + xy: 163, 814 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 impact-reactor-plasma-1 rotate: false - xy: 163, 253 + xy: 163, 684 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 impact-reactor-plasma-2 rotate: false - xy: 155, 123 + xy: 163, 554 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 impact-reactor-plasma-3 rotate: false - xy: 219, 1264 + xy: 163, 424 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 power-node rotate: false - xy: 1239, 853 + xy: 931, 390 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 power-node-icon-full rotate: false - xy: 1239, 853 + xy: 931, 390 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 power-node-large rotate: false - xy: 1412, 1493 + xy: 781, 1124 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 power-node-large-icon-full rotate: false - xy: 1412, 1493 + xy: 781, 1124 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 power-source rotate: false - xy: 1273, 887 + xy: 931, 356 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 power-void rotate: false - xy: 1341, 955 + xy: 941, 832 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 power-void-icon-full rotate: false - xy: 1341, 955 + xy: 941, 832 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 rtg-generator rotate: false - xy: 1610, 1465 + xy: 1045, 1265 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 rtg-generator-icon-full rotate: false - xy: 1610, 1465 + xy: 1045, 1265 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 rtg-generator-top rotate: false - xy: 1239, 751 + xy: 1077, 875 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 solar-panel rotate: false - xy: 1273, 683 + xy: 1077, 739 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 solar-panel-icon-full rotate: false - xy: 1273, 683 + xy: 1077, 739 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 solar-panel-large rotate: false - xy: 881, 262 + xy: 733, 377 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 solar-panel-large-icon-full rotate: false - xy: 881, 262 + xy: 733, 377 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 surge-tower rotate: false - xy: 913, 1419 + xy: 1573, 1331 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 surge-tower-icon-full rotate: false - xy: 913, 1419 + xy: 1573, 1331 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 thermal-generator rotate: false - xy: 979, 1287 + xy: 1441, 1133 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 thermal-generator-icon-full rotate: false - xy: 979, 1287 + xy: 1441, 1133 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 thorium-reactor rotate: false - xy: 754, 1634 + xy: 619, 279 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 thorium-reactor-icon-full rotate: false - xy: 754, 1634 + xy: 619, 279 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 thorium-reactor-center rotate: false - xy: 754, 1536 + xy: 717, 279 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 thorium-reactor-lights rotate: false - xy: 779, 1438 + xy: 619, 181 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 turbine-generator rotate: false - xy: 979, 1089 + xy: 790, 992 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 turbine-generator-icon-full rotate: false - xy: 979, 1089 + xy: 790, 992 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 turbine-generator-top rotate: false - xy: 913, 1023 + xy: 856, 1058 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 alloy-smelter rotate: false - xy: 1, 3 + xy: 541, 1629 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 alloy-smelter-icon-full rotate: false - xy: 1, 3 + xy: 541, 1629 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 alloy-smelter-top rotate: false - xy: 1934, 1951 + xy: 553, 607 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 blast-mixer rotate: false - xy: 651, 588 + xy: 359, 53 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 blast-mixer-icon-full rotate: false - xy: 651, 588 + xy: 359, 53 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 coal-centrifuge rotate: false - xy: 295, 26 + xy: 831, 343 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 coal-centrifuge-icon-full rotate: false - xy: 295, 26 + xy: 831, 343 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 cryofluidmixer-bottom rotate: false - xy: 847, 1010 + xy: 557, 83 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 cryofluidmixer-liquid rotate: false - xy: 847, 878 + xy: 623, 115 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 cryofluidmixer-top rotate: false - xy: 847, 812 + xy: 689, 115 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 cultivator rotate: false - xy: 847, 746 + xy: 623, 49 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 cultivator-middle rotate: false - xy: 950, 1551 + xy: 755, 79 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 cultivator-top rotate: false - xy: 1016, 1551 + xy: 821, 79 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 graphite-press rotate: false - xy: 1214, 1625 + xy: 715, 1388 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 graphite-press-icon-full rotate: false - xy: 1214, 1625 + xy: 715, 1388 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 incinerator rotate: false - xy: 1178, 1159 + xy: 1920, 893 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 incinerator-icon-full rotate: false - xy: 1178, 1159 + xy: 1920, 893 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-source rotate: false - xy: 1382, 1125 + xy: 846, 900 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-source-icon-full rotate: false - xy: 1382, 1125 + xy: 846, 900 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-void rotate: false - xy: 1205, 1057 + xy: 873, 866 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-void-icon-full rotate: false - xy: 1205, 1057 + xy: 873, 866 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 kiln rotate: false - xy: 1280, 1625 + xy: 847, 1388 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 kiln-icon-full rotate: false - xy: 1280, 1625 + xy: 847, 1388 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 kiln-top rotate: false - xy: 1214, 1559 + xy: 913, 1397 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 silicon-smelter-top rotate: false - xy: 1214, 1559 + xy: 913, 1397 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 liquid-source rotate: false - xy: 1307, 1091 + xy: 839, 696 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 liquid-source-icon-full rotate: false - xy: 1307, 1091 + xy: 839, 696 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 melter rotate: false - xy: 1273, 1023 + xy: 907, 730 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 melter-icon-full rotate: false - xy: 1273, 1023 + xy: 907, 730 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 multi-press rotate: false - xy: 749, 1242 + xy: 1815, 1499 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 multi-press-icon-full rotate: false - xy: 749, 1242 + xy: 1815, 1499 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 phase-weaver rotate: false - xy: 1610, 1531 + xy: 979, 1331 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 phase-weaver-bottom rotate: false - xy: 1676, 1531 + xy: 913, 1265 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 phase-weaver-weave rotate: false - xy: 1808, 1527 + xy: 715, 1190 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 plastanium-compressor rotate: false - xy: 1874, 1527 + xy: 781, 1190 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 plastanium-compressor-icon-full rotate: false - xy: 1874, 1527 + xy: 781, 1190 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 plastanium-compressor-top rotate: false - xy: 1940, 1527 + xy: 847, 1190 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 pulverizer rotate: false - xy: 1375, 955 + xy: 949, 560 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 pulverizer-rotator rotate: false - xy: 1205, 751 + xy: 949, 492 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 pump-liquid rotate: false - xy: 1239, 785 + xy: 975, 875 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 pyratite-mixer rotate: false - xy: 1478, 1465 + xy: 847, 1124 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 pyratite-mixer-icon-full rotate: false - xy: 1478, 1465 + xy: 847, 1124 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 separator rotate: false - xy: 1339, 1427 + xy: 1309, 1333 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 separator-icon-full rotate: false - xy: 1339, 1427 + xy: 1309, 1333 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 separator-liquid rotate: false - xy: 1405, 1427 + xy: 1309, 1267 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 silicon-smelter rotate: false - xy: 1471, 1399 + xy: 1309, 1201 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 silicon-smelter-icon-full rotate: false - xy: 1471, 1399 + xy: 1309, 1201 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 spore-press rotate: false - xy: 1669, 1399 + xy: 1375, 1265 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 spore-press-frame0 rotate: false - xy: 1735, 1395 + xy: 1441, 1331 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 spore-press-frame1 rotate: false - xy: 1801, 1395 + xy: 1375, 1199 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 spore-press-frame2 rotate: false - xy: 1867, 1395 + xy: 1441, 1265 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 spore-press-liquid rotate: false - xy: 979, 1419 + xy: 1441, 1199 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 spore-press-top rotate: false - xy: 1045, 1419 + xy: 1507, 1265 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 container rotate: false - xy: 950, 1617 + xy: 815, 211 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 container-icon-full rotate: false - xy: 950, 1617 + xy: 815, 211 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 core-foundation rotate: false - xy: 163, 383 + xy: 1555, 1757 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 core-foundation-icon-full rotate: false - xy: 163, 383 + xy: 1555, 1757 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 core-nucleus rotate: false - xy: 1, 1001 + xy: 848, 1887 size: 160, 160 orig: 160, 160 offset: 0, 0 index: -1 core-nucleus-icon-full rotate: false - xy: 1, 1001 + xy: 848, 1887 size: 160, 160 orig: 160, 160 offset: 0, 0 index: -1 core-shard rotate: false - xy: 293, 288 + xy: 639, 1618 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 core-shard-icon-full rotate: false - xy: 293, 288 + xy: 639, 1618 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 launch-pad rotate: false - xy: 707, 1340 + xy: 1031, 1463 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 launch-pad-icon-full rotate: false - xy: 707, 1340 + xy: 1031, 1463 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 launch-pad-large rotate: false - xy: 349, 1264 + xy: 163, 294 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 launch-pad-large-icon-full rotate: false - xy: 349, 1264 + xy: 163, 294 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 unloader rotate: false - xy: 1163, 479 + xy: 1051, 637 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 unloader-icon-full rotate: false - xy: 1163, 479 + xy: 1051, 637 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 vault rotate: false - xy: 852, 1561 + xy: 285, 119 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 vault-icon-full rotate: false - xy: 852, 1561 + xy: 285, 119 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 arc-heat rotate: false - xy: 877, 1461 + xy: 1979, 1793 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-1 rotate: false - xy: 1909, 1361 + xy: 1994, 1033 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-2 rotate: false - xy: 717, 490 + xy: 831, 409 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 block-3 rotate: false - xy: 423, 516 + xy: 541, 1531 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 block-4 rotate: false - xy: 163, 903 + xy: 1035, 1757 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 hail-heat rotate: false - xy: 609, 1298 + xy: 541, 1489 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 lancer-heat rotate: false - xy: 1280, 1559 + xy: 1045, 1397 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 meltdown-heat rotate: false - xy: 293, 1134 + xy: 155, 34 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 ripple-heat rotate: false - xy: 783, 458 + xy: 1913, 1401 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 salvo-heat rotate: false - xy: 723, 98 + xy: 979, 1133 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 salvo-panel-left rotate: false - xy: 855, 98 + xy: 1177, 1265 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 salvo-panel-right rotate: false - xy: 921, 98 + xy: 1111, 1199 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 scorch-heat rotate: false - xy: 1341, 819 + xy: 1077, 841 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 wave-liquid rotate: false - xy: 979, 693 + xy: 1186, 1001 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +command-center + rotate: false + xy: 815, 277 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +command-center-icon-full + rotate: false + xy: 815, 277 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 crawler-factory rotate: false - xy: 847, 1208 + xy: 515, 149 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 dagger-factory rotate: false - xy: 847, 1208 + xy: 515, 149 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 draug-factory rotate: false - xy: 847, 1208 + xy: 515, 149 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 phantom-factory rotate: false - xy: 847, 1208 + xy: 515, 149 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 spirit-factory rotate: false - xy: 847, 1208 + xy: 515, 149 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 wraith-factory rotate: false - xy: 847, 1208 + xy: 515, 149 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 crawler-factory-top rotate: false - xy: 847, 1076 + xy: 491, 1 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 dagger-factory-top rotate: false - xy: 943, 1485 + xy: 755, 13 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 draug-factory-top rotate: false - xy: 459, 54 + xy: 1589, 1397 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 fortress-factory rotate: false - xy: 489, 284 + xy: 1423, 1561 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 fortress-factory-top rotate: false - xy: 619, 480 + xy: 1619, 1659 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 ghoul-factory-top rotate: false - xy: 619, 480 + xy: 1619, 1659 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 titan-factory-top rotate: false - xy: 619, 480 + xy: 1619, 1659 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 ghoul-factory rotate: false - xy: 587, 186 + xy: 1717, 1597 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 phantom-factory-top rotate: false - xy: 1478, 1531 + xy: 781, 1256 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 repair-point-base rotate: false - xy: 1307, 853 + xy: 975, 841 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 revenant-factory rotate: false - xy: 423, 1134 + xy: 293, 705 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 revenant-factory-top rotate: false - xy: 423, 1004 + xy: 293, 575 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 spirit-factory-top rotate: false - xy: 1603, 1399 + xy: 1375, 1331 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 titan-factory rotate: false - xy: 805, 1340 + xy: 717, 181 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 wraith-factory-top rotate: false - xy: 1045, 1221 + xy: 1252, 1001 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 copper-wall rotate: false - xy: 1129, 523 + xy: 1690, 941 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 copper-wall-icon-full rotate: false - xy: 1129, 523 + xy: 1690, 941 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 copper-wall-large rotate: false - xy: 1098, 1691 + xy: 815, 145 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 copper-wall-large-icon-full rotate: false - xy: 1098, 1691 + xy: 815, 145 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 door rotate: false - xy: 1899, 1289 + xy: 1336, 891 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 door-icon-full rotate: false - xy: 1899, 1289 + xy: 1336, 891 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 door-large rotate: false - xy: 525, 120 + xy: 1391, 1397 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 door-large-icon-full rotate: false - xy: 525, 120 + xy: 1391, 1397 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 door-large-open rotate: false - xy: 591, 120 + xy: 1457, 1397 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 door-open rotate: false - xy: 1933, 1293 + xy: 1370, 891 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 phase-wall rotate: false - xy: 1205, 819 + xy: 931, 424 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 phase-wall-icon-full rotate: false - xy: 1205, 819 + xy: 931, 424 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 phase-wall-large rotate: false - xy: 1544, 1531 + xy: 847, 1256 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 phase-wall-large-icon-full rotate: false - xy: 1544, 1531 + xy: 847, 1256 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 scrap-wall-gigantic rotate: false - xy: 423, 874 + xy: 553, 835 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 scrap-wall-gigantic-icon-full rotate: false - xy: 423, 874 + xy: 553, 835 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 scrap-wall-huge1 rotate: false - xy: 783, 164 + xy: 537, 411 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 scrap-wall-huge-icon-full rotate: false - xy: 783, 164 + xy: 537, 411 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 scrap-wall-huge2 rotate: false - xy: 881, 458 + xy: 521, 313 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 scrap-wall-huge3 rotate: false - xy: 881, 360 + xy: 635, 377 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 scrap-wall-large1 rotate: false - xy: 855, 32 + xy: 1177, 1199 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 scrap-wall-large2 rotate: false - xy: 921, 32 + xy: 1111, 1133 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 scrap-wall-large3 rotate: false - xy: 1141, 1427 + xy: 1243, 1199 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 scrap-wall-large4 rotate: false - xy: 1207, 1427 + xy: 1177, 1133 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 scrap-wall1 rotate: false - xy: 1273, 717 + xy: 975, 705 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 scrap-wall-icon-full rotate: false - xy: 1273, 717 + xy: 975, 705 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 scrap-wall2 rotate: false - xy: 1307, 751 + xy: 1009, 739 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 scrap-wall3 rotate: false - xy: 1341, 785 + xy: 1043, 773 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 scrap-wall4 rotate: false - xy: 1375, 819 + xy: 1077, 807 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 scrap-wall5 rotate: false - xy: 1375, 819 + xy: 1077, 807 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 surge-wall rotate: false - xy: 1201, 649 + xy: 1111, 739 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 surge-wall-icon-full rotate: false - xy: 1201, 649 + xy: 1111, 739 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 surge-wall-large rotate: false - xy: 903, 1353 + xy: 1507, 1199 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 surge-wall-large-icon-full rotate: false - xy: 903, 1353 + xy: 1507, 1199 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 thorium-wall rotate: false - xy: 1201, 581 + xy: 1111, 705 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 thorium-wall-icon-full rotate: false - xy: 1201, 581 + xy: 1111, 705 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 thorium-wall-large rotate: false - xy: 913, 1221 + xy: 1507, 1133 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 thorium-wall-large-icon-full rotate: false - xy: 913, 1221 + xy: 1507, 1133 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 thruster rotate: false - xy: 293, 484 + xy: 553, 705 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 thruster-icon-full rotate: false - xy: 293, 484 + xy: 553, 705 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 titanium-wall rotate: false - xy: 1371, 547 + xy: 983, 569 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-wall-icon-full rotate: false - xy: 1371, 547 + xy: 983, 569 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-wall-large rotate: false - xy: 979, 1155 + xy: 724, 992 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 titanium-wall-large-icon-full rotate: false - xy: 979, 1155 + xy: 724, 992 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 bullet rotate: false - xy: 1029, 616 + xy: 1318, 1081 size: 52, 52 orig: 52, 52 offset: 0, 0 index: -1 bullet-back rotate: false - xy: 1029, 562 + xy: 1318, 1027 size: 52, 52 orig: 52, 52 offset: 0, 0 index: -1 casing rotate: false - xy: 903, 1425 + xy: 537, 557 size: 8, 16 orig: 8, 16 offset: 0, 0 index: -1 circle-shadow rotate: false - xy: 645, 1846 + xy: 1, 944 size: 201, 201 orig: 201, 201 offset: 0, 0 index: -1 error rotate: false - xy: 1083, 620 + xy: 1639, 1347 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 laser rotate: false - xy: 387, 42 + xy: 515, 215 size: 4, 48 orig: 4, 48 offset: 0, 0 index: -1 laser-end rotate: false - xy: 759, 1772 + xy: 285, 45 size: 72, 72 orig: 72, 72 offset: 0, 0 index: -1 minelaser rotate: false - xy: 155, 303 + xy: 419, 3 size: 4, 48 orig: 4, 48 offset: 0, 0 index: -1 minelaser-end rotate: false - xy: 950, 1683 + xy: 1966, 1901 size: 72, 72 orig: 72, 72 offset: 0, 0 index: -1 missile rotate: false - xy: 759, 1734 + xy: 581, 177 size: 36, 36 orig: 36, 36 offset: 0, 0 index: -1 missile-back rotate: false - xy: 1795, 1357 + xy: 848, 1849 size: 36, 36 orig: 36, 36 offset: 0, 0 index: -1 scale_marker rotate: false - xy: 459, 186 + xy: 639, 1721 size: 4, 4 orig: 4, 4 offset: 0, 0 index: -1 scorch1 rotate: false - xy: 1163, 377 + xy: 2019, 1799 size: 28, 100 orig: 28, 100 offset: 0, 0 index: -1 scorch2 rotate: false - xy: 1163, 275 + xy: 965, 390 size: 28, 100 orig: 28, 100 offset: 0, 0 index: -1 scorch3 rotate: false - xy: 1163, 173 + xy: 1281, 791 size: 28, 100 orig: 28, 100 offset: 0, 0 index: -1 scorch4 rotate: false - xy: 1409, 1023 + xy: 1281, 689 size: 28, 100 orig: 28, 100 offset: 0, 0 index: -1 scorch5 rotate: false - xy: 1409, 921 + xy: 947, 254 size: 28, 100 orig: 28, 100 offset: 0, 0 index: -1 shell rotate: false - xy: 1833, 1357 + xy: 1882, 1013 size: 36, 36 orig: 36, 36 offset: 0, 0 index: -1 shell-back rotate: false - xy: 1871, 1357 + xy: 1922, 1029 size: 36, 36 orig: 36, 36 offset: 0, 0 index: -1 shot rotate: false - xy: 1375, 717 + xy: 1111, 807 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 transfer rotate: false - xy: 155, 253 + xy: 417, 265 size: 4, 48 orig: 4, 48 offset: 0, 0 index: -1 transfer-arrow rotate: false - xy: 1163, 513 + xy: 1017, 603 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 transfer-end rotate: false - xy: 1024, 1683 + xy: 1945, 1827 size: 72, 72 orig: 72, 72 offset: 0, 0 index: -1 white rotate: false - xy: 645, 1727 + xy: 254, 1142 size: 3, 3 orig: 3, 3 offset: 0, 0 index: -1 arc rotate: false - xy: 609, 1264 + xy: 1945, 1793 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 arc-icon-full rotate: false - xy: 1029, 2 + xy: 755, 147 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 blast-drill-icon-full rotate: false - xy: 323, 1394 + xy: 323, 1355 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 char-icon-full rotate: false - xy: 1579, 1223 + xy: 1268, 909 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 cliffs-icon-full rotate: false - xy: 1110, 1135 + xy: 1302, 893 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conduit-icon-full rotate: false - xy: 1103, 863 + xy: 1554, 999 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 cracks-1-0 rotate: false - xy: 1129, 489 + xy: 1724, 941 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 cracks-1-1 rotate: false - xy: 1129, 455 + xy: 1758, 941 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 cracks-1-2 rotate: false - xy: 1129, 421 + xy: 1792, 941 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 cracks-1-3 rotate: false - xy: 1129, 387 + xy: 1826, 941 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 cracks-1-4 rotate: false - xy: 1129, 353 + xy: 1860, 941 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 cracks-1-5 rotate: false - xy: 1129, 319 + xy: 1648, 907 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 cracks-1-6 rotate: false - xy: 1129, 285 + xy: 1682, 907 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 cracks-1-7 rotate: false - xy: 1129, 251 + xy: 1716, 907 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 cracks-2-0 rotate: false - xy: 1016, 1617 + xy: 391, 199 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 cracks-2-1 rotate: false - xy: 1164, 1691 + xy: 383, 133 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 cracks-2-2 rotate: false - xy: 1230, 1691 + xy: 881, 277 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 cracks-2-3 rotate: false - xy: 1296, 1691 + xy: 881, 211 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 cracks-2-4 rotate: false - xy: 1362, 1691 + xy: 881, 145 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 cracks-2-5 rotate: false - xy: 1428, 1691 + xy: 425, 67 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 cracks-2-6 rotate: false - xy: 393, 126 + xy: 425, 1 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 cracks-2-7 rotate: false - xy: 847, 1274 + xy: 449, 133 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 cracks-3-0 rotate: false - xy: 656, 1634 + xy: 737, 1618 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 cracks-3-1 rotate: false - xy: 553, 1166 + xy: 639, 1520 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 cracks-3-2 rotate: false - xy: 553, 1068 + xy: 737, 1520 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 cracks-3-3 rotate: false - xy: 553, 970 + xy: 835, 1618 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 cracks-3-4 rotate: false - xy: 553, 872 + xy: 835, 1520 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 cracks-3-5 rotate: false - xy: 553, 774 + xy: 933, 1659 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 cracks-3-6 rotate: false - xy: 553, 676 + xy: 933, 1561 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 cracks-3-7 rotate: false - xy: 553, 578 + xy: 1031, 1659 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 cracks-4-0 rotate: false - xy: 848, 1757 + xy: 1685, 1793 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 cracks-4-1 rotate: false - xy: 978, 1757 + xy: 1815, 1793 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 cracks-4-2 rotate: false - xy: 1108, 1757 + xy: 259, 1225 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 cracks-4-3 rotate: false - xy: 1238, 1757 + xy: 389, 1225 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 cracks-4-4 rotate: false - xy: 1368, 1757 + xy: 259, 1095 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 cracks-4-5 rotate: false - xy: 1498, 1793 + xy: 389, 1095 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 cracks-4-6 rotate: false - xy: 1628, 1793 + xy: 204, 965 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 cracks-4-7 rotate: false - xy: 1758, 1789 + xy: 334, 965 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 cracks-5-0 rotate: false - xy: 848, 1887 + xy: 1, 782 size: 160, 160 orig: 160, 160 offset: 0, 0 index: -1 cracks-5-1 rotate: false - xy: 1, 839 + xy: 1010, 1887 size: 160, 160 orig: 160, 160 offset: 0, 0 index: -1 cracks-5-2 rotate: false - xy: 1010, 1887 + xy: 1, 620 size: 160, 160 orig: 160, 160 offset: 0, 0 index: -1 cracks-5-3 rotate: false - xy: 1, 677 + xy: 1172, 1887 size: 160, 160 orig: 160, 160 offset: 0, 0 index: -1 cracks-5-4 rotate: false - xy: 1172, 1887 + xy: 1, 458 size: 160, 160 orig: 160, 160 offset: 0, 0 index: -1 cracks-5-5 rotate: false - xy: 1, 515 + xy: 1334, 1887 size: 160, 160 orig: 160, 160 offset: 0, 0 index: -1 cracks-5-6 rotate: false - xy: 1334, 1887 + xy: 1, 296 size: 160, 160 orig: 160, 160 offset: 0, 0 index: -1 cracks-5-7 rotate: false - xy: 1, 353 + xy: 1496, 1887 size: 160, 160 orig: 160, 160 offset: 0, 0 index: -1 craters-icon-full rotate: false - xy: 1129, 217 - size: 32, 32 - orig: 32, 32 + xy: 1, 1147 + size: 256, 256 + orig: 256, 256 offset: 0, 0 index: -1 crawler-factory-icon-full rotate: false - xy: 847, 1142 + xy: 491, 67 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 cryofluidmixer-icon-full rotate: false - xy: 847, 944 + xy: 557, 17 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 cultivator-icon-full rotate: false - xy: 847, 680 + xy: 689, 49 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 cyclone rotate: false - xy: 99, 3 + xy: 1031, 1561 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 cyclone-icon-full rotate: false - xy: 197, 25 + xy: 1129, 1659 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 dagger-factory-icon-full rotate: false - xy: 877, 1495 + xy: 887, 79 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 dark-metal-icon-full rotate: false - xy: 1129, 183 + xy: 1750, 907 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 dark-panel-1-icon-full rotate: false - xy: 1899, 1323 + xy: 1784, 907 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 dark-panel-2-icon-full rotate: false - xy: 1933, 1327 + xy: 1818, 907 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 dark-panel-3-icon-full rotate: false - xy: 1967, 1327 + xy: 1852, 907 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 dark-panel-4-icon-full rotate: false - xy: 2001, 1327 + xy: 1648, 873 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 dark-panel-5-icon-full rotate: false - xy: 1695, 1281 + xy: 1682, 873 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 dark-panel-6-icon-full rotate: false - xy: 1729, 1285 + xy: 1716, 873 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 darksand-icon-full rotate: false - xy: 1763, 1285 + xy: 1750, 873 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 darksand-tainted-water-icon-full rotate: false - xy: 1797, 1289 + xy: 1784, 873 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 darksand-water-icon-full rotate: false - xy: 1831, 1289 + xy: 1818, 873 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 deepwater-icon-full rotate: false - xy: 1865, 1289 + xy: 1852, 873 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 draug-factory-icon-full rotate: false - xy: 657, 120 + xy: 1523, 1397 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 dunerocks-icon-full rotate: false - xy: 1967, 1293 + xy: 1404, 873 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 duo rotate: false - xy: 2001, 1293 + xy: 1438, 863 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 duo-icon-full rotate: false - xy: 1545, 1181 + xy: 1472, 863 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 fortress-factory-icon-full rotate: false - xy: 489, 186 + xy: 1521, 1561 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 fuse rotate: false - xy: 587, 382 + xy: 1619, 1561 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 fuse-icon-full rotate: false - xy: 587, 284 + xy: 1717, 1695 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 ghoul-factory-icon-full rotate: false - xy: 685, 382 + xy: 1815, 1695 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 grass-icon-full rotate: false - xy: 1579, 1189 + xy: 1506, 863 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 hail rotate: false - xy: 1161, 1193 + xy: 1540, 863 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 hail-icon-full rotate: false - xy: 1195, 1193 + xy: 1574, 863 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 holostone-icon-full rotate: false - xy: 1229, 1193 + xy: 1608, 863 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 hotrock-icon-full rotate: false - xy: 1263, 1193 + xy: 1894, 961 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ice-icon-full rotate: false - xy: 1297, 1193 + xy: 1928, 961 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ice-snow-icon-full rotate: false - xy: 1331, 1193 + xy: 1894, 927 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 icerocks-icon-full rotate: false - xy: 1365, 1193 + xy: 1928, 927 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ignarock-icon-full rotate: false - xy: 1399, 1193 + xy: 1886, 893 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 impact-reactor-icon-full rotate: false - xy: 1628, 1663 + xy: 464, 965 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 item-blast-compound-medium rotate: false - xy: 583, 1412 + xy: 789, 155 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 item-blast-compound-small rotate: false - xy: 583, 1394 + xy: 1894, 995 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 item-blast-compound-xlarge rotate: false - xy: 987, 127 + xy: 1, 2 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 item-blast-compound-xxlarge rotate: false - xy: 1079, 354 + xy: 1689, 1301 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 item-coal-medium rotate: false - xy: 847, 654 + xy: 1658, 1897 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 item-coal-small rotate: false - xy: 1160, 1175 + xy: 353, 1 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 item-coal-xlarge rotate: false - xy: 1561, 1257 + xy: 1922, 1109 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 item-coal-xxlarge rotate: false - xy: 1079, 304 + xy: 1739, 1351 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 item-copper-medium rotate: false - xy: 873, 654 + xy: 905, 1731 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 item-copper-small rotate: false - xy: 155, 105 + xy: 371, 1 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 item-copper-xlarge rotate: false - xy: 1611, 1307 + xy: 43, 2 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 item-copper-xxlarge rotate: false - xy: 1079, 254 + xy: 1689, 1251 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 item-graphite-medium rotate: false - xy: 1934, 1925 + xy: 1685, 1767 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 item-graphite-small rotate: false - xy: 852, 1543 + xy: 204, 947 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 item-graphite-xlarge rotate: false - xy: 987, 85 + xy: 1922, 1067 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 item-graphite-xxlarge rotate: false - xy: 1079, 204 + xy: 1739, 1301 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 item-lead-medium rotate: false - xy: 521, 588 + xy: 651, 679 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 item-lead-small rotate: false - xy: 723, 168 + xy: 1945, 1905 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 item-lead-xlarge rotate: false - xy: 1029, 120 + xy: 1964, 1109 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 item-lead-xxlarge rotate: false - xy: 1079, 154 + xy: 1789, 1351 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 item-metaglass-medium rotate: false - xy: 423, 490 + xy: 391, 289 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 item-metaglass-small rotate: false - xy: 913, 559 + xy: 913, 1502 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 item-metaglass-xlarge rotate: false - xy: 1653, 1307 + xy: 85, 2 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 item-metaglass-xxlarge rotate: false - xy: 1101, 1369 + xy: 1689, 1201 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 item-phase-fabric-medium rotate: false - xy: 219, 1164 + xy: 583, 1362 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 item-phase-fabric-small rotate: false - xy: 1451, 1409 + xy: 886, 1869 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 item-phase-fabric-xlarge rotate: false - xy: 987, 43 + xy: 1964, 1067 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 item-phase-fabric-xxlarge rotate: false - xy: 1151, 1377 + xy: 1739, 1251 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 item-plastanium-medium rotate: false - xy: 361, 66 + xy: 649, 1098 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 item-plastanium-small rotate: false - xy: 197, 7 + xy: 2028, 1049 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 item-plastanium-xlarge rotate: false - xy: 987, 1 + xy: 2006, 1109 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 item-plastanium-xxlarge rotate: false - xy: 1201, 1377 + xy: 1789, 1301 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 item-pyratite-medium rotate: false - xy: 1111, 1459 + xy: 724, 966 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 item-pyratite-small rotate: false - xy: 877, 1443 + xy: 1311, 875 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 item-pyratite-xlarge rotate: false - xy: 1029, 78 + xy: 2006, 1067 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 item-pyratite-xxlarge rotate: false - xy: 1251, 1377 + xy: 1839, 1351 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 item-sand-medium rotate: false - xy: 2006, 1463 + xy: 1639, 1155 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 item-sand-small rotate: false - xy: 895, 1443 + xy: 391, 271 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 item-sand-xlarge rotate: false - xy: 1029, 36 + xy: 623, 7 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 item-sand-xxlarge rotate: false - xy: 1301, 1377 + xy: 1739, 1201 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 item-scrap-medium rotate: false - xy: 1197, 487 + xy: 127, 18 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 item-scrap-small rotate: false - xy: 1103, 675 + xy: 675, 1106 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 item-scrap-xlarge rotate: false - xy: 1071, 112 + xy: 665, 7 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 item-scrap-xxlarge rotate: false - xy: 1351, 1377 + xy: 1789, 1251 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 item-silicon-medium rotate: false - xy: 1231, 521 + xy: 581, 151 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 item-silicon-small rotate: false - xy: 1977, 1377 + xy: 750, 974 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 item-silicon-xlarge rotate: false - xy: 1071, 70 + xy: 707, 7 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 item-silicon-xxlarge rotate: false - xy: 1401, 1377 + xy: 1839, 1301 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 item-spore-pod-medium rotate: false - xy: 1129, 157 + xy: 393, 27 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 item-spore-pod-small rotate: false - xy: 1986, 1933 + xy: 1665, 1163 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 item-spore-pod-xlarge rotate: false - xy: 1071, 28 + xy: 1672, 1009 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 item-spore-pod-xxlarge rotate: false - xy: 1111, 1319 + xy: 1889, 1351 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 item-surge-alloy-medium rotate: false - xy: 1433, 1201 + xy: 393, 1 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 item-surge-alloy-small rotate: false - xy: 475, 498 + xy: 1639, 1137 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 item-surge-alloy-xlarge rotate: false - xy: 1461, 1207 + xy: 1714, 1009 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 item-surge-alloy-xxlarge rotate: false - xy: 1111, 1269 + xy: 1789, 1201 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 item-thorium-medium rotate: false - xy: 1409, 895 + xy: 1017, 577 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 item-thorium-small rotate: false - xy: 271, 1172 + xy: 983, 525 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 item-thorium-xlarge rotate: false - xy: 1503, 1207 + xy: 1756, 1009 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 item-thorium-xxlarge rotate: false - xy: 1111, 1219 + xy: 1839, 1251 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 item-titanium-medium rotate: false - xy: 1960, 1925 + xy: 1051, 611 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 item-titanium-small rotate: false - xy: 1283, 529 + xy: 1145, 687 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 item-titanium-xlarge rotate: false - xy: 1711, 1353 + xy: 1798, 1009 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 item-titanium-xxlarge rotate: false - xy: 1110, 1169 + xy: 1889, 1301 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 lancer rotate: false - xy: 1346, 1625 + xy: 979, 1397 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 lancer-icon-full rotate: false - xy: 1412, 1625 + xy: 1111, 1397 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 laser-drill-icon-full rotate: false - xy: 295, 92 + xy: 683, 867 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 liquid-router-icon-full rotate: false - xy: 1171, 955 + xy: 907, 832 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 liquid-tank-icon-full rotate: false - xy: 651, 1144 + xy: 1227, 1463 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 magmarock-icon-full rotate: false - xy: 1205, 955 + xy: 907, 764 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 mass-driver rotate: false - xy: 651, 850 + xy: 1521, 1463 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 mass-driver-icon-full rotate: false - xy: 651, 654 + xy: 1717, 1499 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 mech-icon-alpha-mech rotate: false - xy: 1161, 1227 + xy: 1939, 1301 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 mech-icon-dart-ship rotate: false - xy: 1211, 1277 + xy: 1889, 1201 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 mech-icon-delta-mech rotate: false - xy: 1261, 1327 + xy: 1939, 1251 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 mech-icon-glaive-ship rotate: false - xy: 1045, 960 + xy: 1655, 1405 size: 56, 56 orig: 56, 56 offset: 0, 0 index: -1 mech-icon-javelin-ship rotate: false - xy: 1211, 1227 + xy: 1939, 1201 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 mech-icon-omega-mech rotate: false - xy: 584, 1539 + xy: 846, 934 size: 56, 56 orig: 56, 56 offset: 0, 0 index: -1 mech-icon-tau-mech rotate: false - xy: 1045, 902 + xy: 781, 731 size: 56, 56 orig: 56, 56 offset: 0, 0 index: -1 mech-icon-trident-ship rotate: false - xy: 1045, 844 + xy: 781, 673 size: 56, 56 orig: 56, 56 offset: 0, 0 index: -1 mechanical-drill-icon-full rotate: false - xy: 1412, 1559 + xy: 1243, 1397 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 meltdown rotate: false - xy: 479, 1264 + xy: 155, 164 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 meltdown-icon-full rotate: false - xy: 293, 1004 + xy: 293, 835 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 metal-floor-2-icon-full rotate: false - xy: 1171, 887 + xy: 847, 628 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 metal-floor-3-icon-full rotate: false - xy: 1205, 921 + xy: 881, 662 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 metal-floor-5-icon-full rotate: false - xy: 1239, 955 + xy: 847, 594 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 metal-floor-damaged-icon-full rotate: false - xy: 1273, 989 + xy: 881, 628 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 metal-floor-icon-full rotate: false - xy: 1307, 1023 + xy: 847, 560 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 moss-icon-full rotate: false - xy: 1341, 1057 + xy: 881, 594 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 oil-extractor-icon-full rotate: false - xy: 749, 1046 + xy: 1815, 1401 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 ore-coal-icon-full rotate: false - xy: 1375, 1091 + xy: 847, 526 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-coal-icon-medium rotate: false - xy: 1375, 1091 + xy: 847, 526 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-coal-icon-large rotate: false - xy: 1261, 1277 + xy: 1989, 1351 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 ore-coal-icon-small rotate: false - xy: 449, 490 + xy: 1085, 645 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 ore-copper-icon-full rotate: false - xy: 1171, 853 + xy: 881, 560 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-copper-icon-medium rotate: false - xy: 1171, 853 + xy: 881, 560 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-copper-icon-large rotate: false - xy: 1311, 1327 + xy: 1989, 1301 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 ore-copper-icon-small rotate: false - xy: 245, 1164 + xy: 983, 543 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 ore-lead-icon-full rotate: false - xy: 1205, 887 + xy: 847, 492 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-lead-icon-medium rotate: false - xy: 1205, 887 + xy: 847, 492 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-lead-icon-large rotate: false - xy: 1261, 1227 + xy: 1989, 1251 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 ore-lead-icon-small rotate: false - xy: 361, 40 + xy: 1119, 679 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 ore-scrap-icon-full rotate: false - xy: 1239, 921 + xy: 881, 526 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-scrap-icon-medium rotate: false - xy: 1239, 921 + xy: 881, 526 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-scrap-icon-large rotate: false - xy: 1311, 1277 + xy: 1989, 1201 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 ore-scrap-icon-small rotate: false - xy: 1111, 1433 + xy: 947, 228 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 ore-thorium-icon-full rotate: false - xy: 1273, 955 + xy: 881, 492 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-thorium-icon-medium rotate: false - xy: 1273, 955 + xy: 881, 492 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-thorium-icon-large rotate: false - xy: 1361, 1327 + xy: 1689, 1151 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 ore-thorium-icon-small rotate: false - xy: 1257, 521 + xy: 965, 364 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 ore-titanium-icon-full rotate: false - xy: 1307, 989 + xy: 915, 662 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-titanium-icon-medium rotate: false - xy: 1307, 989 + xy: 915, 662 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-titanium-icon-large rotate: false - xy: 1311, 1227 + xy: 1739, 1151 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 ore-titanium-icon-small rotate: false - xy: 1409, 869 + xy: 609, 1362 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 pebbles-icon-full rotate: false - xy: 1375, 1057 + xy: 915, 594 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 phantom-factory-icon-full rotate: false - xy: 1940, 1593 + xy: 715, 1256 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 phase-weaver-icon-full rotate: false - xy: 1742, 1527 + xy: 649, 1124 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 pine-icon-full rotate: false - xy: 1361, 1277 + xy: 1789, 1151 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 pneumatic-drill-icon-full rotate: false - xy: 1214, 1493 + xy: 979, 1265 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 power-source-icon-full rotate: false - xy: 1307, 921 + xy: 941, 866 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 pulse-conduit-icon-full rotate: false - xy: 1375, 989 + xy: 941, 798 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 pulverizer-icon-full rotate: false - xy: 1171, 717 + xy: 949, 526 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 repair-point rotate: false - xy: 1273, 819 + xy: 1009, 875 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 repair-point-icon-full rotate: false - xy: 1341, 887 + xy: 1043, 875 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 revenant-factory-icon-full rotate: false - xy: 293, 874 + xy: 423, 835 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 ripple rotate: false - xy: 815, 556 + xy: 1913, 1499 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 ripple-icon-full rotate: false - xy: 783, 360 + xy: 749, 573 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 rock-icon-full rotate: false - xy: 1411, 1277 + xy: 1939, 1151 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 rocks-icon-full rotate: false - xy: 1375, 921 + xy: 975, 807 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 salt-icon-full rotate: false - xy: 1273, 785 + xy: 975, 773 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 saltrocks-icon-full rotate: false - xy: 1307, 819 + xy: 1009, 807 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 salvo rotate: false - xy: 1940, 1461 + xy: 1045, 1199 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 salvo-icon-full rotate: false - xy: 789, 98 + xy: 1243, 1331 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 sand-boulder-icon-full rotate: false - xy: 1341, 853 + xy: 1043, 841 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 sand-icon-full rotate: false - xy: 1375, 887 + xy: 1111, 875 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 sand-water-icon-full rotate: false - xy: 1239, 717 + xy: 975, 739 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 sandrocks-icon-full rotate: false - xy: 1273, 751 + xy: 1009, 773 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 scatter rotate: false - xy: 723, 32 + xy: 1045, 1133 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 scatter-icon-full rotate: false - xy: 789, 32 + xy: 1243, 1265 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 scorch rotate: false - xy: 1307, 785 + xy: 1043, 807 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 scorch-icon-full rotate: false - xy: 1375, 853 + xy: 1145, 875 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 scrap-wall-large-icon-full rotate: false - xy: 1273, 1427 + xy: 1243, 1133 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 shale-boulder-icon-full rotate: false - xy: 1307, 717 + xy: 1111, 841 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 shale-icon-full rotate: false - xy: 1341, 751 + xy: 1179, 875 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 shalerocks-icon-full rotate: false - xy: 1375, 785 + xy: 1009, 705 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 shock-mine-icon-full rotate: false - xy: 1375, 751 + xy: 1077, 773 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 shrubs-icon-full rotate: false - xy: 1171, 683 + xy: 1145, 841 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 snow-icon-full rotate: false - xy: 1205, 683 + xy: 1213, 875 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 snow-pine-icon-full rotate: false - xy: 1461, 1349 + xy: 1672, 1101 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 snowrock-icon-full rotate: false - xy: 1511, 1349 + xy: 1672, 1051 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 snowrocks-icon-full rotate: false - xy: 1239, 683 + xy: 1043, 705 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 spawn-icon-full rotate: false - xy: 1341, 683 + xy: 1145, 807 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 spectre rotate: false - xy: 293, 614 + xy: 293, 445 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 spectre-icon-full rotate: false - xy: 423, 744 + xy: 423, 575 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 spirit-factory-icon-full rotate: false - xy: 1537, 1399 + xy: 1309, 1135 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 spore-cluster-icon-full rotate: false - xy: 1753, 1353 + xy: 1840, 1009 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 spore-moss-icon-full rotate: false - xy: 1375, 683 + xy: 1179, 841 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 spore-pine-icon-full rotate: false - xy: 1561, 1349 + xy: 1722, 1051 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 spore-press-icon-full rotate: false - xy: 1933, 1395 + xy: 1507, 1331 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 sporerocks-icon-full rotate: false - xy: 1167, 649 + xy: 1247, 875 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 stone-icon-full rotate: false - xy: 1167, 615 + xy: 1077, 705 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 swarmer rotate: false - xy: 969, 1353 + xy: 1573, 1265 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 swarmer-icon-full rotate: false - xy: 1035, 1353 + xy: 1573, 1199 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 tainted-water-icon-full rotate: false - xy: 1167, 581 + xy: 1145, 773 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 tar-icon-full rotate: false - xy: 1201, 615 + xy: 1179, 807 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 tendrils-icon-full rotate: false - xy: 1235, 649 + xy: 1213, 841 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titan-factory-icon-full rotate: false - xy: 852, 1659 + xy: 293, 217 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 unit-icon-chaos-array rotate: false - xy: 423, 614 + xy: 293, 315 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 unit-icon-crawler rotate: false - xy: 1511, 1249 + xy: 1822, 1051 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 unit-icon-dagger rotate: false - xy: 1561, 1299 + xy: 1872, 1101 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 unit-icon-eradicator rotate: false - xy: 1, 101 + xy: 1812, 1923 size: 152, 124 orig: 152, 124 offset: 0, 0 index: -1 unit-icon-eruptor rotate: false - xy: 979, 1023 + xy: 856, 992 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 unit-icon-fortress rotate: false - xy: 913, 957 + xy: 922, 1067 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 unit-icon-titan rotate: false - xy: 979, 957 + xy: 988, 1067 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 water-extractor-icon-full rotate: false - xy: 979, 891 + xy: 1054, 1067 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 water-icon-full rotate: false - xy: 1197, 513 + xy: 1085, 671 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 wave rotate: false - xy: 979, 759 + xy: 1186, 1067 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 wave-icon-full rotate: false - xy: 913, 693 + xy: 1120, 1001 size: 64, 64 orig: 64, 64 offset: 0, 0 @@ -4570,462 +4584,462 @@ white-tree-icon-full index: -1 wraith-factory-icon-full rotate: false - xy: 1045, 1287 + xy: 1252, 1067 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 item-blast-compound rotate: false - xy: 1212, 1159 + xy: 1886, 859 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-coal rotate: false - xy: 1246, 1159 + xy: 1920, 859 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-copper rotate: false - xy: 1280, 1159 + xy: 1954, 995 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-graphite rotate: false - xy: 1314, 1159 + xy: 1988, 999 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-lead rotate: false - xy: 1348, 1159 + xy: 1962, 961 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-metaglass rotate: false - xy: 1382, 1159 + xy: 1962, 927 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-phase-fabric rotate: false - xy: 1178, 1125 + xy: 1954, 893 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-plastanium rotate: false - xy: 1212, 1125 + xy: 1954, 859 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-pyratite rotate: false - xy: 1246, 1125 + xy: 1996, 965 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-sand rotate: false - xy: 1280, 1125 + xy: 1996, 931 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-scrap rotate: false - xy: 1314, 1125 + xy: 1988, 893 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-silicon rotate: false - xy: 1348, 1125 + xy: 1988, 859 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-spore-pod rotate: false - xy: 1171, 1091 + xy: 880, 900 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-surge-alloy rotate: false - xy: 1171, 1057 + xy: 914, 900 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-thorium rotate: false - xy: 1205, 1091 + xy: 839, 866 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-titanium rotate: false - xy: 1171, 1023 + xy: 839, 832 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 liquid-cryofluid rotate: false - xy: 1171, 989 + xy: 907, 866 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 liquid-oil rotate: false - xy: 1239, 1057 + xy: 839, 764 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 liquid-slag rotate: false - xy: 1273, 1057 + xy: 907, 798 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 liquid-water rotate: false - xy: 1171, 921 + xy: 873, 730 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 alpha-mech rotate: false - xy: 1999, 1411 + xy: 259, 1355 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 alpha-mech-base rotate: false - xy: 1999, 1361 + xy: 204, 1097 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 alpha-mech-leg rotate: false - xy: 979, 527 + xy: 1372, 1083 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 delta-mech rotate: false - xy: 1029, 262 + xy: 1310, 927 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 delta-mech-base rotate: false - xy: 979, 169 + xy: 1360, 925 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 delta-mech-leg rotate: false - xy: 1029, 212 + xy: 1622, 1083 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 omega-mech rotate: false - xy: 1045, 786 + xy: 904, 934 size: 56, 56 orig: 56, 56 offset: 0, 0 index: -1 omega-mech-armor rotate: false - xy: 1742, 1593 + xy: 847, 1322 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 omega-mech-base rotate: false - xy: 1045, 728 + xy: 962, 943 size: 56, 56 orig: 56, 56 offset: 0, 0 index: -1 omega-mech-leg rotate: false - xy: 1045, 670 + xy: 1020, 943 size: 56, 56 orig: 56, 56 offset: 0, 0 index: -1 tau-mech rotate: false - xy: 971, 635 + xy: 1194, 943 size: 56, 56 orig: 56, 56 offset: 0, 0 index: -1 tau-mech-base rotate: false - xy: 1511, 1299 + xy: 1772, 1051 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 tau-mech-leg rotate: false - xy: 1611, 1349 + xy: 1822, 1101 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 dart-ship rotate: false - xy: 979, 219 + xy: 1368, 975 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 glaive-ship rotate: false - xy: 526, 1539 + xy: 457, 207 size: 56, 56 orig: 56, 56 offset: 0, 0 index: -1 javelin-ship rotate: false - xy: 1161, 1327 + xy: 1939, 1351 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 javelin-ship-shield rotate: false - xy: 1161, 1277 + xy: 1839, 1201 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 trident-ship rotate: false - xy: 971, 577 + xy: 1252, 943 size: 56, 56 orig: 56, 56 offset: 0, 0 index: -1 blank rotate: false - xy: 1129, 154 + xy: 848, 1846 size: 1, 1 orig: 1, 1 offset: 0, 0 index: -1 circle rotate: false - xy: 323, 1524 + xy: 645, 1846 size: 201, 201 orig: 201, 201 offset: 0, 0 index: -1 shape-3 rotate: false - xy: 1045, 1156 + xy: 781, 927 size: 63, 63 orig: 63, 63 offset: 0, 0 index: -1 chaos-array rotate: false - xy: 163, 773 + xy: 1165, 1757 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 chaos-array-base rotate: false - xy: 163, 643 + xy: 1295, 1757 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 chaos-array-leg rotate: false - xy: 163, 513 + xy: 1425, 1757 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 crawler rotate: false - xy: 979, 369 + xy: 1472, 1033 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 crawler-base rotate: false - xy: 1029, 412 + xy: 1522, 1083 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 crawler-leg rotate: false - xy: 979, 319 + xy: 1522, 1033 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 dagger rotate: false - xy: 1029, 362 + xy: 1572, 1083 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 dagger-base rotate: false - xy: 979, 269 + xy: 1572, 1033 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 dagger-leg rotate: false - xy: 1029, 312 + xy: 1318, 977 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 draug rotate: false - xy: 1029, 162 + xy: 1622, 1033 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 eradicator rotate: false - xy: 1496, 1923 + xy: 1, 170 size: 152, 124 orig: 152, 124 offset: 0, 0 index: -1 eradicator-base rotate: false - xy: 1, 227 + xy: 1658, 1923 size: 152, 124 orig: 152, 124 offset: 0, 0 index: -1 eradicator-leg rotate: false - xy: 1650, 1923 + xy: 1, 44 size: 152, 124 orig: 152, 124 offset: 0, 0 index: -1 eruptor rotate: false - xy: 591, 54 + xy: 715, 1454 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 eruptor-base rotate: false - xy: 657, 54 + xy: 781, 1454 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 eruptor-leg rotate: false - xy: 1082, 1617 + xy: 847, 1454 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 fortress rotate: false - xy: 1082, 1551 + xy: 583, 1454 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 fortress-base rotate: false - xy: 1075, 1485 + xy: 583, 1388 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 titan-base rotate: false - xy: 1075, 1485 + xy: 583, 1388 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 fortress-leg rotate: false - xy: 1148, 1625 + xy: 649, 1388 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 ghoul rotate: false - xy: 219, 1190 + xy: 1966, 1975 size: 72, 72 orig: 72, 72 offset: 0, 0 index: -1 lich rotate: false - xy: 1, 1163 + xy: 323, 1485 size: 216, 240 orig: 216, 240 offset: 0, 0 index: -1 phantom rotate: false - xy: 913, 635 + xy: 1078, 943 size: 56, 56 orig: 56, 56 offset: 0, 0 index: -1 power-cell rotate: false - xy: 913, 577 + xy: 1136, 943 size: 56, 56 orig: 56, 56 offset: 0, 0 @@ -5039,147 +5053,147 @@ reaper index: -1 revenant rotate: false - xy: 645, 1732 + xy: 423, 461 size: 112, 112 orig: 112, 112 offset: 0, 0 index: -1 spirit rotate: false - xy: 1461, 1299 + xy: 1722, 1101 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 titan rotate: false - xy: 979, 1221 + xy: 1573, 1133 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 titan-leg rotate: false - xy: 913, 1155 + xy: 724, 1058 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 wraith rotate: false - xy: 1661, 1349 + xy: 1872, 1051 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 artillery-equip rotate: false - xy: 979, 469 + xy: 1372, 1025 size: 48, 56 orig: 48, 56 offset: 0, 0 index: -1 blaster-equip rotate: false - xy: 1029, 512 + xy: 1422, 1083 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 bomber-equip rotate: false - xy: 979, 419 + xy: 1422, 1033 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 missiles-equip rotate: false - xy: 979, 419 + xy: 1422, 1033 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 chain-blaster-equip rotate: false - xy: 1029, 462 + xy: 1472, 1083 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 chaos-equip rotate: false - xy: 1045, 1018 + xy: 781, 789 size: 56, 136 orig: 56, 136 offset: 0, 0 index: -1 eradication-equip rotate: false - xy: 391, 192 + xy: 1325, 1563 size: 96, 192 orig: 96, 192 offset: 0, 0 index: -1 eruption-equip rotate: false - xy: 1083, 562 + xy: 1639, 1289 size: 48, 56 orig: 48, 56 offset: 0, 0 index: -1 flakgun-equip rotate: false - xy: 1079, 512 + xy: 1639, 1239 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 flamethrower-equip rotate: false - xy: 1079, 454 + xy: 1639, 1181 size: 48, 56 orig: 48, 56 offset: 0, 0 index: -1 heal-blaster-equip rotate: false - xy: 1079, 404 + xy: 1689, 1351 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 lich-missiles-equip rotate: false - xy: 1211, 1327 + xy: 1889, 1251 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 reaper-gun-equip rotate: false - xy: 1361, 1227 + xy: 1839, 1151 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 revenant-missiles-equip rotate: false - xy: 1411, 1327 + xy: 1889, 1151 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 shockgun-equip rotate: false - xy: 1411, 1227 + xy: 1989, 1151 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 swarmer-equip rotate: false - xy: 1461, 1249 + xy: 1772, 1101 size: 48, 48 orig: 48, 48 offset: 0, 0 @@ -5192,1966 +5206,2063 @@ filter: Nearest,Nearest repeat: none alloy-smelter-icon-editor rotate: false - xy: 1, 23 + xy: 453, 651 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 arc-icon-editor rotate: false - xy: 261, 145 + xy: 2015, 973 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 battery-icon-editor rotate: false - xy: 569, 399 + xy: 2015, 939 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 battery-large-icon-editor rotate: false - xy: 745, 927 + xy: 581, 779 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 blast-drill-icon-editor rotate: false - xy: 1, 251 + xy: 323, 619 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 blast-mixer-icon-editor rotate: false - xy: 745, 861 + xy: 1, 5 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 block-border-editor rotate: false - xy: 469, 145 + xy: 865, 679 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 bridge-conduit-icon-editor rotate: false - xy: 603, 399 + xy: 651, 481 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 bridge-conveyor-icon-editor rotate: false - xy: 503, 145 + xy: 815, 587 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 char-icon-editor rotate: false - xy: 637, 399 + xy: 899, 679 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-char1 rotate: false - xy: 637, 399 + xy: 899, 679 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 clear-editor rotate: false - xy: 261, 378 + xy: 1231, 906 size: 1, 1 orig: 1, 1 offset: 0, 0 index: -1 cliffs-icon-editor rotate: false - xy: 671, 399 + xy: 685, 481 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 coal-centrifuge-icon-editor rotate: false - xy: 811, 861 + xy: 1757, 843 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 combustion-generator-icon-editor rotate: false - xy: 295, 13 + xy: 933, 679 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 +command-center-icon-editor + rotate: false + xy: 1823, 843 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 conduit-icon-editor rotate: false - xy: 329, 13 + xy: 967, 679 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 container-icon-editor rotate: false - xy: 877, 861 + xy: 1889, 843 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 conveyor-icon-editor rotate: false - xy: 427, 103 + xy: 1001, 679 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 copper-wall-icon-editor rotate: false - xy: 537, 145 + xy: 1035, 679 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 copper-wall-large-icon-editor rotate: false - xy: 943, 861 + xy: 67, 5 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 core-foundation-icon-editor rotate: false - xy: 323, 733 + xy: 581, 877 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 core-nucleus-icon-editor rotate: false - xy: 323, 863 + xy: 1, 201 size: 160, 160 orig: 160, 160 offset: 0, 0 index: -1 core-shard-icon-editor rotate: false - xy: 99, 23 + xy: 323, 391 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 craters-icon-editor rotate: false - xy: 363, 29 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-craters1 - rotate: false - xy: 363, 29 - size: 32, 32 - orig: 32, 32 + xy: 323, 749 + size: 256, 256 + orig: 256, 256 offset: 0, 0 index: -1 crawler-factory-icon-editor rotate: false - xy: 1009, 861 + xy: 1955, 843 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 cryofluidmixer-icon-editor rotate: false - xy: 1075, 861 + xy: 163, 167 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 cultivator-icon-editor rotate: false - xy: 1141, 861 + xy: 229, 167 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 cyclone-icon-editor rotate: false - xy: 843, 927 + xy: 1231, 909 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 dagger-factory-icon-editor rotate: false - xy: 1207, 861 + xy: 131, 101 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 dark-metal-icon-editor rotate: false - xy: 411, 69 + xy: 1069, 679 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 dark-panel-1-icon-editor rotate: false - xy: 569, 365 + xy: 1103, 679 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-dark-panel-1 rotate: false - xy: 569, 365 + xy: 1103, 679 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 dark-panel-2-icon-editor rotate: false - xy: 603, 365 + xy: 1137, 679 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-dark-panel-2 rotate: false - xy: 603, 365 + xy: 1137, 679 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 dark-panel-3-icon-editor rotate: false - xy: 637, 365 + xy: 1171, 679 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-dark-panel-3 rotate: false - xy: 637, 365 + xy: 1171, 679 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 dark-panel-4-icon-editor rotate: false - xy: 671, 365 + xy: 1205, 679 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-dark-panel-4 rotate: false - xy: 671, 365 + xy: 1205, 679 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 dark-panel-5-icon-editor rotate: false - xy: 555, 331 + xy: 133, 1 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-dark-panel-5 rotate: false - xy: 555, 331 + xy: 133, 1 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 dark-panel-6-icon-editor rotate: false - xy: 555, 297 + xy: 167, 1 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-dark-panel-6 rotate: false - xy: 555, 297 + xy: 167, 1 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 darksand-icon-editor rotate: false - xy: 589, 331 + xy: 201, 1 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-darksand1 rotate: false - xy: 589, 331 + xy: 201, 1 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 darksand-tainted-water-icon-editor rotate: false - xy: 555, 263 + xy: 235, 1 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-darksand-tainted-water rotate: false - xy: 555, 263 + xy: 235, 1 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 darksand-water-icon-editor rotate: false - xy: 589, 297 + xy: 269, 1 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-darksand-water rotate: false - xy: 589, 297 + xy: 269, 1 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 dart-mech-pad-icon-editor rotate: false - xy: 1273, 861 + xy: 197, 101 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 deepwater-icon-editor rotate: false - xy: 623, 331 + xy: 719, 481 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-deepwater rotate: false - xy: 623, 331 + xy: 719, 481 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 delta-mech-pad-icon-editor rotate: false - xy: 1339, 861 + xy: 133, 35 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 differential-generator-icon-editor rotate: false - xy: 941, 927 + xy: 453, 553 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 distributor-icon-editor rotate: false - xy: 1405, 861 + xy: 199, 35 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 door-icon-editor rotate: false - xy: 555, 229 + xy: 303, 1 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 door-large-icon-editor rotate: false - xy: 1471, 861 + xy: 263, 101 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 draug-factory-icon-editor rotate: false - xy: 1537, 861 + xy: 265, 35 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 dunerocks-icon-editor rotate: false - xy: 589, 263 + xy: 553, 431 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 duo-icon-editor rotate: false - xy: 623, 297 + xy: 553, 397 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-char2 rotate: false - xy: 657, 331 + xy: 587, 431 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-char3 rotate: false - xy: 555, 195 + xy: 587, 397 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-clear rotate: false - xy: 733, 883 + xy: 295, 167 size: 10, 10 orig: 10, 10 offset: 0, 0 index: -1 +editor-craters1 + rotate: false + xy: 621, 431 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 editor-craters2 rotate: false - xy: 589, 229 + xy: 621, 397 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-craters3 rotate: false - xy: 623, 263 + xy: 295, 213 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-darksand2 rotate: false - xy: 657, 297 + xy: 295, 179 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-darksand3 rotate: false - xy: 589, 195 + xy: 753, 497 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-grass1 rotate: false - xy: 623, 229 + xy: 655, 447 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 grass-icon-editor rotate: false - xy: 623, 229 + xy: 655, 447 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-grass2 rotate: false - xy: 657, 263 + xy: 655, 413 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-grass3 rotate: false - xy: 623, 195 + xy: 689, 447 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-holostone1 rotate: false - xy: 657, 229 + xy: 689, 413 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 holostone-icon-editor rotate: false - xy: 657, 229 + xy: 689, 413 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-holostone2 rotate: false - xy: 657, 195 + xy: 723, 447 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-holostone3 rotate: false - xy: 571, 161 + xy: 723, 413 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-hotrock1 rotate: false - xy: 605, 161 + xy: 343, 263 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 hotrock-icon-editor rotate: false - xy: 605, 161 + xy: 343, 263 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-hotrock2 rotate: false - xy: 639, 161 + xy: 799, 547 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-hotrock3 rotate: false - xy: 673, 161 + xy: 865, 645 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-ice-snow1 rotate: false - xy: 529, 111 + xy: 1001, 645 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ice-snow-icon-editor rotate: false - xy: 529, 111 + xy: 1001, 645 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-ice-snow2 rotate: false - xy: 571, 127 + xy: 1035, 645 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-ice-snow3 rotate: false - xy: 605, 127 + xy: 1069, 645 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-ice1 rotate: false - xy: 445, 69 + xy: 899, 645 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ice-icon-editor rotate: false - xy: 445, 69 + xy: 899, 645 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-ice2 rotate: false - xy: 461, 103 + xy: 933, 645 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-ice3 rotate: false - xy: 495, 111 + xy: 967, 645 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-ignarock1 rotate: false - xy: 639, 127 + xy: 1103, 645 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ignarock-icon-editor rotate: false - xy: 639, 127 + xy: 1103, 645 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-ignarock2 rotate: false - xy: 673, 127 + xy: 1137, 645 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-ignarock3 rotate: false - xy: 479, 69 + xy: 1171, 645 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-magmarock1 rotate: false - xy: 513, 77 + xy: 1205, 645 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 magmarock-icon-editor rotate: false - xy: 513, 77 + xy: 1205, 645 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-magmarock2 rotate: false - xy: 547, 77 + xy: 655, 379 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-magmarock3 rotate: false - xy: 581, 93 + xy: 689, 379 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-metal-floor rotate: false - xy: 615, 93 + xy: 723, 379 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 metal-floor-icon-editor rotate: false - xy: 615, 93 + xy: 723, 379 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-metal-floor-2 rotate: false - xy: 649, 93 + xy: 343, 229 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 metal-floor-2-icon-editor rotate: false - xy: 649, 93 + xy: 343, 229 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-metal-floor-3 rotate: false - xy: 683, 93 + xy: 329, 195 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 metal-floor-3-icon-editor rotate: false - xy: 683, 93 + xy: 329, 195 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-metal-floor-5 rotate: false - xy: 581, 59 + xy: 329, 161 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 metal-floor-5-icon-editor rotate: false - xy: 581, 59 + xy: 329, 161 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-metal-floor-damaged1 rotate: false - xy: 615, 59 + xy: 329, 127 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 metal-floor-damaged-icon-editor rotate: false - xy: 615, 59 + xy: 329, 127 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-metal-floor-damaged2 rotate: false - xy: 649, 59 + xy: 799, 513 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-metal-floor-damaged3 rotate: false - xy: 683, 59 + xy: 857, 611 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-moss1 rotate: false - xy: 691, 331 + xy: 891, 611 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 moss-icon-editor rotate: false - xy: 691, 331 + xy: 891, 611 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-moss2 rotate: false - xy: 691, 297 + xy: 925, 611 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-moss3 rotate: false - xy: 691, 263 + xy: 959, 611 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-ore-coal1 rotate: false - xy: 691, 229 + xy: 993, 611 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-ore-coal2 rotate: false - xy: 691, 195 + xy: 1027, 611 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-ore-coal3 rotate: false - xy: 707, 161 + xy: 1061, 611 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-ore-copper1 rotate: false - xy: 707, 127 + xy: 1095, 611 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-ore-copper2 rotate: false - xy: 717, 93 + xy: 1129, 611 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-ore-copper3 rotate: false - xy: 717, 59 + xy: 1163, 611 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-ore-lead1 rotate: false - xy: 397, 29 + xy: 1197, 611 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-ore-lead2 rotate: false - xy: 431, 35 + xy: 849, 577 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-ore-lead3 rotate: false - xy: 431, 1 + xy: 883, 577 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-ore-scrap1 rotate: false - xy: 465, 35 + xy: 917, 577 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-ore-scrap2 rotate: false - xy: 465, 1 + xy: 951, 577 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-ore-scrap3 rotate: false - xy: 499, 35 + xy: 985, 577 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-ore-thorium1 rotate: false - xy: 499, 1 + xy: 1019, 577 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-ore-thorium2 rotate: false - xy: 533, 43 + xy: 1053, 577 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-ore-thorium3 rotate: false - xy: 533, 9 + xy: 1087, 577 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-ore-titanium1 rotate: false - xy: 567, 25 + xy: 1121, 577 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-ore-titanium2 rotate: false - xy: 601, 25 + xy: 1155, 577 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-ore-titanium3 rotate: false - xy: 635, 25 + xy: 1189, 577 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-pebbles1 rotate: false - xy: 669, 25 + xy: 833, 543 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-pebbles2 rotate: false - xy: 703, 25 + xy: 867, 543 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-pebbles3 rotate: false - xy: 737, 25 + xy: 901, 543 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-salt rotate: false - xy: 705, 399 + xy: 935, 543 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 salt-icon-editor rotate: false - xy: 705, 399 + xy: 935, 543 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-sand-water rotate: false - xy: 725, 263 + xy: 1071, 543 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 sand-water-icon-editor rotate: false - xy: 725, 263 + xy: 1071, 543 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-sand1 rotate: false - xy: 705, 365 + xy: 969, 543 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 sand-icon-editor rotate: false - xy: 705, 365 + xy: 969, 543 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-sand2 rotate: false - xy: 725, 331 + xy: 1003, 543 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-sand3 rotate: false - xy: 725, 297 + xy: 1037, 543 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-shale1 rotate: false - xy: 725, 229 + xy: 1105, 543 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 shale-icon-editor rotate: false - xy: 725, 229 + xy: 1105, 543 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-shale2 rotate: false - xy: 725, 195 + xy: 1139, 543 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-shale3 rotate: false - xy: 741, 161 + xy: 1173, 543 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-snow1 rotate: false - xy: 741, 127 + xy: 833, 509 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-snow2 rotate: false - xy: 751, 93 + xy: 867, 509 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-snow3 rotate: false - xy: 751, 59 + xy: 901, 509 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-spawn rotate: false - xy: 771, 25 + xy: 935, 509 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-spore-moss1 rotate: false - xy: 733, 827 + xy: 969, 509 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 spore-moss-icon-editor rotate: false - xy: 733, 827 + xy: 969, 509 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-spore-moss2 rotate: false - xy: 767, 827 + xy: 1003, 509 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-spore-moss3 rotate: false - xy: 801, 827 + xy: 1037, 509 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-stone1 rotate: false - xy: 835, 827 + xy: 1071, 509 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 stone-icon-editor rotate: false - xy: 835, 827 + xy: 1071, 509 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-stone2 rotate: false - xy: 869, 827 + xy: 1105, 509 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-stone3 rotate: false - xy: 903, 827 + xy: 1139, 509 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-tainted-water rotate: false - xy: 937, 827 + xy: 1173, 509 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 tainted-water-icon-editor rotate: false - xy: 937, 827 + xy: 1173, 509 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-tar rotate: false - xy: 971, 827 + xy: 1207, 543 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 tar-icon-editor rotate: false - xy: 971, 827 + xy: 1207, 543 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-tendrils1 rotate: false - xy: 1005, 827 + xy: 1207, 509 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-tendrils2 rotate: false - xy: 1039, 827 + xy: 1223, 577 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-tendrils3 rotate: false - xy: 1073, 827 + xy: 1231, 611 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-water rotate: false - xy: 1107, 827 + xy: 1241, 543 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 water-icon-editor rotate: false - xy: 1107, 827 + xy: 1241, 543 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 force-projector-icon-editor rotate: false - xy: 1039, 927 + xy: 679, 779 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 fortress-factory-icon-editor rotate: false - xy: 1137, 927 + xy: 1329, 909 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 fuse-icon-editor rotate: false - xy: 1235, 927 + xy: 777, 779 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 ghoul-factory-icon-editor rotate: false - xy: 1333, 927 + xy: 1427, 909 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 glaive-ship-pad-icon-editor rotate: false - xy: 1431, 927 + xy: 875, 779 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 graphite-press-icon-editor rotate: false - xy: 1603, 861 + xy: 421, 389 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 hail-icon-editor rotate: false - xy: 1141, 827 + xy: 1241, 509 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 icerocks-icon-editor rotate: false - xy: 1175, 827 + xy: 1257, 577 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 impact-reactor-icon-editor rotate: false - xy: 485, 895 + xy: 1, 71 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 incinerator-icon-editor rotate: false - xy: 1209, 827 + xy: 1275, 543 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-source-icon-editor rotate: false - xy: 1243, 827 + xy: 1275, 509 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-void-icon-editor rotate: false - xy: 1277, 827 + xy: 757, 463 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 javelin-ship-pad-icon-editor rotate: false - xy: 1669, 861 + xy: 487, 389 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 junction-icon-editor rotate: false - xy: 1311, 827 + xy: 757, 429 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 kiln-icon-editor rotate: false - xy: 1735, 861 + xy: 1267, 745 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 lancer-icon-editor rotate: false - xy: 1801, 861 + xy: 1333, 745 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 laser-drill-icon-editor rotate: false - xy: 1529, 927 + xy: 1525, 909 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 launch-pad-icon-editor rotate: false - xy: 1627, 927 + xy: 973, 779 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 launch-pad-large-icon-editor rotate: false - xy: 1, 121 + xy: 163, 233 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 liquid-junction-icon-editor rotate: false - xy: 1345, 827 + xy: 757, 395 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 liquid-router-icon-editor rotate: false - xy: 1379, 827 + xy: 757, 361 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 liquid-source-icon-editor rotate: false - xy: 1413, 827 + xy: 363, 195 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 liquid-tank-icon-editor rotate: false - xy: 1725, 927 + xy: 1623, 909 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 mass-driver-icon-editor rotate: false - xy: 1823, 927 + xy: 1071, 779 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 mechanical-drill-icon-editor rotate: false - xy: 1867, 861 + xy: 1399, 745 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 mechanical-pump-icon-editor rotate: false - xy: 1447, 827 + xy: 363, 161 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 meltdown-icon-editor rotate: false - xy: 131, 251 + xy: 323, 489 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 melter-icon-editor rotate: false - xy: 1481, 827 + xy: 363, 127 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 mend-projector-icon-editor rotate: false - xy: 1933, 861 + xy: 1465, 745 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 mender-icon-editor rotate: false - xy: 1515, 827 + xy: 791, 479 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 multi-press-icon-editor rotate: false - xy: 1921, 927 + xy: 1721, 909 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 oil-extractor-icon-editor rotate: false - xy: 323, 375 + xy: 1819, 909 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 omega-mech-pad-icon-editor rotate: false - xy: 197, 23 + xy: 1917, 909 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 overdrive-projector-icon-editor rotate: false - xy: 485, 829 + xy: 1531, 745 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 overflow-gate-icon-editor rotate: false - xy: 1549, 827 + xy: 791, 445 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 pebbles-icon-editor rotate: false - xy: 1583, 827 + xy: 791, 411 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 phantom-factory-icon-editor rotate: false - xy: 551, 829 + xy: 1597, 745 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 phase-conduit-icon-editor rotate: false - xy: 1617, 827 + xy: 791, 377 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 phase-conveyor-icon-editor rotate: false - xy: 1651, 827 + xy: 825, 475 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 phase-wall-icon-editor rotate: false - xy: 1685, 827 + xy: 825, 441 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 phase-wall-large-icon-editor rotate: false - xy: 617, 829 + xy: 1663, 745 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 phase-weaver-icon-editor rotate: false - xy: 453, 763 + xy: 1757, 777 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 pine-icon-editor rotate: false - xy: 1999, 877 + xy: 293, 247 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 plastanium-compressor-icon-editor rotate: false - xy: 519, 763 + xy: 1823, 777 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 pneumatic-drill-icon-editor rotate: false - xy: 453, 697 + xy: 1889, 777 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 power-node-icon-editor rotate: false - xy: 1719, 827 + xy: 859, 475 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 power-node-large-icon-editor rotate: false - xy: 519, 697 + xy: 1955, 777 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 power-source-icon-editor rotate: false - xy: 1753, 827 + xy: 825, 407 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 power-void-icon-editor rotate: false - xy: 1787, 827 + xy: 859, 441 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 pulse-conduit-icon-editor rotate: false - xy: 1821, 827 + xy: 893, 475 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 pulverizer-icon-editor rotate: false - xy: 1855, 827 + xy: 859, 407 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 pyratite-mixer-icon-editor rotate: false - xy: 585, 763 + xy: 293, 297 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 repair-point-icon-editor rotate: false - xy: 1889, 827 + xy: 893, 441 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 revenant-factory-icon-editor rotate: false - xy: 323, 603 + xy: 711, 877 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 ripple-icon-editor rotate: false - xy: 261, 277 + xy: 453, 455 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 rock-icon-editor rotate: false - xy: 1999, 827 + xy: 551, 465 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 rocks-icon-editor rotate: false - xy: 1923, 827 + xy: 927, 475 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 rotary-pump-icon-editor rotate: false - xy: 453, 631 + xy: 581, 713 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 router-icon-editor rotate: false - xy: 1957, 827 + xy: 893, 407 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 rtg-generator-icon-editor rotate: false - xy: 519, 631 + xy: 647, 713 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 saltrocks-icon-editor rotate: false - xy: 717, 793 + xy: 927, 441 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 salvo-icon-editor rotate: false - xy: 585, 697 + xy: 713, 713 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 sand-boulder-icon-editor rotate: false - xy: 717, 759 + xy: 961, 475 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 sandrocks-icon-editor rotate: false - xy: 751, 793 + xy: 927, 407 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 scatter-icon-editor rotate: false - xy: 453, 565 + xy: 779, 713 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 scorch-icon-editor rotate: false - xy: 785, 793 + xy: 961, 441 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 scrap-wall-gigantic-icon-editor rotate: false - xy: 615, 895 + xy: 841, 877 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 scrap-wall-huge-icon-editor rotate: false - xy: 261, 179 + xy: 1169, 779 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 scrap-wall-icon-editor rotate: false - xy: 717, 725 + xy: 995, 475 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 scrap-wall-large-icon-editor rotate: false - xy: 519, 565 + xy: 845, 713 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 separator-icon-editor rotate: false - xy: 585, 631 + xy: 911, 713 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 shale-boulder-icon-editor rotate: false - xy: 751, 759 + xy: 961, 407 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 shalerocks-icon-editor rotate: false - xy: 785, 759 + xy: 995, 441 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 shock-mine-icon-editor rotate: false - xy: 819, 793 + xy: 1029, 475 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 shrubs-icon-editor rotate: false - xy: 717, 691 + xy: 995, 407 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 silicon-smelter-icon-editor rotate: false - xy: 453, 499 + xy: 977, 713 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 snow-icon-editor rotate: false - xy: 751, 725 + xy: 1029, 441 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 snow-pine-icon-editor rotate: false - xy: 519, 383 + xy: 815, 663 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 snowrock-icon-editor rotate: false - xy: 683, 845 + xy: 749, 531 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 snowrocks-icon-editor rotate: false - xy: 785, 725 + xy: 1063, 475 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 solar-panel-icon-editor rotate: false - xy: 819, 759 + xy: 1029, 407 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 solar-panel-large-icon-editor rotate: false - xy: 359, 277 + xy: 1267, 811 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 sorter-icon-editor rotate: false - xy: 853, 793 + xy: 1063, 441 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 spawn-icon-editor rotate: false - xy: 717, 657 + xy: 1097, 475 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 spectre-icon-editor rotate: false - xy: 131, 121 + xy: 971, 877 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 spirit-factory-icon-editor rotate: false - xy: 519, 499 + xy: 1043, 713 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 spore-cluster-icon-editor rotate: false - xy: 427, 137 + xy: 815, 621 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 spore-pine-icon-editor rotate: false - xy: 361, 63 + xy: 601, 465 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 spore-press-icon-editor rotate: false - xy: 585, 565 + xy: 1109, 713 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 sporerocks-icon-editor rotate: false - xy: 751, 691 + xy: 1063, 407 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 surge-tower-icon-editor rotate: false - xy: 585, 499 + xy: 1175, 713 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 surge-wall-icon-editor rotate: false - xy: 785, 691 + xy: 1097, 441 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 surge-wall-large-icon-editor rotate: false - xy: 519, 433 + xy: 551, 647 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 swarmer-icon-editor rotate: false - xy: 585, 433 + xy: 551, 581 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 tau-mech-pad-icon-editor rotate: false - xy: 651, 763 + xy: 617, 647 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 tendrils-icon-editor rotate: false - xy: 819, 725 + xy: 1131, 475 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 thermal-generator-icon-editor rotate: false - xy: 651, 697 + xy: 551, 515 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 thermal-pump-icon-editor rotate: false - xy: 359, 179 + xy: 1365, 811 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 thorium-reactor-icon-editor rotate: false - xy: 421, 375 + xy: 1463, 811 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 thorium-wall-icon-editor rotate: false - xy: 853, 759 + xy: 1097, 407 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 thorium-wall-large-icon-editor rotate: false - xy: 651, 631 + xy: 617, 581 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 thruster-icon-editor rotate: false - xy: 323, 473 + xy: 1101, 877 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 titan-factory-icon-editor rotate: false - xy: 457, 277 + xy: 1561, 811 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 titanium-conveyor-icon-editor rotate: false - xy: 887, 793 + xy: 1131, 441 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-wall-icon-editor rotate: false - xy: 717, 623 + xy: 1165, 475 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-wall-large-icon-editor rotate: false - xy: 651, 565 + xy: 683, 647 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 trident-ship-pad-icon-editor rotate: false - xy: 651, 499 + xy: 617, 515 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 turbine-generator-icon-editor rotate: false - xy: 651, 433 + xy: 683, 581 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 unloader-icon-editor rotate: false - xy: 751, 657 + xy: 1131, 407 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 vault-icon-editor rotate: false - xy: 457, 179 + xy: 1659, 811 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 water-extractor-icon-editor rotate: false - xy: 295, 113 + xy: 749, 647 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 wave-icon-editor rotate: false - xy: 295, 47 + xy: 683, 515 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 white-tree-dead-icon-editor rotate: false - xy: 1, 703 + xy: 1, 685 size: 320, 320 orig: 320, 320 offset: 0, 0 index: -1 white-tree-icon-editor rotate: false - xy: 1, 381 + xy: 1, 363 size: 320, 320 orig: 320, 320 offset: 0, 0 index: -1 wraith-factory-icon-editor rotate: false - xy: 361, 113 + xy: 749, 581 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 sprites3.png +size: 1024,1024 +format: RGBA8888 +filter: Nearest,Nearest +repeat: none +craters + rotate: false + xy: 605, 767 + size: 256, 256 + orig: 256, 256 + offset: 0, 0 + index: -1 +desertWastes + rotate: false + xy: 303, 461 + size: 260, 260 + orig: 260, 260 + offset: 0, 0 + index: -1 +desolateRift + rotate: false + xy: 817, 163 + size: 100, 350 + orig: 100, 350 + offset: 0, 0 + index: -1 +frozenForest + rotate: false + xy: 303, 1 + size: 200, 200 + orig: 200, 200 + offset: 0, 0 + index: -1 +fungalPass + rotate: false + xy: 863, 773 + size: 150, 250 + orig: 150, 250 + offset: 0, 0 + index: -1 +groundZero + rotate: false + xy: 303, 203 + size: 256, 256 + orig: 256, 256 + offset: 0, 0 + index: -1 +nuclearComplex + rotate: false + xy: 605, 515 + size: 250, 250 + orig: 250, 250 + offset: 0, 0 + index: -1 +overgrowth + rotate: false + xy: 1, 723 + size: 300, 300 + orig: 300, 300 + offset: 0, 0 + index: -1 +ruinousShores + rotate: false + xy: 1, 421 + size: 300, 300 + orig: 300, 300 + offset: 0, 0 + index: -1 +saltFlats + rotate: false + xy: 303, 723 + size: 300, 300 + orig: 300, 300 + offset: 0, 0 + index: -1 +stainedMountains + rotate: false + xy: 1, 119 + size: 300, 300 + orig: 300, 300 + offset: 0, 0 + index: -1 +tarFields + rotate: false + xy: 565, 263 + size: 250, 250 + orig: 250, 250 + offset: 0, 0 + index: -1 + +sprites4.png size: 2048,512 format: RGBA8888 filter: Nearest,Nearest @@ -8529,7 +8640,7 @@ white-tree-dead offset: 0, 0 index: -1 -sprites4.png +sprites5.png size: 2048,1024 format: RGBA8888 filter: Nearest,Nearest @@ -8550,7 +8661,7 @@ alloy-smelter-icon-medium index: -1 alloy-smelter-icon-small rotate: false - xy: 1294, 598 + xy: 1847, 588 size: 24, 24 orig: 24, 24 offset: 0, 0 @@ -8571,14 +8682,14 @@ arc-icon-medium index: -1 arc-icon-small rotate: false - xy: 1320, 598 + xy: 255, 1 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 bar rotate: false - xy: 1265, 586 + xy: 1969, 618 size: 27, 36 split: 9, 9, 9, 9 orig: 27, 36 @@ -8586,7 +8697,7 @@ bar index: -1 bar-top rotate: false - xy: 1236, 586 + xy: 1940, 618 size: 27, 36 split: 9, 10, 9, 10 orig: 27, 36 @@ -8608,7 +8719,7 @@ battery-icon-medium index: -1 battery-icon-small rotate: false - xy: 1346, 598 + xy: 281, 1 size: 24, 24 orig: 24, 24 offset: 0, 0 @@ -8629,7 +8740,7 @@ battery-large-icon-medium index: -1 battery-large-icon-small rotate: false - xy: 1372, 598 + xy: 2021, 864 size: 24, 24 orig: 24, 24 offset: 0, 0 @@ -8650,7 +8761,7 @@ blast-drill-icon-medium index: -1 blast-drill-icon-small rotate: false - xy: 1398, 598 + xy: 2023, 838 size: 24, 24 orig: 24, 24 offset: 0, 0 @@ -8671,7 +8782,7 @@ blast-mixer-icon-medium index: -1 blast-mixer-icon-small rotate: false - xy: 1424, 598 + xy: 2023, 812 size: 24, 24 orig: 24, 24 offset: 0, 0 @@ -8692,7 +8803,7 @@ bridge-conduit-icon-medium index: -1 bridge-conduit-icon-small rotate: false - xy: 1450, 598 + xy: 1015, 567 size: 24, 24 orig: 24, 24 offset: 0, 0 @@ -8713,14 +8824,14 @@ bridge-conveyor-icon-medium index: -1 bridge-conveyor-icon-small rotate: false - xy: 1476, 598 + xy: 1041, 567 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 button rotate: false - xy: 301, 145 + xy: 551, 395 size: 36, 27 split: 12, 12, 12, 12 orig: 36, 27 @@ -8736,7 +8847,7 @@ button-disabled index: -1 button-down rotate: false - xy: 351, 245 + xy: 601, 495 size: 36, 27 split: 12, 12, 12, 12 orig: 36, 27 @@ -8744,7 +8855,7 @@ button-down index: -1 button-edge-1 rotate: false - xy: 401, 295 + xy: 651, 545 size: 36, 27 split: 12, 12, 12, 12 orig: 36, 27 @@ -8752,7 +8863,7 @@ button-edge-1 index: -1 button-edge-2 rotate: false - xy: 451, 345 + xy: 701, 595 size: 36, 27 split: 12, 12, 12, 12 orig: 36, 27 @@ -8760,7 +8871,7 @@ button-edge-2 index: -1 button-edge-3 rotate: false - xy: 501, 395 + xy: 751, 645 size: 36, 27 split: 12, 12, 12, 12 orig: 36, 27 @@ -8768,7 +8879,7 @@ button-edge-3 index: -1 button-edge-4 rotate: false - xy: 551, 445 + xy: 801, 695 size: 36, 27 split: 12, 12, 12, 12 orig: 36, 27 @@ -8776,7 +8887,7 @@ button-edge-4 index: -1 button-edge-over-4 rotate: false - xy: 601, 495 + xy: 851, 745 size: 36, 27 split: 12, 12, 12, 12 orig: 36, 27 @@ -8784,7 +8895,7 @@ button-edge-over-4 index: -1 button-over rotate: false - xy: 651, 545 + xy: 901, 795 size: 36, 27 split: 12, 12, 12, 12 orig: 36, 27 @@ -8792,7 +8903,7 @@ button-over index: -1 button-red rotate: false - xy: 701, 595 + xy: 951, 845 size: 36, 27 split: 12, 12, 12, 12 orig: 36, 27 @@ -8800,7 +8911,7 @@ button-red index: -1 button-right rotate: false - xy: 851, 745 + xy: 301, 145 size: 36, 27 split: 12, 12, 12, 12 orig: 36, 27 @@ -8808,7 +8919,7 @@ button-right index: -1 button-right-down rotate: false - xy: 751, 645 + xy: 1001, 895 size: 36, 27 split: 12, 12, 12, 12 orig: 36, 27 @@ -8816,7 +8927,7 @@ button-right-down index: -1 button-right-over rotate: false - xy: 801, 695 + xy: 251, 95 size: 36, 27 split: 12, 12, 12, 12 orig: 36, 27 @@ -8824,7 +8935,7 @@ button-right-over index: -1 button-select rotate: false - xy: 1502, 598 + xy: 1067, 567 size: 24, 24 split: 4, 4, 4, 4 orig: 24, 24 @@ -8832,7 +8943,7 @@ button-select index: -1 button-square rotate: false - xy: 1001, 895 + xy: 451, 295 size: 36, 27 split: 12, 12, 12, 12 orig: 36, 27 @@ -8840,7 +8951,7 @@ button-square index: -1 button-square-down rotate: false - xy: 901, 795 + xy: 351, 195 size: 36, 27 split: 12, 12, 12, 12 orig: 36, 27 @@ -8848,7 +8959,7 @@ button-square-down index: -1 button-square-over rotate: false - xy: 951, 845 + xy: 401, 245 size: 36, 27 split: 12, 12, 12, 12 orig: 36, 27 @@ -8856,7 +8967,7 @@ button-square-over index: -1 button-trans rotate: false - xy: 251, 95 + xy: 501, 345 size: 36, 27 split: 12, 12, 12, 12 orig: 36, 27 @@ -8878,7 +8989,7 @@ char-icon-medium index: -1 char-icon-small rotate: false - xy: 1528, 598 + xy: 1093, 567 size: 24, 24 orig: 24, 24 offset: 0, 0 @@ -8927,7 +9038,7 @@ check-over index: -1 clear rotate: false - xy: 1861, 656 + xy: 639, 512 size: 10, 10 orig: 10, 10 offset: 0, 0 @@ -8948,7 +9059,7 @@ cliffs-icon-medium index: -1 cliffs-icon-small rotate: false - xy: 1554, 598 + xy: 1989, 662 size: 24, 24 orig: 24, 24 offset: 0, 0 @@ -8969,7 +9080,7 @@ coal-centrifuge-icon-medium index: -1 coal-centrifuge-icon-small rotate: false - xy: 1580, 598 + xy: 1998, 636 size: 24, 24 orig: 24, 24 offset: 0, 0 @@ -8990,259 +9101,280 @@ combustion-generator-icon-medium index: -1 combustion-generator-icon-small rotate: false - xy: 1606, 598 + xy: 1998, 610 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -conduit-icon-large +command-center-icon-large rotate: false xy: 387, 974 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -conduit-icon-medium +command-center-icon-medium rotate: false xy: 1730, 890 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -conduit-icon-small +command-center-icon-small rotate: false - xy: 1632, 598 + xy: 2001, 694 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -container-icon-large +conduit-icon-large rotate: false xy: 1, 580 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -container-icon-medium +conduit-icon-medium rotate: false xy: 1764, 890 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -container-icon-small +conduit-icon-small rotate: false - xy: 1658, 598 + xy: 2015, 668 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -conveyor-icon-large +container-icon-large rotate: false xy: 437, 974 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -conveyor-icon-medium +container-icon-medium rotate: false xy: 1798, 890 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -conveyor-icon-small +container-icon-small rotate: false - xy: 1684, 598 + xy: 1873, 588 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -copper-wall-icon-large +conveyor-icon-large rotate: false xy: 1, 530 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -copper-wall-icon-medium +conveyor-icon-medium rotate: false xy: 1832, 890 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -copper-wall-icon-small +conveyor-icon-small rotate: false - xy: 1710, 598 + xy: 1899, 590 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -copper-wall-large-icon-large +copper-wall-icon-large rotate: false xy: 487, 974 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -copper-wall-large-icon-medium +copper-wall-icon-medium rotate: false xy: 1866, 890 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -copper-wall-large-icon-small +copper-wall-icon-small rotate: false - xy: 1736, 598 + xy: 1925, 590 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -core-foundation-icon-large +copper-wall-large-icon-large rotate: false xy: 1, 480 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -core-foundation-icon-medium +copper-wall-large-icon-medium rotate: false xy: 1900, 890 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -core-foundation-icon-small +copper-wall-large-icon-small rotate: false - xy: 1762, 598 + xy: 1951, 592 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -core-nucleus-icon-large +core-foundation-icon-large rotate: false xy: 537, 974 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -core-nucleus-icon-medium +core-foundation-icon-medium rotate: false xy: 1934, 890 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -core-nucleus-icon-small +core-foundation-icon-small rotate: false - xy: 1788, 598 + xy: 385, 169 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -core-shard-icon-large +core-nucleus-icon-large rotate: false xy: 1, 430 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -core-shard-icon-medium +core-nucleus-icon-medium rotate: false xy: 1968, 890 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -core-shard-icon-small +core-nucleus-icon-small rotate: false - xy: 1814, 598 + xy: 411, 185 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -craters-icon-large +core-shard-icon-large rotate: false xy: 587, 974 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -craters-icon-medium +core-shard-icon-medium rotate: false xy: 2002, 890 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -craters-icon-small +core-shard-icon-small rotate: false - xy: 255, 1 + xy: 437, 185 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -crawler-factory-icon-large +craters-icon-large rotate: false xy: 1, 380 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -crawler-factory-icon-medium +craters-icon-medium rotate: false - xy: 401, 261 + xy: 651, 511 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -crawler-factory-icon-small +craters-icon-small rotate: false - xy: 281, 1 + xy: 411, 159 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -cryofluidmixer-icon-large +crawler-factory-icon-large rotate: false xy: 637, 974 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -cryofluidmixer-icon-medium +crawler-factory-icon-medium rotate: false - xy: 389, 227 + xy: 639, 477 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -cryofluidmixer-icon-small +crawler-factory-icon-small rotate: false - xy: 2021, 864 + xy: 437, 159 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -cultivator-icon-large +cryofluidmixer-icon-large rotate: false xy: 1, 330 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 +cryofluidmixer-icon-medium + rotate: false + xy: 639, 443 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +cryofluidmixer-icon-small + rotate: false + xy: 463, 167 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +cultivator-icon-large + rotate: false + xy: 687, 974 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 cultivator-icon-medium rotate: false - xy: 389, 193 + xy: 701, 561 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 cultivator-icon-small rotate: false - xy: 2023, 838 + xy: 489, 167 size: 24, 24 orig: 24, 24 offset: 0, 0 @@ -9256,336 +9388,336 @@ cursor index: -1 cyclone-icon-large rotate: false - xy: 687, 974 + xy: 1, 280 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 cyclone-icon-medium rotate: false - xy: 451, 311 + xy: 751, 611 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 cyclone-icon-small rotate: false - xy: 2023, 812 + xy: 515, 167 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 dagger-factory-icon-large rotate: false - xy: 1, 280 + xy: 737, 974 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 dagger-factory-icon-medium rotate: false - xy: 501, 361 + xy: 801, 661 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 dagger-factory-icon-small rotate: false - xy: 765, 336 + xy: 541, 171 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 dark-metal-icon-large rotate: false - xy: 737, 974 + xy: 1, 230 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 dark-metal-icon-medium rotate: false - xy: 551, 411 + xy: 851, 711 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 dark-metal-icon-small rotate: false - xy: 1847, 630 + xy: 567, 171 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 dark-panel-1-icon-large rotate: false - xy: 1, 230 + xy: 787, 974 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 dark-panel-1-icon-medium rotate: false - xy: 601, 461 + xy: 901, 761 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 dark-panel-1-icon-small rotate: false - xy: 1015, 567 + xy: 593, 171 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 dark-panel-2-icon-large rotate: false - xy: 787, 974 + xy: 1, 180 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 dark-panel-2-icon-medium rotate: false - xy: 651, 511 + xy: 951, 811 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 dark-panel-2-icon-small rotate: false - xy: 1041, 567 + xy: 619, 171 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 dark-panel-3-icon-large rotate: false - xy: 1, 180 + xy: 837, 974 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 dark-panel-3-icon-medium rotate: false - xy: 701, 561 + xy: 251, 61 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 dark-panel-3-icon-small rotate: false - xy: 1067, 567 + xy: 645, 171 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 dark-panel-4-icon-large rotate: false - xy: 837, 974 + xy: 1, 130 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 dark-panel-4-icon-medium rotate: false - xy: 751, 611 + xy: 301, 111 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 dark-panel-4-icon-small rotate: false - xy: 1093, 567 + xy: 385, 143 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 dark-panel-5-icon-large rotate: false - xy: 1, 130 + xy: 887, 974 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 dark-panel-5-icon-medium rotate: false - xy: 801, 661 + xy: 351, 161 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 dark-panel-5-icon-small rotate: false - xy: 1294, 572 + xy: 411, 133 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 dark-panel-6-icon-large rotate: false - xy: 887, 974 + xy: 1, 80 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 dark-panel-6-icon-medium rotate: false - xy: 851, 711 + xy: 401, 211 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 dark-panel-6-icon-small rotate: false - xy: 1320, 572 + xy: 437, 133 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 darksand-icon-large rotate: false - xy: 1, 80 + xy: 937, 974 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 darksand-icon-medium rotate: false - xy: 901, 761 + xy: 451, 261 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 darksand-icon-small rotate: false - xy: 1346, 572 + xy: 463, 141 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 darksand-tainted-water-icon-large rotate: false - xy: 937, 974 + xy: 1, 30 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 darksand-tainted-water-icon-medium rotate: false - xy: 951, 811 + xy: 501, 311 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 darksand-tainted-water-icon-small rotate: false - xy: 1372, 572 + xy: 489, 141 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 darksand-water-icon-large rotate: false - xy: 1, 30 + xy: 987, 974 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 darksand-water-icon-medium rotate: false - xy: 251, 61 + xy: 551, 361 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 darksand-water-icon-small rotate: false - xy: 1398, 572 + xy: 515, 141 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 dart-mech-pad-icon-large rotate: false - xy: 987, 974 + xy: 1037, 974 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 dart-mech-pad-icon-medium rotate: false - xy: 301, 111 + xy: 1001, 861 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 dart-mech-pad-icon-small rotate: false - xy: 1424, 572 + xy: 541, 145 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 deepwater-icon-large rotate: false - xy: 1037, 974 + xy: 1087, 974 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 deepwater-icon-medium rotate: false - xy: 1001, 861 + xy: 1035, 861 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 deepwater-icon-small rotate: false - xy: 1450, 572 + xy: 567, 145 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 delta-mech-pad-icon-large rotate: false - xy: 1087, 974 + xy: 1137, 974 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 delta-mech-pad-icon-medium rotate: false - xy: 1035, 861 + xy: 1069, 861 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 delta-mech-pad-icon-small rotate: false - xy: 1476, 572 + xy: 593, 145 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 differential-generator-icon-large rotate: false - xy: 1137, 974 + xy: 1187, 974 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 differential-generator-icon-medium rotate: false - xy: 1069, 861 + xy: 51, 11 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 differential-generator-icon-small rotate: false - xy: 1502, 572 + xy: 619, 145 size: 24, 24 orig: 24, 24 offset: 0, 0 @@ -9599,126 +9731,126 @@ discord-banner index: -1 distributor-icon-large rotate: false - xy: 1187, 974 + xy: 1237, 974 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 distributor-icon-medium rotate: false - xy: 51, 11 + xy: 85, 11 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 distributor-icon-small rotate: false - xy: 1528, 572 + xy: 645, 145 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 door-icon-large rotate: false - xy: 1237, 974 + xy: 1287, 974 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 door-icon-medium rotate: false - xy: 85, 11 + xy: 119, 11 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 door-icon-small rotate: false - xy: 1554, 572 + xy: 369, 117 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 door-large-icon-large rotate: false - xy: 1287, 974 + xy: 1337, 974 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 door-large-icon-medium rotate: false - xy: 119, 11 + xy: 153, 11 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 door-large-icon-small rotate: false - xy: 1580, 572 + xy: 463, 115 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 draug-factory-icon-large rotate: false - xy: 1337, 974 + xy: 1387, 974 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 draug-factory-icon-medium rotate: false - xy: 153, 11 + xy: 601, 403 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 draug-factory-icon-small rotate: false - xy: 1606, 572 + xy: 489, 115 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 dunerocks-icon-large rotate: false - xy: 1387, 974 + xy: 1437, 974 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 dunerocks-icon-medium rotate: false - xy: 351, 153 + xy: 187, 6 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 dunerocks-icon-small rotate: false - xy: 1632, 572 + xy: 515, 115 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 duo-icon-large rotate: false - xy: 1437, 974 + xy: 1487, 974 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 duo-icon-medium rotate: false - xy: 187, 6 + xy: 221, 6 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 duo-icon-small rotate: false - xy: 1658, 572 + xy: 541, 119 size: 24, 24 orig: 24, 24 offset: 0, 0 @@ -9733,301 +9865,301 @@ flat-down-base index: -1 force-projector-icon-large rotate: false - xy: 1487, 974 + xy: 1537, 974 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 force-projector-icon-medium rotate: false - xy: 221, 6 + xy: 673, 477 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 force-projector-icon-small rotate: false - xy: 1684, 572 + xy: 567, 119 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 fortress-factory-icon-large rotate: false - xy: 1537, 974 + xy: 1587, 974 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 fortress-factory-icon-medium rotate: false - xy: 423, 227 + xy: 673, 443 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 fortress-factory-icon-small rotate: false - xy: 1710, 572 + xy: 593, 119 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 fuse-icon-large rotate: false - xy: 1587, 974 + xy: 1637, 974 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 fuse-icon-medium rotate: false - xy: 423, 193 + xy: 685, 511 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 fuse-icon-small rotate: false - xy: 1736, 572 + xy: 619, 119 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 ghoul-factory-icon-large rotate: false - xy: 1637, 974 + xy: 1687, 974 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 ghoul-factory-icon-medium rotate: false - xy: 435, 261 + xy: 1103, 861 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ghoul-factory-icon-small rotate: false - xy: 1762, 572 + xy: 645, 119 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 glaive-ship-pad-icon-large rotate: false - xy: 1687, 974 + xy: 1737, 974 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 glaive-ship-pad-icon-medium rotate: false - xy: 1103, 861 + xy: 1137, 856 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 glaive-ship-pad-icon-small rotate: false - xy: 1788, 572 + xy: 637, 301 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 graphite-press-icon-large rotate: false - xy: 1737, 974 + xy: 1787, 974 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 graphite-press-icon-medium rotate: false - xy: 1137, 856 + xy: 1171, 856 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 graphite-press-icon-small rotate: false - xy: 1814, 572 + xy: 663, 315 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 grass-icon-large rotate: false - xy: 1787, 974 + xy: 1837, 974 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 grass-icon-medium rotate: false - xy: 1171, 856 + xy: 1205, 856 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 grass-icon-small rotate: false - xy: 794, 399 + xy: 689, 315 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 hail-icon-large rotate: false - xy: 1837, 974 + xy: 1887, 974 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 hail-icon-medium rotate: false - xy: 1205, 856 + xy: 1239, 856 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 hail-icon-small rotate: false - xy: 794, 373 + xy: 715, 315 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 holostone-icon-large rotate: false - xy: 1887, 974 + xy: 1937, 974 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 holostone-icon-medium rotate: false - xy: 1239, 856 + xy: 1273, 856 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 holostone-icon-small rotate: false - xy: 794, 347 + xy: 663, 289 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 hotrock-icon-large rotate: false - xy: 1937, 974 + xy: 1987, 974 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 hotrock-icon-medium rotate: false - xy: 1273, 856 + xy: 1307, 856 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 hotrock-icon-small rotate: false - xy: 1865, 694 + xy: 689, 289 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 ice-icon-large rotate: false - xy: 1987, 974 + xy: 87, 924 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 ice-icon-medium rotate: false - xy: 1307, 856 + xy: 1341, 856 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ice-icon-small rotate: false - xy: 1891, 696 + xy: 715, 289 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 ice-snow-icon-large rotate: false - xy: 87, 924 + xy: 137, 924 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 ice-snow-icon-medium rotate: false - xy: 1341, 856 + xy: 1375, 856 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ice-snow-icon-small rotate: false - xy: 791, 321 + xy: 741, 297 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 icerocks-icon-large rotate: false - xy: 137, 924 + xy: 187, 924 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 icerocks-icon-medium rotate: false - xy: 1375, 856 + xy: 1409, 856 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 icerocks-icon-small rotate: false - xy: 1840, 598 + xy: 767, 297 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 icon-about rotate: false - xy: 187, 924 + xy: 237, 924 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 icon-about-med rotate: false - xy: 619, 411 + xy: 519, 261 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 icon-about-small rotate: false - xy: 1409, 856 + xy: 1443, 856 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 icon-add rotate: false - xy: 237, 924 + xy: 287, 924 size: 48, 48 orig: 48, 48 offset: 0, 0 @@ -10041,2205 +10173,2289 @@ icon-add-med index: -1 icon-add-small rotate: false - xy: 1443, 856 + xy: 1477, 856 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 icon-admin rotate: false - xy: 287, 924 + xy: 337, 924 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 icon-admin-med rotate: false - xy: 1875, 722 + xy: 1841, 688 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 icon-admin-small rotate: false - xy: 337, 924 + xy: 387, 924 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 icon-admin-small-med rotate: false - xy: 1909, 756 + xy: 551, 261 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 icon-admin-small-small rotate: false - xy: 1477, 856 + xy: 1511, 856 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 icon-arrow rotate: false - xy: 387, 924 + xy: 437, 924 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 icon-arrow-16 rotate: false - xy: 387, 924 + xy: 437, 924 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 icon-arrow-16-med rotate: false - xy: 651, 411 + xy: 537, 229 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 icon-arrow-med rotate: false - xy: 651, 411 + xy: 537, 229 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 icon-arrow-16-small rotate: false - xy: 1511, 856 + xy: 1545, 856 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 icon-arrow-small rotate: false - xy: 1511, 856 + xy: 1545, 856 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 icon-arrow-down rotate: false - xy: 437, 924 + xy: 487, 924 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 icon-arrow-down-med rotate: false - xy: 637, 379 + xy: 901, 661 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 icon-arrow-down-small rotate: false - xy: 1545, 856 + xy: 1579, 856 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 icon-arrow-left rotate: false - xy: 487, 924 + xy: 537, 924 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 icon-arrow-left-med rotate: false - xy: 901, 661 + xy: 887, 629 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 icon-arrow-left-small rotate: false - xy: 1579, 856 + xy: 1613, 856 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 icon-arrow-right rotate: false - xy: 537, 924 + xy: 587, 924 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 icon-arrow-right-med rotate: false - xy: 887, 629 + xy: 1873, 688 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 icon-arrow-right-small rotate: false - xy: 1613, 856 + xy: 1647, 856 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 icon-arrow-up rotate: false - xy: 587, 924 + xy: 637, 924 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 icon-arrow-up-med rotate: false - xy: 1941, 756 + xy: 583, 261 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 icon-arrow-up-small rotate: false - xy: 1647, 856 + xy: 1681, 856 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 icon-back rotate: false - xy: 637, 924 + xy: 687, 924 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 icon-back-med rotate: false - xy: 683, 411 + xy: 537, 197 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 icon-back-small rotate: false - xy: 1681, 856 + xy: 1715, 856 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 icon-ban rotate: false - xy: 687, 924 + xy: 737, 924 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 icon-ban-med rotate: false - xy: 637, 347 + xy: 569, 229 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 icon-ban-small rotate: false - xy: 1715, 856 + xy: 1749, 856 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 icon-break rotate: false - xy: 737, 924 + xy: 787, 924 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 icon-break-med rotate: false - xy: 669, 379 + xy: 933, 661 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 icon-break-small rotate: false - xy: 1749, 856 + xy: 1783, 856 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 icon-cancel rotate: false - xy: 787, 924 + xy: 837, 924 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 icon-cancel-med rotate: false - xy: 933, 661 + xy: 887, 597 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 icon-cancel-small rotate: false - xy: 1783, 856 + xy: 1817, 856 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 icon-changelog rotate: false - xy: 837, 924 + xy: 887, 924 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 icon-changelog-med rotate: false - xy: 887, 597 + xy: 919, 629 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 icon-changelog-small rotate: false - xy: 1817, 856 + xy: 1851, 856 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 icon-chat rotate: false - xy: 887, 924 + xy: 937, 924 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 icon-chat-med rotate: false - xy: 919, 629 + xy: 1905, 688 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 icon-chat-small rotate: false - xy: 1851, 856 + xy: 1885, 856 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 icon-check rotate: false - xy: 937, 924 + xy: 987, 924 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 icon-check-med rotate: false - xy: 1973, 756 + xy: 569, 197 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 icon-check-small - rotate: false - xy: 1885, 856 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-copy - rotate: false - xy: 987, 924 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-copy-med - rotate: false - xy: 715, 411 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-copy-small rotate: false xy: 1919, 856 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -icon-crafting +icon-command-attack rotate: false xy: 1037, 924 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -icon-crafting-med - rotate: false - xy: 669, 347 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-crafting-small - rotate: false - xy: 1953, 856 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-cursor - rotate: false - xy: 1087, 924 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-cursor-med - rotate: false - xy: 701, 379 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-cursor-small - rotate: false - xy: 1987, 856 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-database - rotate: false - xy: 1137, 924 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-database-med +icon-command-attack-med rotate: false xy: 919, 597 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 -icon-database-small +icon-command-attack-small rotate: false - xy: 457, 227 + xy: 1953, 856 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -icon-defense +icon-command-idle rotate: false - xy: 1187, 924 + xy: 1087, 924 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -icon-defense-med +icon-command-idle-med rotate: false - xy: 701, 347 + xy: 1937, 688 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 -icon-defense-small +icon-command-idle-small rotate: false - xy: 457, 193 + xy: 1987, 856 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -icon-dev-builds +icon-command-patrol rotate: false - xy: 1237, 924 + xy: 1137, 924 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -icon-dev-builds-med +icon-command-patrol-med rotate: false - xy: 1161, 688 + xy: 1969, 688 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 -icon-dev-builds-small - rotate: false - xy: 255, 27 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-diagonal - rotate: false - xy: 1287, 924 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-diagonal-med - rotate: false - xy: 1193, 688 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-diagonal-small - rotate: false - xy: 285, 61 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-discord - rotate: false - xy: 1337, 924 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-discord-med - rotate: false - xy: 1225, 688 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-discord-small - rotate: false - xy: 289, 27 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-distribution - rotate: false - xy: 1387, 924 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-distribution-med - rotate: false - xy: 1257, 688 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-distribution-small - rotate: false - xy: 389, 159 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-donate - rotate: false - xy: 1437, 924 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-donate-med - rotate: false - xy: 1289, 688 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-donate-small - rotate: false - xy: 423, 159 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-dots - rotate: false - xy: 1487, 924 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-dots-med - rotate: false - xy: 1321, 688 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-dots-small - rotate: false - xy: 457, 159 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-editor - rotate: false - xy: 1537, 924 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-editor-med - rotate: false - xy: 1353, 688 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-editor-small - rotate: false - xy: 535, 361 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-effect - rotate: false - xy: 1587, 924 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-effect-med - rotate: false - xy: 1385, 688 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-effect-small - rotate: false - xy: 585, 411 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-elevation - rotate: false - xy: 1637, 924 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-elevation-med - rotate: false - xy: 1417, 688 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-elevation-small - rotate: false - xy: 569, 377 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-eraser - rotate: false - xy: 1687, 924 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-eraser-med - rotate: false - xy: 1449, 688 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-eraser-small - rotate: false - xy: 569, 343 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-exit - rotate: false - xy: 1737, 924 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-exit-med - rotate: false - xy: 1481, 688 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-exit-small - rotate: false - xy: 603, 377 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-file - rotate: false - xy: 1787, 924 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-file-image - rotate: false - xy: 1837, 924 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-file-image-med - rotate: false - xy: 1513, 688 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-file-image-small - rotate: false - xy: 603, 343 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-file-med - rotate: false - xy: 1545, 688 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-file-small - rotate: false - xy: 639, 477 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-file-text - rotate: false - xy: 1887, 924 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-file-text-med - rotate: false - xy: 1577, 688 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-file-text-small - rotate: false - xy: 673, 477 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-fill - rotate: false - xy: 1937, 924 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-fill-med - rotate: false - xy: 1609, 688 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-fill-small - rotate: false - xy: 685, 511 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-floppy - rotate: false - xy: 1987, 924 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-floppy-16 - rotate: false - xy: 51, 874 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-floppy-16-med - rotate: false - xy: 1641, 688 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-floppy-16-small - rotate: false - xy: 635, 443 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-floppy-med - rotate: false - xy: 1673, 688 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-floppy-small - rotate: false - xy: 669, 443 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-folder - rotate: false - xy: 51, 824 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-folder-med - rotate: false - xy: 1705, 688 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-folder-parent - rotate: false - xy: 101, 874 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-folder-parent-med - rotate: false - xy: 1737, 688 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-folder-parent-small +icon-command-patrol-small rotate: false xy: 707, 477 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -icon-folder-small +icon-command-retreat rotate: false - xy: 703, 443 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-github - rotate: false - xy: 51, 774 + xy: 1187, 924 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -icon-github-med +icon-command-retreat-med rotate: false - xy: 1769, 688 + xy: 1157, 654 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 -icon-github-small +icon-command-retreat-small + rotate: false + xy: 707, 443 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +icon-copy + rotate: false + xy: 1237, 924 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +icon-copy-med + rotate: false + xy: 1189, 654 + size: 30, 30 + orig: 30, 30 + offset: 0, 0 + index: -1 +icon-copy-small + rotate: false + xy: 255, 27 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +icon-crafting + rotate: false + xy: 1287, 924 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +icon-crafting-med + rotate: false + xy: 1221, 654 + size: 30, 30 + orig: 30, 30 + offset: 0, 0 + index: -1 +icon-crafting-small + rotate: false + xy: 285, 61 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +icon-cursor + rotate: false + xy: 1337, 924 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +icon-cursor-med + rotate: false + xy: 1253, 654 + size: 30, 30 + orig: 30, 30 + offset: 0, 0 + index: -1 +icon-cursor-small + rotate: false + xy: 289, 27 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +icon-database + rotate: false + xy: 1387, 924 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +icon-database-med + rotate: false + xy: 1285, 654 + size: 30, 30 + orig: 30, 30 + offset: 0, 0 + index: -1 +icon-database-small + rotate: false + xy: 639, 409 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +icon-defense + rotate: false + xy: 1437, 924 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +icon-defense-med + rotate: false + xy: 1317, 654 + size: 30, 30 + orig: 30, 30 + offset: 0, 0 + index: -1 +icon-defense-small + rotate: false + xy: 673, 409 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +icon-dev-builds + rotate: false + xy: 1487, 924 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +icon-dev-builds-med + rotate: false + xy: 1349, 654 + size: 30, 30 + orig: 30, 30 + offset: 0, 0 + index: -1 +icon-dev-builds-small + rotate: false + xy: 707, 409 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +icon-diagonal + rotate: false + xy: 1537, 924 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +icon-diagonal-med + rotate: false + xy: 1381, 654 + size: 30, 30 + orig: 30, 30 + offset: 0, 0 + index: -1 +icon-diagonal-small rotate: false xy: 785, 611 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -icon-google-play +icon-discord rotate: false - xy: 101, 824 + xy: 1587, 924 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -icon-google-play-med +icon-discord-med rotate: false - xy: 1801, 688 + xy: 1413, 654 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 -icon-google-play-small +icon-discord-small rotate: false xy: 835, 661 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -icon-grid +icon-distribution rotate: false - xy: 151, 874 + xy: 1637, 924 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -icon-grid-med +icon-distribution-med rotate: false - xy: 1833, 688 + xy: 1445, 654 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 -icon-grid-small +icon-distribution-small rotate: false xy: 819, 627 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -icon-home +icon-donate rotate: false - xy: 51, 724 + xy: 1687, 924 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -icon-home-med +icon-donate-med rotate: false - xy: 1157, 656 + xy: 1477, 654 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 -icon-home-small +icon-donate-small rotate: false xy: 819, 593 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -icon-host +icon-dots rotate: false - xy: 101, 774 + xy: 1737, 924 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -icon-host-med +icon-dots-med rotate: false - xy: 1189, 656 + xy: 1509, 654 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 -icon-host-small +icon-dots-small rotate: false xy: 853, 627 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -icon-info +icon-editor rotate: false - xy: 151, 824 + xy: 1787, 924 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -icon-info-med +icon-editor-med rotate: false - xy: 1221, 656 + xy: 1541, 654 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 -icon-info-small +icon-editor-small rotate: false xy: 853, 593 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -icon-itch.io +icon-effect rotate: false - xy: 201, 874 + xy: 1837, 924 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -icon-itch.io-med +icon-effect-med rotate: false - xy: 1253, 656 + xy: 1573, 654 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 -icon-itch.io-small +icon-effect-small rotate: false xy: 889, 727 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -icon-item +icon-elevation rotate: false - xy: 51, 674 + xy: 1887, 924 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -icon-item-med +icon-elevation-med rotate: false - xy: 1285, 656 + xy: 1605, 654 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 -icon-item-small +icon-elevation-small rotate: false xy: 923, 727 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -icon-line +icon-eraser rotate: false - xy: 101, 724 + xy: 1937, 924 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -icon-line-med +icon-eraser-med rotate: false - xy: 1317, 656 + xy: 1637, 654 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 -icon-line-small +icon-eraser-small rotate: false xy: 935, 761 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -icon-link +icon-exit rotate: false - xy: 151, 774 + xy: 1987, 924 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -icon-link-med +icon-exit-med rotate: false - xy: 1349, 656 + xy: 1669, 654 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 -icon-link-small +icon-exit-small rotate: false xy: 885, 693 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -icon-liquid +icon-file rotate: false - xy: 201, 824 + xy: 51, 874 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -icon-liquid-consume +icon-file-image rotate: false - xy: 251, 874 + xy: 51, 824 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -icon-liquid-consume-med +icon-file-image-med rotate: false - xy: 1381, 656 + xy: 1701, 654 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 -icon-liquid-consume-small +icon-file-image-small rotate: false xy: 919, 693 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -icon-liquid-med +icon-file-med rotate: false - xy: 1413, 656 + xy: 1733, 654 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 -icon-liquid-small +icon-file-small rotate: false xy: 957, 727 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -icon-load +icon-file-text rotate: false - xy: 51, 624 + xy: 101, 874 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -icon-load-image +icon-file-text-med rotate: false - xy: 101, 674 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-load-image-med - rotate: false - xy: 1445, 656 + xy: 1765, 654 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 -icon-load-image-small +icon-file-text-small rotate: false xy: 953, 693 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -icon-load-map +icon-fill rotate: false - xy: 151, 724 + xy: 51, 774 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -icon-load-map-med +icon-fill-med rotate: false - xy: 1477, 656 + xy: 1797, 654 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 -icon-load-map-small +icon-fill-small rotate: false xy: 335, 111 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -icon-load-med +icon-floppy rotate: false - xy: 1509, 656 + xy: 101, 824 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +icon-floppy-16 + rotate: false + xy: 151, 874 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +icon-floppy-16-med + rotate: false + xy: 615, 261 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 -icon-load-small +icon-floppy-16-small rotate: false xy: 319, 77 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -icon-loading +icon-floppy-med rotate: false - xy: 201, 774 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-loading-med - rotate: false - xy: 1541, 656 + xy: 601, 229 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 -icon-loading-small +icon-floppy-small rotate: false xy: 353, 77 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -icon-locked +icon-folder rotate: false - xy: 251, 824 + xy: 51, 724 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -icon-locked-med +icon-folder-med rotate: false - xy: 1573, 656 + xy: 601, 197 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 -icon-locked-small +icon-folder-parent rotate: false - xy: 323, 43 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-map - rotate: false - xy: 301, 874 + xy: 101, 774 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -icon-map-med - rotate: false - xy: 1605, 656 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-map-small - rotate: false - xy: 357, 43 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-menu - rotate: false - xy: 51, 574 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-menu-large - rotate: false - xy: 101, 624 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-menu-large-med - rotate: false - xy: 1637, 656 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-menu-large-small - rotate: false - xy: 323, 9 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-menu-med - rotate: false - xy: 1669, 656 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-menu-small - rotate: false - xy: 357, 9 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-missing - rotate: false - xy: 151, 674 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-missing-med - rotate: false - xy: 1701, 656 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-missing-small - rotate: false - xy: 369, 119 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-mode-attack - rotate: false - xy: 201, 724 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-mode-attack-med - rotate: false - xy: 1733, 656 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-mode-attack-small - rotate: false - xy: 403, 125 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-mode-pvp - rotate: false - xy: 251, 774 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-mode-pvp-med - rotate: false - xy: 1765, 656 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-mode-pvp-small - rotate: false - xy: 437, 125 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-mode-survival - rotate: false - xy: 301, 824 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-mode-survival-med - rotate: false - xy: 1797, 656 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-mode-survival-small - rotate: false - xy: 471, 125 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-none - rotate: false - xy: 351, 874 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-none-med - rotate: false - xy: 1829, 656 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-none-small - rotate: false - xy: 387, 85 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-paste - rotate: false - xy: 51, 524 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-paste-med - rotate: false - xy: 2005, 756 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-paste-small - rotate: false - xy: 421, 91 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-pause - rotate: false - xy: 101, 574 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-pause-med +icon-folder-parent-med rotate: false xy: 951, 629 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 -icon-pause-small +icon-folder-parent-small rotate: false - xy: 455, 91 + xy: 323, 43 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -icon-pencil +icon-folder-small rotate: false - xy: 151, 624 + xy: 357, 43 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +icon-github + rotate: false + xy: 151, 824 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -icon-pencil-med +icon-github-med rotate: false xy: 951, 597 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 -icon-pencil-small +icon-github-small rotate: false - xy: 391, 51 + xy: 323, 9 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -icon-pick +icon-google-play rotate: false - xy: 201, 674 + xy: 201, 874 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -icon-pick-med +icon-google-play-med rotate: false - xy: 733, 379 + xy: 633, 229 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 -icon-pick-small +icon-google-play-small rotate: false - xy: 391, 17 + xy: 357, 9 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -icon-play +icon-grid rotate: false - xy: 251, 724 + xy: 51, 674 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -icon-play-2 +icon-grid-med rotate: false - xy: 301, 774 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-play-2-med - rotate: false - xy: 733, 347 + xy: 633, 197 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 -icon-play-2-small +icon-grid-small rotate: false - xy: 425, 57 + xy: 435, 211 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -icon-play-custom +icon-home rotate: false - xy: 351, 824 + xy: 101, 724 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -icon-play-custom-med +icon-home-med rotate: false xy: 983, 643 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 -icon-play-custom-small +icon-home-small rotate: false - xy: 425, 23 + xy: 485, 261 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -icon-play-med +icon-host + rotate: false + xy: 151, 774 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +icon-host-med rotate: false xy: 983, 611 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 -icon-play-small +icon-host-small rotate: false - xy: 459, 57 + xy: 469, 227 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -icon-players +icon-info rotate: false - xy: 401, 874 + xy: 201, 824 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -icon-players-med +icon-info-med rotate: false xy: 1015, 625 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 -icon-players-small +icon-info-small rotate: false - xy: 459, 23 + xy: 469, 193 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -icon-power +icon-itch.io rotate: false - xy: 51, 474 + xy: 251, 874 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -icon-power-med +icon-itch.io-med rotate: false xy: 1047, 625 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 -icon-power-small +icon-itch.io-small rotate: false - xy: 489, 91 + xy: 503, 227 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -icon-production +icon-item rotate: false - xy: 101, 524 + xy: 51, 624 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -icon-production-med +icon-item-med rotate: false xy: 1079, 625 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 -icon-production-small +icon-item-small rotate: false - xy: 493, 57 + xy: 503, 193 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -icon-quit +icon-line rotate: false - xy: 151, 574 + xy: 101, 674 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -icon-quit-med +icon-line-med rotate: false xy: 1111, 625 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 -icon-quit-small +icon-line-small rotate: false - xy: 493, 23 + xy: 539, 327 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -icon-redo +icon-link rotate: false - xy: 201, 624 + xy: 151, 724 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -icon-redo-med +icon-link-med rotate: false - xy: 1143, 624 + xy: 1143, 622 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 -icon-redo-small +icon-link-small rotate: false - xy: 485, 311 + xy: 573, 327 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -icon-refresh +icon-liquid rotate: false - xy: 251, 674 + xy: 201, 774 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -icon-refresh-med +icon-liquid-consume rotate: false - xy: 1175, 624 + xy: 251, 824 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +icon-liquid-consume-med + rotate: false + xy: 1175, 622 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 -icon-refresh-small +icon-liquid-consume-small rotate: false - xy: 469, 277 + xy: 585, 361 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -icon-rename +icon-liquid-med rotate: false - xy: 301, 724 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-rename-med - rotate: false - xy: 1207, 624 + xy: 1207, 622 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 -icon-rename-small +icon-liquid-small rotate: false - xy: 519, 327 + xy: 535, 293 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -icon-resize +icon-load rotate: false - xy: 351, 774 + xy: 301, 874 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -icon-resize-med +icon-load-image rotate: false - xy: 1239, 624 + xy: 51, 574 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +icon-load-image-med + rotate: false + xy: 1239, 622 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 -icon-resize-small +icon-load-image-small rotate: false - xy: 503, 277 + xy: 569, 293 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -icon-rotate +icon-load-map rotate: false - xy: 401, 824 + xy: 101, 624 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -icon-rotate-arrow +icon-load-map-med rotate: false - xy: 451, 874 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-rotate-arrow-med - rotate: false - xy: 1271, 624 + xy: 1271, 622 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 -icon-rotate-arrow-small +icon-load-map-small rotate: false - xy: 491, 243 + xy: 607, 327 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -icon-rotate-left +icon-load-med rotate: false - xy: 51, 424 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-rotate-left-med - rotate: false - xy: 1303, 624 + xy: 1303, 622 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 -icon-rotate-left-small +icon-load-small rotate: false - xy: 491, 209 + xy: 603, 293 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -icon-rotate-med +icon-loading rotate: false - xy: 1335, 624 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-rotate-right - rotate: false - xy: 101, 474 + xy: 151, 674 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -icon-rotate-right-med +icon-loading-med rotate: false - xy: 1367, 624 + xy: 1335, 622 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 -icon-rotate-right-small +icon-loading-small rotate: false - xy: 491, 175 + xy: 619, 369 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -icon-rotate-small +icon-locked rotate: false - xy: 525, 243 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-save - rotate: false - xy: 151, 524 + xy: 201, 724 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -icon-save-image +icon-locked-med rotate: false - xy: 201, 574 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-save-image-med - rotate: false - xy: 1399, 624 + xy: 1367, 622 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 -icon-save-image-small +icon-locked-small rotate: false - xy: 525, 209 + xy: 653, 375 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -icon-save-map +icon-map rotate: false - xy: 251, 624 + xy: 251, 774 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -icon-save-map-med +icon-map-med rotate: false - xy: 1431, 624 + xy: 1399, 622 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 -icon-save-map-small +icon-map-small rotate: false - xy: 525, 175 + xy: 687, 375 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -icon-save-med +icon-menu rotate: false - xy: 1463, 624 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-save-small - rotate: false - xy: 505, 141 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-settings - rotate: false - xy: 301, 674 + xy: 301, 824 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -icon-settings-med +icon-menu-large rotate: false - xy: 1495, 624 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-settings-small - rotate: false - xy: 539, 141 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-spray - rotate: false - xy: 351, 724 + xy: 351, 874 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -icon-spray-med +icon-menu-large-med rotate: false - xy: 1527, 624 + xy: 1431, 622 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 -icon-spray-small +icon-menu-large-small rotate: false - xy: 523, 107 + xy: 721, 375 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -icon-terrain +icon-menu-med rotate: false - xy: 401, 774 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-terrain-med - rotate: false - xy: 1559, 624 + xy: 1463, 622 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 -icon-terrain-small +icon-menu-small rotate: false - xy: 557, 107 + xy: 653, 341 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -icon-tools +icon-missing rotate: false - xy: 451, 824 + xy: 51, 524 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -icon-tools-med +icon-missing-med rotate: false - xy: 1591, 624 + xy: 1495, 622 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 -icon-tools-small +icon-missing-small rotate: false - xy: 527, 73 + xy: 687, 341 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -icon-trash +icon-mode-attack rotate: false - xy: 501, 874 + xy: 101, 574 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -icon-trash-16 +icon-mode-attack-med rotate: false - xy: 51, 374 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-trash-16-med - rotate: false - xy: 1623, 624 + xy: 1527, 622 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 -icon-trash-16-small +icon-mode-attack-small rotate: false - xy: 527, 39 + xy: 721, 341 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -icon-trash-med +icon-mode-pvp rotate: false - xy: 1655, 624 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-trash-small - rotate: false - xy: 561, 73 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-tree - rotate: false - xy: 101, 424 + xy: 151, 624 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -icon-tree-med +icon-mode-pvp-med rotate: false - xy: 1687, 624 + xy: 1559, 622 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 -icon-tree-small - rotate: false - xy: 561, 39 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-trello - rotate: false - xy: 151, 474 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-trello-med - rotate: false - xy: 1719, 624 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-trello-small - rotate: false - xy: 527, 5 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-turret - rotate: false - xy: 201, 524 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-turret-med - rotate: false - xy: 1751, 624 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-turret-small - rotate: false - xy: 561, 5 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-tutorial - rotate: false - xy: 251, 574 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-tutorial-med - rotate: false - xy: 1783, 624 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-tutorial-small - rotate: false - xy: 737, 443 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icon-undo - rotate: false - xy: 301, 624 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icon-undo-med - rotate: false - xy: 1815, 624 - size: 30, 30 - orig: 30, 30 - offset: 0, 0 - index: -1 -icon-undo-small +icon-mode-pvp-small rotate: false xy: 735, 561 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -icon-units +icon-mode-survival rotate: false - xy: 351, 674 + xy: 201, 674 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -icon-units-med +icon-mode-survival-med rotate: false - xy: 983, 579 + xy: 1591, 622 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 -icon-units-small +icon-mode-survival-small rotate: false xy: 719, 527 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -icon-unlocks +icon-none rotate: false - xy: 401, 724 + xy: 251, 724 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -icon-unlocks-med +icon-none-med rotate: false - xy: 1015, 593 + xy: 1623, 622 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 -icon-unlocks-small +icon-none-small rotate: false xy: 769, 577 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -icon-upgrade +icon-paste rotate: false - xy: 451, 774 + xy: 301, 774 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -icon-upgrade-med +icon-paste-med rotate: false - xy: 1047, 593 + xy: 1655, 622 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 -icon-upgrade-small +icon-paste-small rotate: false xy: 753, 527 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -icon-wiki +icon-pause rotate: false - xy: 501, 824 + xy: 351, 824 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -icon-wiki-med +icon-pause-med rotate: false - xy: 1079, 593 + xy: 1687, 622 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 -icon-wiki-small +icon-pause-small rotate: false xy: 741, 493 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -icon-zoom +icon-pencil rotate: false - xy: 551, 874 + xy: 401, 874 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -icon-zoom-med +icon-pencil-med rotate: false - xy: 1111, 593 + xy: 1719, 622 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 -icon-zoom-small +icon-pencil-small + rotate: false + xy: 741, 459 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +icon-pick + rotate: false + xy: 51, 474 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +icon-pick-med + rotate: false + xy: 1751, 622 + size: 30, 30 + orig: 30, 30 + offset: 0, 0 + index: -1 +icon-pick-small + rotate: false + xy: 741, 425 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +icon-play + rotate: false + xy: 101, 524 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +icon-play-2 + rotate: false + xy: 151, 574 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +icon-play-2-med + rotate: false + xy: 1783, 622 + size: 30, 30 + orig: 30, 30 + offset: 0, 0 + index: -1 +icon-play-2-small rotate: false xy: 775, 493 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -ignarock-icon-large +icon-play-custom rotate: false - xy: 51, 324 + xy: 201, 624 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -ignarock-icon-medium +icon-play-custom-med rotate: false - xy: 771, 459 + xy: 983, 579 + size: 30, 30 + orig: 30, 30 + offset: 0, 0 + index: -1 +icon-play-custom-small + rotate: false + xy: 775, 459 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -ignarock-icon-small +icon-play-med rotate: false - xy: 1840, 572 - size: 24, 24 - orig: 24, 24 + xy: 1015, 593 + size: 30, 30 + orig: 30, 30 offset: 0, 0 index: -1 -impact-reactor-icon-large +icon-play-small rotate: false - xy: 101, 374 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -impact-reactor-icon-medium - rotate: false - xy: 771, 425 + xy: 775, 425 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -impact-reactor-icon-small +icon-players rotate: false - xy: 1865, 668 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -incinerator-icon-large - rotate: false - xy: 151, 424 + xy: 251, 674 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -incinerator-icon-medium +icon-players-med + rotate: false + xy: 1047, 593 + size: 30, 30 + orig: 30, 30 + offset: 0, 0 + index: -1 +icon-players-small + rotate: false + xy: 755, 391 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +icon-power + rotate: false + xy: 301, 724 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +icon-power-med + rotate: false + xy: 1079, 593 + size: 30, 30 + orig: 30, 30 + offset: 0, 0 + index: -1 +icon-power-small + rotate: false + xy: 755, 357 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +icon-production + rotate: false + xy: 351, 774 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +icon-production-med + rotate: false + xy: 1111, 593 + size: 30, 30 + orig: 30, 30 + offset: 0, 0 + index: -1 +icon-production-small + rotate: false + xy: 789, 391 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +icon-quit + rotate: false + xy: 401, 824 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +icon-quit-med + rotate: false + xy: 1143, 590 + size: 30, 30 + orig: 30, 30 + offset: 0, 0 + index: -1 +icon-quit-small + rotate: false + xy: 789, 357 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +icon-redo + rotate: false + xy: 451, 874 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +icon-redo-med + rotate: false + xy: 1175, 590 + size: 30, 30 + orig: 30, 30 + offset: 0, 0 + index: -1 +icon-redo-small + rotate: false + xy: 755, 323 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +icon-refresh + rotate: false + xy: 51, 424 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +icon-refresh-med + rotate: false + xy: 1207, 590 + size: 30, 30 + orig: 30, 30 + offset: 0, 0 + index: -1 +icon-refresh-small + rotate: false + xy: 789, 323 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +icon-rename + rotate: false + xy: 101, 474 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +icon-rename-med + rotate: false + xy: 1239, 590 + size: 30, 30 + orig: 30, 30 + offset: 0, 0 + index: -1 +icon-rename-small rotate: false xy: 985, 811 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 +icon-resize + rotate: false + xy: 151, 524 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +icon-resize-med + rotate: false + xy: 1271, 590 + size: 30, 30 + orig: 30, 30 + offset: 0, 0 + index: -1 +icon-resize-small + rotate: false + xy: 969, 777 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +icon-rotate + rotate: false + xy: 201, 574 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +icon-rotate-arrow + rotate: false + xy: 251, 624 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +icon-rotate-arrow-med + rotate: false + xy: 1303, 590 + size: 30, 30 + orig: 30, 30 + offset: 0, 0 + index: -1 +icon-rotate-arrow-small + rotate: false + xy: 1019, 827 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +icon-rotate-left + rotate: false + xy: 301, 674 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +icon-rotate-left-med + rotate: false + xy: 1335, 590 + size: 30, 30 + orig: 30, 30 + offset: 0, 0 + index: -1 +icon-rotate-left-small + rotate: false + xy: 1053, 827 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +icon-rotate-med + rotate: false + xy: 1367, 590 + size: 30, 30 + orig: 30, 30 + offset: 0, 0 + index: -1 +icon-rotate-right + rotate: false + xy: 351, 724 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +icon-rotate-right-med + rotate: false + xy: 1399, 590 + size: 30, 30 + orig: 30, 30 + offset: 0, 0 + index: -1 +icon-rotate-right-small + rotate: false + xy: 1087, 827 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +icon-rotate-small + rotate: false + xy: 1003, 777 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +icon-save + rotate: false + xy: 401, 774 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +icon-save-image + rotate: false + xy: 451, 824 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +icon-save-image-med + rotate: false + xy: 1431, 590 + size: 30, 30 + orig: 30, 30 + offset: 0, 0 + index: -1 +icon-save-image-small + rotate: false + xy: 991, 743 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +icon-save-map + rotate: false + xy: 501, 874 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +icon-save-map-med + rotate: false + xy: 1463, 590 + size: 30, 30 + orig: 30, 30 + offset: 0, 0 + index: -1 +icon-save-map-small + rotate: false + xy: 1037, 793 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +icon-save-med + rotate: false + xy: 1495, 590 + size: 30, 30 + orig: 30, 30 + offset: 0, 0 + index: -1 +icon-save-small + rotate: false + xy: 1071, 793 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +icon-settings + rotate: false + xy: 51, 374 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +icon-settings-med + rotate: false + xy: 1527, 590 + size: 30, 30 + orig: 30, 30 + offset: 0, 0 + index: -1 +icon-settings-small + rotate: false + xy: 991, 709 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +icon-spray + rotate: false + xy: 101, 424 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +icon-spray-med + rotate: false + xy: 1559, 590 + size: 30, 30 + orig: 30, 30 + offset: 0, 0 + index: -1 +icon-spray-small + rotate: false + xy: 1037, 759 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +icon-terrain + rotate: false + xy: 151, 474 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +icon-terrain-med + rotate: false + xy: 1591, 590 + size: 30, 30 + orig: 30, 30 + offset: 0, 0 + index: -1 +icon-terrain-small + rotate: false + xy: 1071, 759 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +icon-tools + rotate: false + xy: 201, 524 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +icon-tools-med + rotate: false + xy: 1623, 590 + size: 30, 30 + orig: 30, 30 + offset: 0, 0 + index: -1 +icon-tools-small + rotate: false + xy: 1025, 725 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +icon-trash + rotate: false + xy: 251, 574 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +icon-trash-16 + rotate: false + xy: 301, 624 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +icon-trash-16-med + rotate: false + xy: 1655, 590 + size: 30, 30 + orig: 30, 30 + offset: 0, 0 + index: -1 +icon-trash-16-small + rotate: false + xy: 1059, 725 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +icon-trash-med + rotate: false + xy: 1687, 590 + size: 30, 30 + orig: 30, 30 + offset: 0, 0 + index: -1 +icon-trash-small + rotate: false + xy: 1105, 793 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +icon-tree + rotate: false + xy: 351, 674 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +icon-tree-med + rotate: false + xy: 1719, 590 + size: 30, 30 + orig: 30, 30 + offset: 0, 0 + index: -1 +icon-tree-small + rotate: false + xy: 1105, 759 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +icon-trello + rotate: false + xy: 401, 724 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +icon-trello-med + rotate: false + xy: 1751, 590 + size: 30, 30 + orig: 30, 30 + offset: 0, 0 + index: -1 +icon-trello-small + rotate: false + xy: 1093, 725 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +icon-turret + rotate: false + xy: 451, 774 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +icon-turret-med + rotate: false + xy: 1783, 590 + size: 30, 30 + orig: 30, 30 + offset: 0, 0 + index: -1 +icon-turret-small + rotate: false + xy: 1025, 691 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +icon-tutorial + rotate: false + xy: 501, 824 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +icon-tutorial-med + rotate: false + xy: 1815, 622 + size: 30, 30 + orig: 30, 30 + offset: 0, 0 + index: -1 +icon-tutorial-small + rotate: false + xy: 1059, 691 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +icon-undo + rotate: false + xy: 551, 874 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +icon-undo-med + rotate: false + xy: 1815, 590 + size: 30, 30 + orig: 30, 30 + offset: 0, 0 + index: -1 +icon-undo-small + rotate: false + xy: 1093, 691 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +icon-units + rotate: false + xy: 51, 324 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +icon-units-med + rotate: false + xy: 1829, 654 + size: 30, 30 + orig: 30, 30 + offset: 0, 0 + index: -1 +icon-units-small + rotate: false + xy: 1127, 725 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +icon-unlocks + rotate: false + xy: 101, 374 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +icon-unlocks-med + rotate: false + xy: 1861, 656 + size: 30, 30 + orig: 30, 30 + offset: 0, 0 + index: -1 +icon-unlocks-small + rotate: false + xy: 1127, 691 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +icon-upgrade + rotate: false + xy: 151, 424 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +icon-upgrade-med + rotate: false + xy: 1893, 656 + size: 30, 30 + orig: 30, 30 + offset: 0, 0 + index: -1 +icon-upgrade-small + rotate: false + xy: 987, 675 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +icon-wiki + rotate: false + xy: 201, 474 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +icon-wiki-med + rotate: false + xy: 1925, 656 + size: 30, 30 + orig: 30, 30 + offset: 0, 0 + index: -1 +icon-wiki-small + rotate: false + xy: 1021, 657 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +icon-zoom + rotate: false + xy: 251, 524 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +icon-zoom-med + rotate: false + xy: 1957, 656 + size: 30, 30 + orig: 30, 30 + offset: 0, 0 + index: -1 +icon-zoom-small + rotate: false + xy: 1055, 657 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +ignarock-icon-large + rotate: false + xy: 301, 574 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +ignarock-icon-medium + rotate: false + xy: 1089, 657 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +ignarock-icon-small + rotate: false + xy: 793, 297 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +impact-reactor-icon-large + rotate: false + xy: 351, 624 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +impact-reactor-icon-medium + rotate: false + xy: 1123, 657 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +impact-reactor-icon-small + rotate: false + xy: 647, 263 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +incinerator-icon-large + rotate: false + xy: 401, 674 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +incinerator-icon-medium + rotate: false + xy: 1139, 822 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 incinerator-icon-small rotate: false - xy: 1891, 670 + xy: 673, 263 size: 24, 24 orig: 24, 24 offset: 0, 0 @@ -12253,7 +12469,7 @@ info-banner index: -1 inventory rotate: false - xy: 805, 451 + xy: 665, 221 size: 24, 40 split: 10, 10, 10, 14 orig: 24, 40 @@ -12261,672 +12477,672 @@ inventory index: -1 item-source-icon-large rotate: false - xy: 201, 474 + xy: 451, 724 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 item-source-icon-medium rotate: false - xy: 969, 777 + xy: 1139, 788 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-source-icon-small rotate: false - xy: 805, 425 + xy: 699, 263 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 item-void-icon-large rotate: false - xy: 251, 524 + xy: 501, 774 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 item-void-icon-medium rotate: false - xy: 1019, 827 + xy: 1173, 822 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-void-icon-small rotate: false - xy: 820, 399 + xy: 691, 237 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 javelin-ship-pad-icon-large rotate: false - xy: 301, 574 + xy: 551, 824 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 javelin-ship-pad-icon-medium rotate: false - xy: 1053, 827 + xy: 1173, 788 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 javelin-ship-pad-icon-small rotate: false - xy: 820, 373 + xy: 725, 263 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 junction-icon-large rotate: false - xy: 351, 624 + xy: 601, 874 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 junction-icon-medium rotate: false - xy: 1087, 827 + xy: 1207, 822 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 junction-icon-small rotate: false - xy: 820, 347 + xy: 717, 237 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 kiln-icon-large rotate: false - xy: 401, 674 + xy: 51, 274 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 kiln-icon-medium rotate: false - xy: 1003, 777 + xy: 1207, 788 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 kiln-icon-small rotate: false - xy: 817, 321 + xy: 751, 271 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 lancer-icon-large rotate: false - xy: 451, 724 + xy: 101, 324 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 lancer-icon-medium rotate: false - xy: 991, 743 + xy: 1241, 822 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 lancer-icon-small rotate: false - xy: 1873, 642 + xy: 777, 271 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 laser-drill-icon-large rotate: false - xy: 501, 774 + xy: 151, 374 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 laser-drill-icon-medium rotate: false - xy: 1037, 793 + xy: 1241, 788 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 laser-drill-icon-small rotate: false - xy: 1899, 644 + xy: 691, 211 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 launch-pad-icon-large rotate: false - xy: 551, 824 + xy: 201, 424 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 launch-pad-icon-medium rotate: false - xy: 1071, 793 + xy: 1275, 822 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 launch-pad-icon-small rotate: false - xy: 1873, 616 + xy: 717, 211 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 launch-pad-large-icon-large rotate: false - xy: 601, 874 + xy: 251, 474 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 launch-pad-large-icon-medium rotate: false - xy: 991, 709 + xy: 1275, 788 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 launch-pad-large-icon-small rotate: false - xy: 1899, 618 + xy: 803, 271 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 liquid-junction-icon-large rotate: false - xy: 51, 274 + xy: 301, 524 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 liquid-junction-icon-medium rotate: false - xy: 1037, 759 + xy: 1309, 822 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 liquid-junction-icon-small rotate: false - xy: 1866, 590 + xy: 819, 297 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 liquid-router-icon-large rotate: false - xy: 101, 324 + xy: 351, 574 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 liquid-router-icon-medium rotate: false - xy: 1071, 759 + xy: 1309, 788 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 liquid-router-icon-small rotate: false - xy: 1866, 564 + xy: 829, 271 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 liquid-source-icon-large rotate: false - xy: 151, 374 + xy: 401, 624 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 liquid-source-icon-medium rotate: false - xy: 1025, 725 + xy: 1343, 822 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 liquid-source-icon-small rotate: false - xy: 1892, 590 + xy: 743, 237 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 liquid-tank-icon-large rotate: false - xy: 201, 424 + xy: 451, 674 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 liquid-tank-icon-medium rotate: false - xy: 1059, 725 + xy: 1343, 788 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 liquid-tank-icon-small rotate: false - xy: 1892, 564 + xy: 743, 211 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 magmarock-icon-large rotate: false - xy: 251, 474 + xy: 501, 724 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 magmarock-icon-medium rotate: false - xy: 1105, 793 + xy: 1377, 822 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 magmarock-icon-small rotate: false - xy: 1918, 592 + xy: 769, 245 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 mass-driver-icon-large rotate: false - xy: 301, 524 + xy: 551, 774 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 mass-driver-icon-medium rotate: false - xy: 1105, 759 + xy: 1377, 788 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 mass-driver-icon-small rotate: false - xy: 1918, 566 + xy: 769, 219 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 mechanical-drill-icon-large rotate: false - xy: 351, 574 + xy: 601, 824 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 mechanical-drill-icon-medium rotate: false - xy: 1093, 725 + xy: 1411, 822 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 mechanical-drill-icon-small rotate: false - xy: 887, 571 + xy: 795, 245 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 mechanical-pump-icon-large rotate: false - xy: 401, 624 + xy: 651, 874 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 mechanical-pump-icon-medium rotate: false - xy: 1025, 691 + xy: 1411, 788 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 mechanical-pump-icon-small rotate: false - xy: 913, 571 + xy: 795, 219 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 meltdown-icon-large rotate: false - xy: 451, 674 + xy: 51, 224 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 meltdown-icon-medium rotate: false - xy: 1059, 691 + xy: 1445, 822 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 meltdown-icon-small rotate: false - xy: 939, 571 + xy: 821, 245 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 melter-icon-large rotate: false - xy: 501, 724 + xy: 101, 274 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 melter-icon-medium rotate: false - xy: 1093, 691 + xy: 1445, 788 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 melter-icon-small rotate: false - xy: 637, 321 + xy: 821, 219 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 mend-projector-icon-large rotate: false - xy: 551, 774 + xy: 151, 324 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 mend-projector-icon-medium rotate: false - xy: 1127, 725 + xy: 1479, 822 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 mend-projector-icon-small rotate: false - xy: 663, 321 + xy: 769, 193 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 mender-icon-large rotate: false - xy: 601, 824 + xy: 201, 374 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 mender-icon-medium rotate: false - xy: 1127, 691 + xy: 1479, 788 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 mender-icon-small rotate: false - xy: 689, 321 + xy: 795, 193 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 metal-floor-2-icon-large rotate: false - xy: 651, 874 + xy: 251, 424 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 metal-floor-2-icon-medium rotate: false - xy: 987, 675 + xy: 1513, 822 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 metal-floor-2-icon-small rotate: false - xy: 715, 321 + xy: 821, 193 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 metal-floor-3-icon-large rotate: false - xy: 51, 224 + xy: 301, 474 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 metal-floor-3-icon-medium rotate: false - xy: 1021, 657 + xy: 1513, 788 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 metal-floor-3-icon-small rotate: false - xy: 843, 321 + xy: 847, 245 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 metal-floor-5-icon-large rotate: false - xy: 101, 274 + xy: 351, 524 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 metal-floor-5-icon-medium rotate: false - xy: 1055, 657 + xy: 1547, 822 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 metal-floor-5-icon-small rotate: false - xy: 1236, 560 + xy: 847, 219 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 metal-floor-damaged-icon-large rotate: false - xy: 151, 324 + xy: 401, 574 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 metal-floor-damaged-icon-medium rotate: false - xy: 1089, 657 + xy: 1547, 788 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 metal-floor-damaged-icon-small rotate: false - xy: 1262, 560 + xy: 847, 193 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 metal-floor-icon-large rotate: false - xy: 201, 374 + xy: 451, 624 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 metal-floor-icon-medium rotate: false - xy: 1123, 657 + xy: 1581, 822 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 metal-floor-icon-small rotate: false - xy: 1288, 546 + xy: 887, 571 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 moss-icon-large rotate: false - xy: 251, 424 + xy: 501, 674 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 moss-icon-medium rotate: false - xy: 1139, 822 + xy: 1581, 788 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 moss-icon-small rotate: false - xy: 1314, 546 + xy: 913, 571 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 multi-press-icon-large rotate: false - xy: 301, 474 + xy: 551, 724 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 multi-press-icon-medium rotate: false - xy: 1139, 788 + xy: 1615, 822 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 multi-press-icon-small rotate: false - xy: 1340, 546 + xy: 939, 571 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 oil-extractor-icon-large rotate: false - xy: 351, 524 + xy: 601, 774 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 oil-extractor-icon-medium rotate: false - xy: 1173, 822 + xy: 1615, 788 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 oil-extractor-icon-small rotate: false - xy: 1366, 546 + xy: 541, 93 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 omega-mech-pad-icon-large rotate: false - xy: 401, 574 + xy: 651, 824 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 omega-mech-pad-icon-medium rotate: false - xy: 1173, 788 + xy: 1649, 822 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 omega-mech-pad-icon-small rotate: false - xy: 1392, 546 + xy: 567, 93 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 overdrive-projector-icon-large rotate: false - xy: 451, 624 + xy: 701, 874 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 overdrive-projector-icon-medium rotate: false - xy: 1207, 822 + xy: 1649, 788 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 overdrive-projector-icon-small rotate: false - xy: 1418, 546 + xy: 593, 93 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 overflow-gate-icon-large rotate: false - xy: 501, 674 + xy: 51, 174 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 overflow-gate-icon-medium rotate: false - xy: 1207, 788 + xy: 1683, 822 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 overflow-gate-icon-small rotate: false - xy: 1444, 546 + xy: 619, 93 size: 24, 24 orig: 24, 24 offset: 0, 0 @@ -12941,7 +13157,7 @@ pane index: -1 pane-2 rotate: false - xy: 351, 216 + xy: 601, 466 size: 36, 27 split: 12, 12, 12, 12 orig: 36, 27 @@ -12949,805 +13165,805 @@ pane-2 index: -1 pebbles-icon-large rotate: false - xy: 551, 724 + xy: 101, 224 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 pebbles-icon-medium rotate: false - xy: 1241, 822 + xy: 1683, 788 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 pebbles-icon-small rotate: false - xy: 1470, 546 + xy: 645, 93 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 phantom-factory-icon-large rotate: false - xy: 601, 774 + xy: 151, 274 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 phantom-factory-icon-medium rotate: false - xy: 1241, 788 + xy: 1717, 822 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 phantom-factory-icon-small rotate: false - xy: 1496, 546 + xy: 1899, 564 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 phase-conduit-icon-large rotate: false - xy: 651, 824 + xy: 201, 324 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 phase-conduit-icon-medium rotate: false - xy: 1275, 822 + xy: 1717, 788 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 phase-conduit-icon-small rotate: false - xy: 1522, 546 + xy: 1925, 564 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 phase-conveyor-icon-large rotate: false - xy: 701, 874 + xy: 251, 374 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 phase-conveyor-icon-medium rotate: false - xy: 1275, 788 + xy: 1751, 822 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 phase-conveyor-icon-small rotate: false - xy: 1548, 546 + xy: 1951, 566 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 phase-wall-icon-large rotate: false - xy: 51, 174 + xy: 301, 424 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 phase-wall-icon-medium rotate: false - xy: 1309, 822 + xy: 1751, 788 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 phase-wall-icon-small rotate: false - xy: 1574, 546 + xy: 1977, 584 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 phase-wall-large-icon-large rotate: false - xy: 101, 224 + xy: 351, 474 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 phase-wall-large-icon-medium rotate: false - xy: 1309, 788 + xy: 1785, 822 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 phase-wall-large-icon-small rotate: false - xy: 1600, 546 + xy: 2003, 584 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 phase-weaver-icon-large rotate: false - xy: 151, 274 + xy: 401, 524 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 phase-weaver-icon-medium rotate: false - xy: 1343, 822 + xy: 1785, 788 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 phase-weaver-icon-small rotate: false - xy: 1626, 546 + xy: 1977, 558 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 pine-icon-large rotate: false - xy: 201, 324 + xy: 451, 574 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 pine-icon-medium rotate: false - xy: 1343, 788 + xy: 1819, 822 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 pine-icon-small rotate: false - xy: 1652, 546 + xy: 2003, 558 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 plastanium-compressor-icon-large rotate: false - xy: 251, 374 + xy: 501, 624 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 plastanium-compressor-icon-medium rotate: false - xy: 1377, 822 + xy: 1819, 788 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 plastanium-compressor-icon-small rotate: false - xy: 1678, 546 + xy: 1951, 540 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 pneumatic-drill-icon-large rotate: false - xy: 301, 424 + xy: 551, 674 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 pneumatic-drill-icon-medium rotate: false - xy: 1377, 788 + xy: 1853, 822 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 pneumatic-drill-icon-small rotate: false - xy: 1704, 546 + xy: 1977, 532 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 power-node-icon-large rotate: false - xy: 351, 474 + xy: 601, 724 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 power-node-icon-medium rotate: false - xy: 1411, 822 + xy: 1853, 788 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 power-node-icon-small rotate: false - xy: 1730, 546 + xy: 2003, 532 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 power-node-large-icon-large rotate: false - xy: 401, 524 + xy: 651, 774 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 power-node-large-icon-medium rotate: false - xy: 1411, 788 + xy: 1887, 822 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 power-node-large-icon-small rotate: false - xy: 1756, 546 + xy: 387, 91 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 power-source-icon-large rotate: false - xy: 451, 574 + xy: 701, 824 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 power-source-icon-medium rotate: false - xy: 1445, 822 + xy: 1887, 788 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 power-source-icon-small rotate: false - xy: 1782, 546 + xy: 413, 107 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 power-void-icon-large rotate: false - xy: 501, 624 + xy: 751, 874 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 power-void-icon-medium rotate: false - xy: 1445, 788 + xy: 1921, 822 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 power-void-icon-small rotate: false - xy: 1808, 546 + xy: 413, 81 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 pulse-conduit-icon-large rotate: false - xy: 551, 674 + xy: 51, 124 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 pulse-conduit-icon-medium rotate: false - xy: 1479, 822 + xy: 1921, 788 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 pulse-conduit-icon-small rotate: false - xy: 1834, 546 + xy: 439, 89 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 pulverizer-icon-large rotate: false - xy: 601, 724 + xy: 101, 174 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 pulverizer-icon-medium rotate: false - xy: 1479, 788 + xy: 1955, 822 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 pulverizer-icon-small rotate: false - xy: 1860, 538 + xy: 465, 89 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 pyratite-mixer-icon-large rotate: false - xy: 651, 774 + xy: 151, 224 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 pyratite-mixer-icon-medium rotate: false - xy: 1513, 822 + xy: 1955, 788 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 pyratite-mixer-icon-small rotate: false - xy: 1886, 538 + xy: 491, 89 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 repair-point-icon-large rotate: false - xy: 701, 824 + xy: 201, 274 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 repair-point-icon-medium rotate: false - xy: 1513, 788 + xy: 1989, 822 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 repair-point-icon-small rotate: false - xy: 1912, 538 + xy: 439, 63 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 revenant-factory-icon-large rotate: false - xy: 751, 874 + xy: 251, 324 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 revenant-factory-icon-medium rotate: false - xy: 1547, 822 + xy: 1989, 788 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 revenant-factory-icon-small rotate: false - xy: 1938, 540 + xy: 465, 63 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 ripple-icon-large rotate: false - xy: 51, 124 + xy: 301, 374 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 ripple-icon-medium rotate: false - xy: 1547, 788 + xy: 1161, 754 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ripple-icon-small rotate: false - xy: 1907, 728 + xy: 491, 63 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 rock-icon-large rotate: false - xy: 101, 174 + xy: 351, 424 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 rock-icon-medium rotate: false - xy: 1581, 822 + xy: 1161, 720 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 rock-icon-small rotate: false - xy: 1933, 730 + xy: 517, 67 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 rocks-icon-large rotate: false - xy: 151, 224 + xy: 401, 474 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 rocks-icon-medium rotate: false - xy: 1581, 788 + xy: 1195, 754 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 rocks-icon-small rotate: false - xy: 1959, 730 + xy: 543, 67 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 rotary-pump-icon-large rotate: false - xy: 201, 274 + xy: 451, 524 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 rotary-pump-icon-medium rotate: false - xy: 1615, 822 + xy: 1195, 720 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 rotary-pump-icon-small rotate: false - xy: 1985, 730 + xy: 569, 67 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 router-icon-large rotate: false - xy: 251, 324 + xy: 501, 574 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 router-icon-medium rotate: false - xy: 1615, 788 + xy: 1229, 754 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 router-icon-small rotate: false - xy: 2011, 730 + xy: 595, 67 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 rtg-generator-icon-large rotate: false - xy: 301, 374 + xy: 551, 624 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 rtg-generator-icon-medium rotate: false - xy: 1649, 822 + xy: 1229, 720 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 rtg-generator-icon-small rotate: false - xy: 1917, 702 + xy: 621, 67 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 salt-icon-large rotate: false - xy: 351, 424 + xy: 601, 674 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 salt-icon-medium rotate: false - xy: 1649, 788 + xy: 1263, 754 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 salt-icon-small rotate: false - xy: 1917, 676 + xy: 647, 67 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 saltrocks-icon-large rotate: false - xy: 401, 474 + xy: 651, 724 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 saltrocks-icon-medium rotate: false - xy: 1683, 822 + xy: 1263, 720 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 saltrocks-icon-small rotate: false - xy: 1943, 704 + xy: 517, 41 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 salvo-icon-large rotate: false - xy: 451, 524 + xy: 701, 774 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 salvo-icon-medium rotate: false - xy: 1683, 788 + xy: 1297, 754 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 salvo-icon-small rotate: false - xy: 1969, 704 + xy: 543, 41 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 sand-boulder-icon-large rotate: false - xy: 501, 574 + xy: 751, 824 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 sand-boulder-icon-medium rotate: false - xy: 1717, 822 + xy: 1297, 720 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 sand-boulder-icon-small rotate: false - xy: 1943, 678 + xy: 569, 41 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 sand-icon-large rotate: false - xy: 551, 624 + xy: 801, 874 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 sand-icon-medium rotate: false - xy: 1717, 788 + xy: 1331, 754 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 sand-icon-small rotate: false - xy: 1995, 704 + xy: 595, 41 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 sand-water-icon-large rotate: false - xy: 601, 674 + xy: 51, 74 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 sand-water-icon-medium rotate: false - xy: 1751, 822 + xy: 1331, 720 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 sand-water-icon-small rotate: false - xy: 1969, 678 + xy: 621, 41 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 sandrocks-icon-large rotate: false - xy: 651, 724 + xy: 101, 124 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 sandrocks-icon-medium rotate: false - xy: 1751, 788 + xy: 1365, 754 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 sandrocks-icon-small rotate: false - xy: 1995, 678 + xy: 647, 41 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 scatter-icon-large rotate: false - xy: 701, 774 + xy: 151, 174 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 scatter-icon-medium rotate: false - xy: 1785, 822 + xy: 1365, 720 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 scatter-icon-small rotate: false - xy: 2021, 704 + xy: 803, 567 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 scorch-icon-large rotate: false - xy: 751, 824 + xy: 201, 224 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 scorch-icon-medium rotate: false - xy: 1785, 788 + xy: 1399, 754 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 scorch-icon-small rotate: false - xy: 2021, 678 + xy: 829, 567 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 scrap-wall-gigantic-icon-large rotate: false - xy: 801, 874 + xy: 251, 274 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 scrap-wall-gigantic-icon-medium rotate: false - xy: 1819, 822 + xy: 1399, 720 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 scrap-wall-gigantic-icon-small rotate: false - xy: 1925, 650 + xy: 855, 567 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 scrap-wall-huge-icon-large rotate: false - xy: 51, 74 + xy: 301, 324 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 scrap-wall-huge-icon-medium rotate: false - xy: 1819, 788 + xy: 1433, 754 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 scrap-wall-huge-icon-small rotate: false - xy: 1925, 624 + xy: 787, 541 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 scrap-wall-icon-large rotate: false - xy: 101, 124 + xy: 351, 374 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 scrap-wall-icon-medium rotate: false - xy: 1853, 822 + xy: 1433, 720 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 scrap-wall-icon-small rotate: false - xy: 1951, 652 + xy: 813, 541 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 scrap-wall-large-icon-large rotate: false - xy: 151, 174 + xy: 401, 424 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 scrap-wall-large-icon-medium rotate: false - xy: 1853, 788 + xy: 1467, 754 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 scrap-wall-large-icon-small rotate: false - xy: 1977, 652 + xy: 839, 541 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 scroll rotate: false - xy: 1977, 615 + xy: 809, 462 size: 24, 35 split: 10, 10, 6, 5 orig: 24, 35 @@ -13771,7 +13987,7 @@ scroll-knob-horizontal-black index: -1 scroll-knob-vertical-black rotate: false - xy: 1951, 610 + xy: 809, 499 size: 24, 40 split: 10, 10, 6, 10 orig: 24, 40 @@ -13779,182 +13995,182 @@ scroll-knob-vertical-black index: -1 selection rotate: false - xy: 1157, 688 + xy: 1143, 654 size: 1, 1 orig: 1, 1 offset: 0, 0 index: -1 separator-icon-large rotate: false - xy: 201, 224 + xy: 451, 474 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 separator-icon-medium rotate: false - xy: 1887, 822 + xy: 1467, 720 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 separator-icon-small rotate: false - xy: 2003, 652 + xy: 835, 515 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 shale-boulder-icon-large rotate: false - xy: 251, 274 + xy: 501, 524 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 shale-boulder-icon-medium rotate: false - xy: 1887, 788 + xy: 1501, 754 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 shale-boulder-icon-small rotate: false - xy: 2003, 626 + xy: 809, 436 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 shale-icon-large rotate: false - xy: 301, 324 + xy: 551, 574 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 shale-icon-medium rotate: false - xy: 1921, 822 + xy: 1501, 720 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 shale-icon-small rotate: false - xy: 1944, 584 + xy: 835, 489 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 shalerocks-icon-large rotate: false - xy: 351, 374 + xy: 601, 624 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 shalerocks-icon-medium rotate: false - xy: 1921, 788 + xy: 1535, 754 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 shalerocks-icon-small rotate: false - xy: 2003, 600 + xy: 835, 463 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 shock-mine-icon-large rotate: false - xy: 401, 424 + xy: 651, 674 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 shock-mine-icon-medium rotate: false - xy: 1955, 822 + xy: 1535, 720 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 shock-mine-icon-small rotate: false - xy: 1977, 589 + xy: 835, 437 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 shrubs-icon-large rotate: false - xy: 451, 474 + xy: 701, 724 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 shrubs-icon-medium rotate: false - xy: 1955, 788 + xy: 1569, 754 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 shrubs-icon-small rotate: false - xy: 2003, 574 + xy: 865, 541 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 silicon-smelter-icon-large rotate: false - xy: 501, 524 + xy: 751, 774 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 silicon-smelter-icon-medium rotate: false - xy: 1989, 822 + xy: 1569, 720 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 silicon-smelter-icon-small rotate: false - xy: 1938, 514 + xy: 861, 515 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 slider rotate: false - xy: 791, 352 + xy: 43, 20 size: 1, 8 orig: 1, 8 offset: 0, 0 index: -1 slider-knob rotate: false - xy: 1143, 584 + xy: 1847, 614 size: 29, 38 orig: 29, 38 offset: 0, 0 index: -1 slider-knob-down rotate: false - xy: 1174, 584 + xy: 1878, 616 size: 29, 38 orig: 29, 38 offset: 0, 0 index: -1 slider-knob-over rotate: false - xy: 1205, 584 + xy: 1909, 616 size: 29, 38 orig: 29, 38 offset: 0, 0 @@ -13968,756 +14184,756 @@ slider-vertical index: -1 snow-icon-large rotate: false - xy: 551, 574 + xy: 801, 824 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 snow-icon-medium rotate: false - xy: 1989, 788 + xy: 1603, 754 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 snow-icon-small rotate: false - xy: 803, 567 + xy: 861, 489 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 snow-pine-icon-large rotate: false - xy: 601, 624 + xy: 851, 874 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 snow-pine-icon-medium rotate: false - xy: 1161, 754 + xy: 1603, 720 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 snow-pine-icon-small rotate: false - xy: 829, 567 + xy: 861, 463 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 snowrock-icon-large rotate: false - xy: 651, 674 + xy: 101, 74 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 snowrock-icon-medium rotate: false - xy: 1161, 720 + xy: 1637, 754 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 snowrock-icon-small rotate: false - xy: 855, 567 + xy: 861, 437 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 snowrocks-icon-large rotate: false - xy: 701, 724 + xy: 151, 124 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 snowrocks-icon-medium rotate: false - xy: 1195, 754 + xy: 1637, 720 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 snowrocks-icon-small rotate: false - xy: 787, 541 + xy: 891, 545 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 solar-panel-icon-large rotate: false - xy: 751, 774 + xy: 201, 174 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 solar-panel-icon-medium rotate: false - xy: 1195, 720 + xy: 1671, 754 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 solar-panel-icon-small rotate: false - xy: 813, 541 + xy: 917, 545 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 solar-panel-large-icon-large rotate: false - xy: 801, 824 + xy: 251, 224 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 solar-panel-large-icon-medium rotate: false - xy: 1229, 754 + xy: 1671, 720 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 solar-panel-large-icon-small rotate: false - xy: 839, 541 + xy: 943, 545 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 sorter-icon-large rotate: false - xy: 851, 874 + xy: 301, 274 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 sorter-icon-medium rotate: false - xy: 1229, 720 + xy: 1705, 754 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 sorter-icon-small rotate: false - xy: 865, 541 + xy: 887, 515 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 spawn-icon-large rotate: false - xy: 101, 74 + xy: 351, 324 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 spawn-icon-medium rotate: false - xy: 1263, 754 + xy: 1705, 720 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 spawn-icon-small rotate: false - xy: 891, 545 + xy: 887, 489 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 spectre-icon-large rotate: false - xy: 151, 124 + xy: 401, 374 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 spectre-icon-medium rotate: false - xy: 1263, 720 + xy: 1739, 754 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 spectre-icon-small rotate: false - xy: 917, 545 + xy: 887, 463 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 spirit-factory-icon-large rotate: false - xy: 201, 174 + xy: 451, 424 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 spirit-factory-icon-medium rotate: false - xy: 1297, 754 + xy: 1739, 720 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 spirit-factory-icon-small rotate: false - xy: 943, 545 + xy: 887, 437 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 spore-cluster-icon-large rotate: false - xy: 251, 224 + xy: 501, 474 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 spore-cluster-icon-medium rotate: false - xy: 1297, 720 + xy: 1773, 754 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 spore-cluster-icon-small rotate: false - xy: 809, 515 + xy: 913, 519 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 spore-moss-icon-large rotate: false - xy: 301, 274 + xy: 551, 524 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 spore-moss-icon-medium rotate: false - xy: 1331, 754 + xy: 1773, 720 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 spore-moss-icon-small rotate: false - xy: 835, 515 + xy: 913, 493 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 spore-pine-icon-large rotate: false - xy: 351, 324 + xy: 601, 574 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 spore-pine-icon-medium rotate: false - xy: 1331, 720 + xy: 1807, 754 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 spore-pine-icon-small rotate: false - xy: 861, 515 + xy: 939, 519 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 spore-press-icon-large rotate: false - xy: 401, 374 + xy: 651, 624 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 spore-press-icon-medium rotate: false - xy: 1365, 754 + xy: 1807, 720 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 spore-press-icon-small rotate: false - xy: 891, 519 + xy: 913, 467 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 sporerocks-icon-large rotate: false - xy: 451, 424 + xy: 701, 674 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 sporerocks-icon-medium rotate: false - xy: 1365, 720 + xy: 1841, 754 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 sporerocks-icon-small rotate: false - xy: 917, 519 + xy: 939, 493 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 stone-icon-large rotate: false - xy: 501, 474 + xy: 751, 724 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 stone-icon-medium rotate: false - xy: 1399, 754 + xy: 1841, 720 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 stone-icon-small rotate: false - xy: 943, 519 + xy: 913, 441 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 surge-tower-icon-large rotate: false - xy: 551, 524 + xy: 801, 774 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 surge-tower-icon-medium rotate: false - xy: 1399, 720 + xy: 1875, 754 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 surge-tower-icon-small rotate: false - xy: 969, 553 + xy: 939, 467 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 surge-wall-icon-large rotate: false - xy: 601, 574 + xy: 851, 824 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 surge-wall-icon-medium rotate: false - xy: 1433, 754 + xy: 1875, 720 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 surge-wall-icon-small rotate: false - xy: 969, 527 + xy: 939, 441 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 surge-wall-large-icon-large rotate: false - xy: 651, 624 + xy: 901, 874 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 surge-wall-large-icon-medium rotate: false - xy: 1433, 720 + xy: 1909, 754 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 surge-wall-large-icon-small rotate: false - xy: 969, 501 + xy: 969, 553 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 swarmer-icon-large rotate: false - xy: 701, 674 + xy: 151, 74 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 swarmer-icon-medium rotate: false - xy: 1467, 754 + xy: 1909, 720 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 swarmer-icon-small rotate: false - xy: 995, 541 + xy: 969, 527 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 tainted-water-icon-large rotate: false - xy: 751, 724 + xy: 201, 124 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 tainted-water-icon-medium rotate: false - xy: 1467, 720 + xy: 1943, 754 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 tainted-water-icon-small rotate: false - xy: 1021, 541 + xy: 965, 501 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 tar-icon-large rotate: false - xy: 801, 774 + xy: 251, 174 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 tar-icon-medium rotate: false - xy: 1501, 754 + xy: 1943, 720 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 tar-icon-small rotate: false - xy: 995, 515 + xy: 965, 475 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 tau-mech-pad-icon-large rotate: false - xy: 851, 824 + xy: 301, 224 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 tau-mech-pad-icon-medium rotate: false - xy: 1501, 720 + xy: 1977, 754 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 tau-mech-pad-icon-small rotate: false - xy: 1047, 541 + xy: 965, 449 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 tendrils-icon-large rotate: false - xy: 901, 874 + xy: 351, 274 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 tendrils-icon-medium rotate: false - xy: 1535, 754 + xy: 1977, 720 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 tendrils-icon-small rotate: false - xy: 1021, 515 + xy: 965, 423 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 thermal-generator-icon-large rotate: false - xy: 151, 74 + xy: 401, 324 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 thermal-generator-icon-medium rotate: false - xy: 1535, 720 + xy: 1161, 686 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 thermal-generator-icon-small rotate: false - xy: 1073, 541 + xy: 995, 541 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 thermal-pump-icon-large rotate: false - xy: 201, 124 + xy: 451, 374 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 thermal-pump-icon-medium rotate: false - xy: 1569, 754 + xy: 1195, 686 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 thermal-pump-icon-small rotate: false - xy: 1047, 515 + xy: 1021, 541 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 thorium-reactor-icon-large rotate: false - xy: 251, 174 + xy: 501, 424 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 thorium-reactor-icon-medium rotate: false - xy: 1569, 720 + xy: 1229, 686 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 thorium-reactor-icon-small rotate: false - xy: 1073, 515 + xy: 1047, 541 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 thorium-wall-icon-large rotate: false - xy: 301, 224 + xy: 551, 474 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 thorium-wall-icon-medium rotate: false - xy: 1603, 754 + xy: 1263, 686 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 thorium-wall-icon-small rotate: false - xy: 1099, 541 + xy: 1073, 541 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 thorium-wall-large-icon-large rotate: false - xy: 351, 274 + xy: 601, 524 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 thorium-wall-large-icon-medium rotate: false - xy: 1603, 720 + xy: 1297, 686 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 thorium-wall-large-icon-small rotate: false - xy: 1099, 515 + xy: 1099, 541 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 thruster-icon-large rotate: false - xy: 401, 324 + xy: 651, 574 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 thruster-icon-medium rotate: false - xy: 1637, 754 + xy: 1331, 686 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 thruster-icon-small rotate: false - xy: 995, 489 + xy: 995, 515 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 titan-factory-icon-large rotate: false - xy: 451, 374 + xy: 701, 624 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 titan-factory-icon-medium rotate: false - xy: 1637, 720 + xy: 1365, 686 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titan-factory-icon-small rotate: false - xy: 1021, 489 + xy: 1021, 515 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 titanium-conveyor-icon-large rotate: false - xy: 501, 424 + xy: 751, 674 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 titanium-conveyor-icon-medium rotate: false - xy: 1671, 754 + xy: 1399, 686 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-conveyor-icon-small rotate: false - xy: 1047, 489 + xy: 1047, 515 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 titanium-wall-icon-large rotate: false - xy: 551, 474 + xy: 801, 724 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 titanium-wall-icon-medium rotate: false - xy: 1671, 720 + xy: 1433, 686 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-wall-icon-small rotate: false - xy: 1073, 489 + xy: 1073, 515 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 titanium-wall-large-icon-large rotate: false - xy: 601, 524 + xy: 851, 774 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 titanium-wall-large-icon-medium rotate: false - xy: 1705, 754 + xy: 1467, 686 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-wall-large-icon-small rotate: false - xy: 1099, 489 + xy: 1099, 515 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 trident-ship-pad-icon-large rotate: false - xy: 651, 574 + xy: 901, 824 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 trident-ship-pad-icon-medium rotate: false - xy: 1705, 720 + xy: 1501, 686 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 trident-ship-pad-icon-small rotate: false - xy: 831, 489 + xy: 991, 489 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 turbine-generator-icon-large rotate: false - xy: 701, 624 + xy: 951, 874 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 turbine-generator-icon-medium rotate: false - xy: 1739, 754 + xy: 1535, 686 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 turbine-generator-icon-small rotate: false - xy: 831, 463 + xy: 991, 463 size: 24, 24 orig: 24, 24 offset: 0, 0 @@ -14740,7 +14956,7 @@ underline-2 index: -1 underline-disabled rotate: false - xy: 351, 187 + xy: 601, 437 size: 36, 27 split: 12, 12, 12, 12 orig: 36, 27 @@ -14756,147 +14972,147 @@ underline-red index: -1 unloader-icon-large rotate: false - xy: 751, 674 + xy: 201, 74 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 unloader-icon-medium rotate: false - xy: 1739, 720 + xy: 1569, 686 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 unloader-icon-small rotate: false - xy: 857, 489 + xy: 1017, 489 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 vault-icon-large rotate: false - xy: 801, 724 + xy: 251, 124 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 vault-icon-medium rotate: false - xy: 1773, 754 + xy: 1603, 686 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 vault-icon-small rotate: false - xy: 831, 437 + xy: 991, 437 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 water-extractor-icon-large rotate: false - xy: 851, 774 + xy: 301, 174 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 water-extractor-icon-medium rotate: false - xy: 1773, 720 + xy: 1637, 686 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 water-extractor-icon-small rotate: false - xy: 857, 463 + xy: 1017, 463 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 water-icon-large rotate: false - xy: 901, 824 + xy: 351, 224 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 water-icon-medium rotate: false - xy: 1807, 754 + xy: 1671, 686 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 water-icon-small rotate: false - xy: 857, 437 + xy: 1043, 489 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 wave-icon-large rotate: false - xy: 951, 874 + xy: 401, 274 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 wave-icon-medium rotate: false - xy: 1807, 720 + xy: 1705, 686 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 wave-icon-small rotate: false - xy: 846, 411 + xy: 1017, 437 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 white-tree-dead-icon-large rotate: false - xy: 201, 74 + xy: 451, 324 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 white-tree-dead-icon-medium rotate: false - xy: 1841, 754 + xy: 1739, 686 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 white-tree-dead-icon-small rotate: false - xy: 846, 385 + xy: 1043, 463 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 white-tree-icon-large rotate: false - xy: 251, 124 + xy: 501, 374 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 white-tree-icon-medium rotate: false - xy: 1841, 720 + xy: 1773, 686 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 white-tree-icon-small rotate: false - xy: 846, 359 + xy: 1069, 489 size: 24, 24 orig: 24, 24 offset: 0, 0 @@ -14910,7 +15126,7 @@ whiteui index: -1 window-empty rotate: false - xy: 765, 362 + xy: 2011, 725 size: 27, 61 split: 8, 8, 44, 11 orig: 27, 61 @@ -14918,21 +15134,21 @@ window-empty index: -1 wraith-factory-icon-large rotate: false - xy: 301, 174 + xy: 551, 424 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 wraith-factory-icon-medium rotate: false - xy: 1875, 754 + xy: 1807, 686 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 wraith-factory-icon-small rotate: false - xy: 872, 411 + xy: 1043, 437 size: 24, 24 orig: 24, 24 offset: 0, 0 diff --git a/core/assets/sprites/sprites.png b/core/assets/sprites/sprites.png index b49383e412..4d22a79c42 100644 Binary files a/core/assets/sprites/sprites.png and b/core/assets/sprites/sprites.png differ diff --git a/core/assets/sprites/sprites2.png b/core/assets/sprites/sprites2.png index 03c100c4da..305ed3765f 100644 Binary files a/core/assets/sprites/sprites2.png and b/core/assets/sprites/sprites2.png differ diff --git a/core/assets/sprites/sprites3.png b/core/assets/sprites/sprites3.png index 1776b09b12..9c08c17bf7 100644 Binary files a/core/assets/sprites/sprites3.png and b/core/assets/sprites/sprites3.png differ diff --git a/core/assets/sprites/sprites4.png b/core/assets/sprites/sprites4.png index 8887453e93..1776b09b12 100644 Binary files a/core/assets/sprites/sprites4.png and b/core/assets/sprites/sprites4.png differ diff --git a/core/assets/sprites/sprites5.png b/core/assets/sprites/sprites5.png new file mode 100644 index 0000000000..addc55c7dd Binary files /dev/null and b/core/assets/sprites/sprites5.png differ diff --git a/core/assets/zones/nomap.png b/core/assets/zones/nomap.png deleted file mode 100644 index 00241f7666..0000000000 Binary files a/core/assets/zones/nomap.png and /dev/null differ diff --git a/core/src/io/anuke/mindustry/ClientLauncher.java b/core/src/io/anuke/mindustry/ClientLauncher.java new file mode 100644 index 0000000000..d564e62d5c --- /dev/null +++ b/core/src/io/anuke/mindustry/ClientLauncher.java @@ -0,0 +1,177 @@ +package io.anuke.mindustry; + +import io.anuke.arc.*; +import io.anuke.arc.assets.*; +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.core.*; +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.maps.*; + +import static io.anuke.arc.Core.*; +import static io.anuke.mindustry.Vars.*; + +public class ClientLauncher extends ApplicationCore{ + private static final int loadingFPS = 20; + + private float smoothProgress; + private long lastTime; + private long beginTime; + private boolean finished = false; + + @Override + public void setup(){ + Log.setUseColors(false); + beginTime = Time.millis(); + + Time.setDeltaProvider(() -> { + float result = Core.graphics.getDeltaTime() * 60f; + return (Float.isNaN(result) || Float.isInfinite(result)) ? 1f : Mathf.clamp(result, 0.0001f, 60f / 10f); + }); + + batch = new SpriteBatch(); + assets = new AssetManager(); + assets.setLoader(Texture.class, "." + mapExtension, new MapPreviewLoader()); + atlas = TextureAtlas.blankAtlas(); + + UI.loadDefaultFont(); + UI.loadSystemCursors(); + + //1. bundles + //2. rest of vars + assets.load(new Vars()); + assets.load(new AssetDescriptor<>("sprites/sprites.atlas", TextureAtlas.class)).loaded = t -> atlas = (TextureAtlas)t; + + assets.loadRun("maps", Map.class, () -> { + maps.loadPreviews(); + }); + + Musics.load(); + Sounds.load(); + + assets.loadRun("contentcreate", Content.class, () -> { + content.createContent(); + content.loadColors(); + }); + + add(logic = new Logic()); + add(control = new Control()); + add(renderer = new Renderer()); + add(ui = new UI()); + add(netServer = new NetServer()); + add(netClient = new NetClient()); + + assets.loadRun("contentinit", ContentLoader.class, () -> { + content.init(); + content.load(); + }); + } + + @Override + public void add(ApplicationListener module){ + super.add(module); + + //autoload modules when necessary + if(module instanceof Loadable){ + assets.load((Loadable)module); + } + } + + @Override + public void resize(int width, int height){ + super.resize(width, height); + + if(!assets.isFinished()){ + Draw.proj().setOrtho(0, 0, width, height); + } + } + + @Override + public void update(){ + if(!finished){ + drawLoading(); + if(assets.update(1000 / loadingFPS)){ + Log.info("Total time to load: {0}", Time.timeSinceMillis(beginTime)); + for(ApplicationListener listener : modules){ + listener.init(); + } + finished = true; + Events.fire(new ClientLoadEvent()); + } + }else{ + super.update(); + } + + int targetfps = Core.settings.getInt("fpscap", 120); + + if(targetfps > 0 && targetfps <= 240){ + long target = (1000 * 1000000) / targetfps; //target in nanos + long elapsed = Time.timeSinceNanos(lastTime); + if(elapsed < target){ + try{ + Thread.sleep((target - elapsed) / 1000000, (int)((target - elapsed) % 1000000)); + }catch(InterruptedException ignored){ + //ignore + } + } + } + + lastTime = Time.nanos(); + } + + @Override + public void init(){ + setup(); + } + + @Override + public void resume(){ + if(finished){ + super.resume(); + } + } + + void drawLoading(){ + smoothProgress = Mathf.lerpDelta(smoothProgress, assets.getProgress(), 0.1f); + + Core.graphics.clear(Pal.darkerGray); + Draw.proj().setOrtho(0, 0, Core.graphics.getWidth(), Core.graphics.getHeight()); + + float height = UnitScl.dp.scl(50f); + + Draw.color(Color.BLACK); + Fill.poly(graphics.getWidth()/2f, graphics.getHeight()/2f, 6, Mathf.dst(graphics.getWidth()/2f, graphics.getHeight()/2f) * smoothProgress); + Draw.reset(); + + float w = graphics.getWidth()*0.6f; + + Draw.color(Color.BLACK); + Fill.rect(graphics.getWidth()/2f, graphics.getHeight()/2f, w, height); + + Draw.color(Pal.accent); + Fill.crect(graphics.getWidth()/2f-w/2f, graphics.getHeight()/2f - height/2f, w * smoothProgress, height); + + for(int i : Mathf.signs){ + Fill.tri(graphics.getWidth()/2f + w/2f*i, graphics.getHeight()/2f + height/2f, graphics.getWidth()/2f + w/2f*i, graphics.getHeight()/2f - height/2f, graphics.getWidth()/2f + w/2f*i + height/2f*i, graphics.getHeight()/2f); + } + + if(assets.isLoaded("outline")){ + BitmapFont font = assets.get("outline"); + font.draw((int)(assets.getProgress() * 100) + "%", graphics.getWidth() / 2f, graphics.getHeight() / 2f + UnitScl.dp.scl(10f), Align.center); + font.draw(bundle.get("loading", "").replace("[accent]", ""), graphics.getWidth() / 2f, graphics.getHeight() / 2f + height / 2f + UnitScl.dp.scl(20), Align.center); + + if(assets.getCurrentLoading() != null){ + String name = assets.getCurrentLoading().fileName.toLowerCase(); + String key = name.contains("content") ? "content" : name.contains("msav") || name.contains("maps") ? "map" : name.contains("ogg") || name.contains("mp3") ? "sound" : name.contains("png") ? "image" : "system"; + font.draw(bundle.get("load." + key, ""), graphics.getWidth() / 2f, graphics.getHeight() / 2f - height / 2f - UnitScl.dp.scl(10f), Align.center); + } + } + Draw.flush(); + } +} diff --git a/core/src/io/anuke/mindustry/Mindustry.java b/core/src/io/anuke/mindustry/Mindustry.java deleted file mode 100644 index 9ed18ca79d..0000000000 --- a/core/src/io/anuke/mindustry/Mindustry.java +++ /dev/null @@ -1,72 +0,0 @@ -package io.anuke.mindustry; - -import io.anuke.arc.*; -import io.anuke.arc.math.*; -import io.anuke.arc.util.*; -import io.anuke.mindustry.core.*; -import io.anuke.mindustry.game.EventType.*; -import io.anuke.mindustry.gen.*; -import io.anuke.mindustry.io.*; - -import static io.anuke.mindustry.Vars.*; - -public class Mindustry extends ApplicationCore{ - private long lastTime; - - @Override - public void setup(){ - Time.setDeltaProvider(() -> { - float result = Core.graphics.getDeltaTime() * 60f; - return (Float.isNaN(result) || Float.isInfinite(result)) ? 1f : Mathf.clamp(result, 0.0001f, 60f / 10f); - }); - - Time.mark(); - UI.loadSystemCursors(); - - Vars.init(); - Log.setUseColors(false); - BundleLoader.load(); - Musics.load(); - Sounds.load(); - - content.load(); - content.loadColors(); - - add(logic = new Logic()); - add(world = new World()); - add(control = new Control()); - add(renderer = new Renderer()); - add(ui = new UI()); - add(netServer = new NetServer()); - add(netClient = new NetClient()); - } - - @Override - public void update(){ - super.update(); - - int targetfps = Core.settings.getInt("fpscap", 120); - - if(targetfps > 0 && targetfps <= 240){ - long target = (1000 * 1000000) / targetfps; //target in nanos - long elapsed = Time.timeSinceNanos(lastTime); - if(elapsed < target){ - try{ - Thread.sleep((target - elapsed) / 1000000, (int)((target - elapsed) % 1000000)); - }catch(InterruptedException ignored){ - //ignore - } - } - } - - lastTime = Time.nanos(); - } - - @Override - public void init(){ - super.init(); - - Log.info("Time to load [total]: {0}", Time.elapsed()); - Events.fire(new GameLoadEvent()); - } -} diff --git a/core/src/io/anuke/mindustry/Vars.java b/core/src/io/anuke/mindustry/Vars.java index bb8fc511c9..9dbde88e3f 100644 --- a/core/src/io/anuke/mindustry/Vars.java +++ b/core/src/io/anuke/mindustry/Vars.java @@ -1,35 +1,36 @@ package io.anuke.mindustry; -import io.anuke.arc.Application.ApplicationType; -import io.anuke.arc.Core; -import io.anuke.arc.files.FileHandle; -import io.anuke.arc.graphics.Color; -import io.anuke.arc.util.Structs; +import io.anuke.arc.Application.*; +import io.anuke.arc.*; +import io.anuke.arc.assets.*; +import io.anuke.arc.files.*; +import io.anuke.arc.graphics.*; +import io.anuke.arc.util.*; +import io.anuke.mindustry.ai.*; import io.anuke.mindustry.core.*; import io.anuke.mindustry.entities.*; -import io.anuke.mindustry.entities.bullet.Bullet; -import io.anuke.mindustry.entities.effect.Fire; -import io.anuke.mindustry.entities.effect.Puddle; -import io.anuke.mindustry.entities.impl.EffectEntity; -import io.anuke.mindustry.entities.traits.DrawTrait; -import io.anuke.mindustry.entities.traits.SyncTrait; +import io.anuke.mindustry.entities.bullet.*; +import io.anuke.mindustry.entities.effect.*; +import io.anuke.mindustry.entities.impl.*; +import io.anuke.mindustry.entities.traits.*; import io.anuke.mindustry.entities.type.*; import io.anuke.mindustry.game.*; -import io.anuke.mindustry.gen.Serialization; +import io.anuke.mindustry.gen.*; +import io.anuke.mindustry.input.*; +import io.anuke.mindustry.maps.*; import io.anuke.mindustry.net.Net; -import io.anuke.mindustry.world.blocks.defense.ForceProjector.ShieldEntity; +import io.anuke.mindustry.world.blocks.defense.ForceProjector.*; -import java.nio.charset.Charset; -import java.util.Arrays; -import java.util.Locale; +import java.nio.charset.*; +import java.util.*; @SuppressWarnings("unchecked") -public class Vars{ +public class Vars implements Loadable{ /** Whether to load locales.*/ public static boolean loadLocales = true; /** IO buffer size. */ public static final int bufferSize = 8192; - /** global charset */ + /** global charset, since Android doesn't support the Charsets class */ public static final Charset charset = Charset.forName("UTF-8"); /** main application name, capitalized */ public static final String appName = "Mindustry"; @@ -116,10 +117,14 @@ public class Vars{ public static FileHandle screenshotDirectory; /** data subdirectory used for custom mmaps */ public static FileHandle customMapDirectory; + /** data subdirectory used for custom mmaps */ + public static FileHandle mapPreviewDirectory; /** tmp subdirectory for map conversion */ public static FileHandle tmpDirectory; /** data subdirectory used for saves */ public static FileHandle saveDirectory; + /** data subdirectory used for plugins */ + public static FileHandle pluginDirectory; /** old map file extension, for conversion */ public static final String oldMapExtension = "mmap"; /** map file extension */ @@ -137,14 +142,20 @@ public class Vars{ public static DefaultWaves defaultWaves; public static LoopControl loops; + public static World world; + public static Maps maps; + public static WaveSpawner spawner; + public static BlockIndexer indexer; + public static Pathfinder pathfinder; + public static Control control; public static Logic logic; public static Renderer renderer; public static UI ui; - public static World world; public static NetServer netServer; public static NetClient netClient; + public static Entities entities; public static EntityGroup playerGroup; public static EntityGroup tileGroup; public static EntityGroup bulletGroup; @@ -158,6 +169,12 @@ public class Vars{ /** all local players, currently only has one player. may be used for local co-op in the future */ public static Player player; + @Override + public void loadAsync(){ + loadSettings(); + init(); + } + public static void init(){ Serialization.init(); @@ -180,29 +197,32 @@ public class Vars{ Version.init(); content = new ContentLoader(); - if(!headless){ - content.setVerbose(); - } - loops = new LoopControl(); defaultWaves = new DefaultWaves(); collisions = new EntityCollisions(); + world = new World(); - playerGroup = Entities.addGroup(Player.class).enableMapping(); - tileGroup = Entities.addGroup(TileEntity.class, false); - bulletGroup = Entities.addGroup(Bullet.class).enableMapping(); - effectGroup = Entities.addGroup(EffectEntity.class, false); - groundEffectGroup = Entities.addGroup(DrawTrait.class, false); - puddleGroup = Entities.addGroup(Puddle.class).enableMapping(); - shieldGroup = Entities.addGroup(ShieldEntity.class, false); - fireGroup = Entities.addGroup(Fire.class).enableMapping(); + maps = new Maps(); + spawner = new WaveSpawner(); + indexer = new BlockIndexer(); + pathfinder = new Pathfinder(); + + entities = new Entities(); + playerGroup = entities.add(Player.class).enableMapping(); + tileGroup = entities.add(TileEntity.class, false); + bulletGroup = entities.add(Bullet.class).enableMapping(); + effectGroup = entities.add(EffectEntity.class, false); + groundEffectGroup = entities.add(DrawTrait.class, false); + puddleGroup = entities.add(Puddle.class).enableMapping(); + shieldGroup = entities.add(ShieldEntity.class, false); + fireGroup = entities.add(Fire.class).enableMapping(); unitGroups = new EntityGroup[Team.all.length]; for(Team team : Team.all){ - unitGroups[team.ordinal()] = Entities.addGroup(BaseUnit.class).enableMapping(); + unitGroups[team.ordinal()] = entities.add(BaseUnit.class).enableMapping(); } - for(EntityGroup group : Entities.getAllGroups()){ + for(EntityGroup group : entities.all()){ group.setRemoveListener(entity -> { if(entity instanceof SyncTrait && Net.client()){ netClient.addRemovedEntity((entity).getID()); @@ -217,16 +237,64 @@ public class Vars{ ios = Core.app.getType() == ApplicationType.iOS; android = Core.app.getType() == ApplicationType.Android; + dataDirectory = Core.settings.getDataDirectory(); + screenshotDirectory = dataDirectory.child("screenshots/"); + customMapDirectory = dataDirectory.child("maps/"); + mapPreviewDirectory = dataDirectory.child("previews/"); + saveDirectory = dataDirectory.child("saves/"); + tmpDirectory = dataDirectory.child("tmp/"); + pluginDirectory = dataDirectory.child("plugins/"); + + maps.load(); + } + + public static void loadSettings(){ Core.settings.setAppName(appName); if(steam){ Core.settings.setDataDirectory(Core.files.local("saves/")); } - dataDirectory = Core.settings.getDataDirectory(); - screenshotDirectory = dataDirectory.child("screenshots/"); - customMapDirectory = dataDirectory.child("maps/"); - saveDirectory = dataDirectory.child("saves/"); - tmpDirectory = dataDirectory.child("tmp/"); + Core.settings.defaults("locale", "default"); + Core.keybinds.setDefaults(Binding.values()); + Core.settings.load(); + + if(!loadLocales) return; + + try{ + //try loading external bundle + FileHandle handle = Core.files.local("bundle"); + + Locale locale = Locale.ENGLISH; + Core.bundle = I18NBundle.createBundle(handle, locale); + + Log.info("NOTE: external translation bundle has been loaded."); + if(!headless){ + Time.run(10f, () -> ui.showInfo("Note: You have successfully loaded an external translation bundle.")); + } + }catch(Throwable e){ + //no external bundle found + + FileHandle handle = Core.files.internal("bundles/bundle"); + + Locale locale; + String loc = Core.settings.getString("locale"); + if(loc.equals("default")){ + locale = Locale.getDefault(); + }else{ + Locale lastLocale; + if(loc.contains("_")){ + String[] split = loc.split("_"); + lastLocale = new Locale(split[0], split[1]); + }else{ + lastLocale = new Locale(loc); + } + + locale = lastLocale; + } + + Locale.setDefault(locale); + Core.bundle = I18NBundle.createBundle(handle, locale); + } } } diff --git a/core/src/io/anuke/mindustry/ai/BlockIndexer.java b/core/src/io/anuke/mindustry/ai/BlockIndexer.java index 19fdfcfb4a..a31b2bbf8a 100644 --- a/core/src/io/anuke/mindustry/ai/BlockIndexer.java +++ b/core/src/io/anuke/mindustry/ai/BlockIndexer.java @@ -24,7 +24,7 @@ public class BlockIndexer{ private final static int quadrantSize = 16; /** Set of all ores that are being scanned. */ - private final ObjectSet scanOres = ObjectSet.with(Item.getAllOres().toArray(Item.class)); + private final ObjectSet scanOres = new ObjectSet<>(); private final ObjectSet itemSet = new ObjectSet<>(); /** Stores all ore quadtrants on the map. */ private ObjectMap> ores; @@ -57,6 +57,8 @@ public class BlockIndexer{ }); Events.on(WorldLoadEvent.class, event -> { + scanOres.clear(); + scanOres.addAll(Item.getAllOres()); damagedTiles = new ObjectSet[Team.all.length]; flagMap = new ObjectSet[Team.all.length][BlockFlag.all.length]; diff --git a/core/src/io/anuke/mindustry/ai/Pathfinder.java b/core/src/io/anuke/mindustry/ai/Pathfinder.java index 697b360805..87b0d838f6 100644 --- a/core/src/io/anuke/mindustry/ai/Pathfinder.java +++ b/core/src/io/anuke/mindustry/ai/Pathfinder.java @@ -15,8 +15,7 @@ import io.anuke.mindustry.world.Pos; import io.anuke.mindustry.world.Tile; import io.anuke.mindustry.world.meta.BlockFlag; -import static io.anuke.mindustry.Vars.state; -import static io.anuke.mindustry.Vars.world; +import static io.anuke.mindustry.Vars.*; public class Pathfinder{ private static final long maxUpdate = Time.millisToNanos(4); @@ -116,7 +115,7 @@ public class Pathfinder{ path.lastSearchTime = Time.millis(); //add all targets to the frontier - for(Tile other : world.indexer.getEnemy(team, BlockFlag.target)){ + for(Tile other : indexer.getEnemy(team, BlockFlag.target)){ path.weights[other.x][other.y] = 0; path.searches[other.x][other.y] = (short)path.search; path.frontier.addFirst(other.pos()); diff --git a/core/src/io/anuke/mindustry/content/Blocks.java b/core/src/io/anuke/mindustry/content/Blocks.java index cf947b02e7..c5784aeeab 100644 --- a/core/src/io/anuke/mindustry/content/Blocks.java +++ b/core/src/io/anuke/mindustry/content/Blocks.java @@ -1,16 +1,14 @@ package io.anuke.mindustry.content; -import io.anuke.arc.Core; -import io.anuke.arc.function.BooleanProvider; -import io.anuke.arc.graphics.Color; +import io.anuke.arc.*; +import io.anuke.arc.graphics.*; import io.anuke.arc.graphics.g2d.*; -import io.anuke.arc.math.Mathf; -import io.anuke.arc.util.Tmp; -import io.anuke.mindustry.Vars; -import io.anuke.mindustry.entities.Damage; -import io.anuke.mindustry.entities.bullet.Bullet; -import io.anuke.mindustry.entities.bullet.BulletType; -import io.anuke.mindustry.game.ContentList; +import io.anuke.arc.math.*; +import io.anuke.arc.util.*; +import io.anuke.mindustry.*; +import io.anuke.mindustry.entities.*; +import io.anuke.mindustry.entities.bullet.*; +import io.anuke.mindustry.game.*; import io.anuke.mindustry.gen.*; import io.anuke.mindustry.graphics.*; import io.anuke.mindustry.type.*; @@ -24,16 +22,13 @@ import io.anuke.mindustry.world.blocks.production.*; import io.anuke.mindustry.world.blocks.sandbox.*; import io.anuke.mindustry.world.blocks.storage.*; import io.anuke.mindustry.world.blocks.units.*; -import io.anuke.mindustry.world.consumers.ConsumeLiquidFilter; -import io.anuke.mindustry.world.meta.Attribute; -import io.anuke.mindustry.world.modules.LiquidModule; +import io.anuke.mindustry.world.consumers.*; +import io.anuke.mindustry.world.meta.*; +import io.anuke.mindustry.world.modules.*; -import static io.anuke.mindustry.Vars.state; -import static io.anuke.mindustry.Vars.world; +import static io.anuke.mindustry.Vars.*; public class Blocks implements ContentList{ - public static final BooleanProvider padVisible = () -> state.rules.attackMode || state.rules.pvp || state.isEditor(); - public static Block //environment @@ -79,7 +74,7 @@ public class Blocks implements ContentList{ duo, scatter, scorch, hail, arc, wave, lancer, swarmer, salvo, fuse, ripple, cyclone, spectre, meltdown, //units - draugFactory, spiritFactory, phantomFactory, wraithFactory, ghoulFactory, revenantFactory, daggerFactory, crawlerFactory, titanFactory, + commandCenter, draugFactory, spiritFactory, phantomFactory, wraithFactory, ghoulFactory, revenantFactory, daggerFactory, crawlerFactory, titanFactory, fortressFactory, repairPoint, //upgrades @@ -1648,17 +1643,23 @@ public class Blocks implements ContentList{ consumes.items(new ItemStack(Items.silicon, 30), new ItemStack(Items.lead, 20), new ItemStack(Items.titanium, 10)); }}; - wraithFactory = new UnitFactory("wraith-factory"){{ - requirements(Category.units, padVisible, ItemStack.with(Items.titanium, 30, Items.lead, 40, Items.silicon, 45)); - type = UnitTypes.wraith; - produceTime = 750; + commandCenter = new CommandCenter("command-center"){{ + requirements(Category.units, ItemStack.with(Items.copper, 200, Items.lead, 250, Items.silicon, 250, Items.graphite, 100)); size = 2; - consumes.power(0.6f); + health = size * size * 55; + }}; + + wraithFactory = new UnitFactory("wraith-factory"){{ + requirements(Category.units, ItemStack.with(Items.titanium, 30, Items.lead, 40, Items.silicon, 45)); + type = UnitTypes.wraith; + produceTime = 700; + size = 2; + consumes.power(0.5f); consumes.items(new ItemStack(Items.silicon, 10), new ItemStack(Items.titanium, 5)); }}; ghoulFactory = new UnitFactory("ghoul-factory"){{ - requirements(Category.units, padVisible, ItemStack.with(Items.titanium, 75, Items.lead, 65, Items.silicon, 110)); + requirements(Category.units, ItemStack.with(Items.titanium, 75, Items.lead, 65, Items.silicon, 110)); type = UnitTypes.ghoul; produceTime = 1150; size = 3; @@ -1667,7 +1668,7 @@ public class Blocks implements ContentList{ }}; revenantFactory = new UnitFactory("revenant-factory"){{ - requirements(Category.units, padVisible, ItemStack.with(Items.plastanium, 50, Items.titanium, 150, Items.lead, 150, Items.silicon, 200)); + requirements(Category.units, ItemStack.with(Items.plastanium, 50, Items.titanium, 150, Items.lead, 150, Items.silicon, 200)); type = UnitTypes.revenant; produceTime = 2000; size = 4; @@ -1676,7 +1677,7 @@ public class Blocks implements ContentList{ }}; daggerFactory = new UnitFactory("dagger-factory"){{ - requirements(Category.units, padVisible, ItemStack.with(Items.lead, 55, Items.silicon, 35)); + requirements(Category.units, ItemStack.with(Items.lead, 55, Items.silicon, 35)); type = UnitTypes.dagger; produceTime = 850; size = 2; @@ -1685,17 +1686,17 @@ public class Blocks implements ContentList{ }}; crawlerFactory = new UnitFactory("crawler-factory"){{ - requirements(Category.units, padVisible, ItemStack.with(Items.lead, 25, Items.silicon, 30)); + requirements(Category.units, ItemStack.with(Items.lead, 45, Items.silicon, 30)); type = UnitTypes.crawler; - produceTime = 250; + produceTime = 300; size = 2; - maxSpawn = 8; - consumes.power(0.4f); - consumes.items(new ItemStack(Items.coal, 5)); + maxSpawn = 6; + consumes.power(0.5f); + consumes.items(new ItemStack(Items.coal, 10)); }}; titanFactory = new UnitFactory("titan-factory"){{ - requirements(Category.units, padVisible, ItemStack.with(Items.graphite, 50, Items.lead, 50, Items.silicon, 45)); + requirements(Category.units, ItemStack.with(Items.graphite, 50, Items.lead, 50, Items.silicon, 45)); type = UnitTypes.titan; produceTime = 1050; size = 3; @@ -1704,7 +1705,7 @@ public class Blocks implements ContentList{ }}; fortressFactory = new UnitFactory("fortress-factory"){{ - requirements(Category.units, padVisible, ItemStack.with(Items.thorium, 40, Items.lead, 110, Items.silicon, 75)); + requirements(Category.units, ItemStack.with(Items.thorium, 40, Items.lead, 110, Items.silicon, 75)); type = UnitTypes.fortress; produceTime = 2000; size = 3; diff --git a/core/src/io/anuke/mindustry/content/Fx.java b/core/src/io/anuke/mindustry/content/Fx.java index 6773815d5d..e6cd3b6236 100644 --- a/core/src/io/anuke/mindustry/content/Fx.java +++ b/core/src/io/anuke/mindustry/content/Fx.java @@ -32,7 +32,7 @@ public class Fx implements ContentList{ bigShockwave, nuclearShockwave, explosion, blockExplosion, blockExplosionSmoke, shootSmall, shootHeal, shootSmallSmoke, shootBig, shootBig2, shootBigSmoke, shootBigSmoke2, shootSmallFlame, shootPyraFlame, shootLiquid, shellEjectSmall, shellEjectMedium, shellEjectBig, lancerLaserShoot, lancerLaserShootSmoke, lancerLaserCharge, lancerLaserChargeBegin, lightningCharge, lightningShoot, - unitSpawn, spawnShockwave, magmasmoke, impactShockwave, impactcloud, impactsmoke, dynamicExplosion, padlaunch; + unitSpawn, spawnShockwave, magmasmoke, impactShockwave, impactcloud, impactsmoke, dynamicExplosion, padlaunch, commandSend; @Override public void load(){ @@ -53,6 +53,13 @@ public class Fx implements ContentList{ Draw.reset(); }); + commandSend = new Effect(28, e -> { + Draw.color(Pal.command); + Lines.stroke(e.fout() * 2f); + Lines.circle(e.x, e.y, 4f + e.finpow() * 120f); + Draw.color(); + }); + placeBlock = new Effect(16, e -> { Draw.color(Pal.accent); Lines.stroke(3f - e.fin() * 2f); diff --git a/core/src/io/anuke/mindustry/content/Mechs.java b/core/src/io/anuke/mindustry/content/Mechs.java index b4fb0f6127..57dcf5afd3 100644 --- a/core/src/io/anuke/mindustry/content/Mechs.java +++ b/core/src/io/anuke/mindustry/content/Mechs.java @@ -5,6 +5,7 @@ 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.*; import io.anuke.mindustry.entities.*; import io.anuke.mindustry.entities.bullet.*; import io.anuke.mindustry.entities.effect.*; @@ -85,7 +86,7 @@ public class Mechs implements ContentList{ Effects.shake(1f, 1f, player); Effects.effect(Fx.landShock, player); for(int i = 0; i < 8; i++){ - Time.run(Mathf.random(8f), () -> Lightning.create(player.getTeam(), Pal.lancerLaser, 17f, player.x, player.y, Mathf.random(360f), 14)); + Time.run(Mathf.random(8f), () -> Lightning.create(player.getTeam(), Pal.lancerLaser, 17f * Vars.state.rules.playerDamageMultiplier, player.x, player.y, Mathf.random(360f), 14)); } } } @@ -286,7 +287,7 @@ public class Mechs implements ContentList{ float scl = scld(player); if(Mathf.chance(Time.delta() * (0.15 * scl))){ Effects.effect(Fx.hitLancer, Pal.lancerLaser, player.x, player.y); - Lightning.create(player.getTeam(), Pal.lancerLaser, 10f, + Lightning.create(player.getTeam(), Pal.lancerLaser, 10f * Vars.state.rules.playerDamageMultiplier, player.x + player.velocity().x, player.y + player.velocity().y, player.rotation, 14); } } diff --git a/core/src/io/anuke/mindustry/content/TechTree.java b/core/src/io/anuke/mindustry/content/TechTree.java index 10930e51a5..721408bf56 100644 --- a/core/src/io/anuke/mindustry/content/TechTree.java +++ b/core/src/io/anuke/mindustry/content/TechTree.java @@ -254,6 +254,7 @@ public class TechTree implements ContentList{ }); node(daggerFactory, () -> { + node(commandCenter, () -> {}); node(crawlerFactory, () -> { node(titanFactory, () -> { node(fortressFactory, () -> { @@ -296,7 +297,7 @@ public class TechTree implements ContentList{ private TechNode node(Block block, Runnable children){ ItemStack[] requirements = new ItemStack[block.buildRequirements.length]; for(int i = 0; i < requirements.length; i++){ - requirements[i] = new ItemStack(block.buildRequirements[i].item, 30 + block.buildRequirements[i].amount * 5); + requirements[i] = new ItemStack(block.buildRequirements[i].item, 30 + block.buildRequirements[i].amount * 6); } return new TechNode(block, requirements, children); diff --git a/core/src/io/anuke/mindustry/core/ContentLoader.java b/core/src/io/anuke/mindustry/core/ContentLoader.java index 6e085668f0..a919233c2e 100644 --- a/core/src/io/anuke/mindustry/core/ContentLoader.java +++ b/core/src/io/anuke/mindustry/core/ContentLoader.java @@ -1,16 +1,14 @@ package io.anuke.mindustry.core; import io.anuke.arc.collection.*; -import io.anuke.arc.function.Consumer; -import io.anuke.arc.graphics.Color; -import io.anuke.arc.graphics.Pixmap; -import io.anuke.arc.util.Log; +import io.anuke.arc.function.*; +import io.anuke.arc.graphics.*; +import io.anuke.arc.util.*; import io.anuke.mindustry.content.*; -import io.anuke.mindustry.entities.bullet.BulletType; +import io.anuke.mindustry.entities.bullet.*; import io.anuke.mindustry.game.*; import io.anuke.mindustry.type.*; -import io.anuke.mindustry.world.Block; -import io.anuke.mindustry.world.LegacyColorMapper; +import io.anuke.mindustry.world.*; import static io.anuke.arc.Core.files; @@ -21,8 +19,6 @@ import static io.anuke.arc.Core.files; @SuppressWarnings("unchecked") public class ContentLoader{ private boolean loaded = false; - private boolean verbose = false; - private ObjectMap[] contentNameMap = new ObjectMap[ContentType.values().length]; private Array[] contentMap = new Array[ContentType.values().length]; private MappableContent[][] temporaryMapper; @@ -45,12 +41,8 @@ public class ContentLoader{ new LegacyColorMapper(), }; - public void setVerbose(){ - verbose = true; - } - /** Creates all content types. */ - public void load(){ + public void createContent(){ if(loaded){ Log.info("Content already loaded, skipping."); return; @@ -65,8 +57,6 @@ public class ContentLoader{ list.load(); } - int total = 0; - for(ContentType type : ContentType.values()){ for(Content c : contentMap[type.ordinal()]){ @@ -77,7 +67,6 @@ public class ContentLoader{ } contentNameMap[type.ordinal()].put(name, (MappableContent)c); } - total++; } } @@ -91,25 +80,32 @@ public class ContentLoader{ } } - if(verbose){ - Log.info("--- CONTENT INFO ---"); - for(int k = 0; k < contentMap.length; k++){ - Log.info("[{0}]: loaded {1}", ContentType.values()[k].name(), contentMap[k].size); - } - Log.info("Total content loaded: {0}", total); - Log.info("-------------------"); - } - loaded = true; } - public void initialize(Consumer callable){ - initialize(callable, false); + /** Logs content statistics.*/ + public void logContent(){ + Log.info("--- CONTENT INFO ---"); + for(int k = 0; k < contentMap.length; k++){ + Log.info("[{0}]: loaded {1}", ContentType.values()[k].name(), contentMap[k].size); + } + Log.info("Total content loaded: {0}", Array.with(ContentType.values()).mapInt(c -> contentMap[c.ordinal()].size).sum()); + Log.info("-------------------"); + } + + /** Calls Content#init() on everything. Use only after all modules have been created.*/ + public void init(){ + initialize(Content::init); + } + + /** Calls Content#load() on everything. Use only after all modules have been created on the client.*/ + public void load(){ + initialize(Content::load); } /** Initializes all content with the specified function. */ - public void initialize(Consumer callable, boolean override){ - if(initialization.contains(callable) && !override) return; + private void initialize(Consumer callable){ + if(initialization.contains(callable)) return; for(ContentType type : ContentType.values()){ for(Content content : contentMap[type.ordinal()]){ @@ -136,12 +132,8 @@ public class ContentLoader{ pixmap.dispose(); } - public void verbose(boolean verbose){ - this.verbose = verbose; - } - public void dispose(){ - //clear all content, currently not needed + //clear all content, currently not used } public void handleContent(Content content){ @@ -171,7 +163,7 @@ public class ContentLoader{ return null; } if(temporaryMapper[type.ordinal()].length <= id || temporaryMapper[type.ordinal()][id] == null){ - return getByID(type, 0); //default value is always ID 0 + return (T)contentMap[type.ordinal()].get(0); //default value is always ID 0 } return (T)temporaryMapper[type.ordinal()][id]; } diff --git a/core/src/io/anuke/mindustry/core/Control.java b/core/src/io/anuke/mindustry/core/Control.java index 2406ca7556..a12ae0cd80 100644 --- a/core/src/io/anuke/mindustry/core/Control.java +++ b/core/src/io/anuke/mindustry/core/Control.java @@ -1,6 +1,7 @@ package io.anuke.mindustry.core; import io.anuke.arc.*; +import io.anuke.arc.assets.*; import io.anuke.arc.files.*; import io.anuke.arc.graphics.*; import io.anuke.arc.graphics.g2d.*; @@ -13,8 +14,8 @@ import io.anuke.mindustry.content.*; 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.game.*; import io.anuke.mindustry.gen.*; import io.anuke.mindustry.input.*; import io.anuke.mindustry.maps.*; @@ -25,6 +26,8 @@ import io.anuke.mindustry.world.*; import io.anuke.mindustry.world.blocks.storage.*; import java.io.*; +import java.time.*; +import java.time.format.*; import static io.anuke.arc.Core.*; import static io.anuke.mindustry.Vars.*; @@ -35,10 +38,10 @@ import static io.anuke.mindustry.Vars.*; * Should not handle any logic-critical state. * This class is not created in the headless server. */ -public class Control implements ApplicationListener{ - public final Saves saves; - public final MusicControl music; - public final Tutorial tutorial; +public class Control implements ApplicationListener, Loadable{ + public Saves saves; + public MusicControl music; + public Tutorial tutorial; public InputHandler input; private Interval timer = new Interval(2); @@ -46,37 +49,6 @@ public class Control implements ApplicationListener{ private boolean wasPaused = false; public Control(){ - batch = new SpriteBatch(); - saves = new Saves(); - tutorial = new Tutorial(); - music = new MusicControl(); - - UnitScl.dp.setProduct(settings.getInt("uiscale", 100) / 100f); - - Core.input.setCatch(KeyCode.BACK, true); - - content.initialize(Content::init); - Core.atlas = new TextureAtlas("sprites/sprites.atlas"); - Draw.scl = 1f / Core.atlas.find("scale_marker").getWidth(); - content.initialize(Content::load, true); - - data.load(); - - Core.settings.setAppName(appName); - Core.settings.defaults( - "ip", "localhost", - "color-0", Color.rgba8888(playerColors[8]), - "color-1", Color.rgba8888(playerColors[11]), - "color-2", Color.rgba8888(playerColors[13]), - "color-3", Color.rgba8888(playerColors[9]), - "name", "", - "lastBuild", 0 - ); - - createPlayer(); - - saves.load(); - Events.on(StateChangeEvent.class, event -> { if((event.from == State.playing && event.to == State.menu) || (event.from == State.menu && event.to != State.menu)){ Time.runTask(5f, Platform.instance::updateRPC); @@ -177,12 +149,32 @@ public class Control implements ApplicationListener{ Events.on(ZoneConfigureCompleteEvent.class, e -> { ui.hudfrag.showToast(Core.bundle.format("zone.config.complete", e.zone.configureWave)); }); + } - if(android){ - Sounds.empty.loop(0f, 1f, 0f); + @Override + public void loadAsync(){ + saves = new Saves(); + tutorial = new Tutorial(); + music = new MusicControl(); - checkClassicData(); - } + Draw.scl = 1f / Core.atlas.find("scale_marker").getWidth(); + + UnitScl.dp.setProduct(settings.getInt("uiscale", 100) / 100f); + + Core.input.setCatch(KeyCode.BACK, true); + + data.load(); + + Core.settings.defaults( + "ip", "localhost", + "color-0", Color.rgba8888(playerColors[8]), + "name", "", + "lastBuild", 0 + ); + + createPlayer(); + + saves.load(); } //checks for existing 3.5 app data, android only @@ -240,6 +232,9 @@ public class Control implements ApplicationListener{ world.loadMap(map, rules); state.rules = rules; logic.play(); + if(settings.getBool("savecreate")){ + control.saves.addSave(map.name() + "-" + DateTimeFormatter.ofPattern("MMM dd h:mm").format(LocalDateTime.now())); + } }); } @@ -382,6 +377,11 @@ public class Control implements ApplicationListener{ dialog.show(); })); } + + if(android){ + Sounds.empty.loop(0f, 1f, 0f); + checkClassicData(); + } } @Override @@ -396,6 +396,17 @@ public class Control implements ApplicationListener{ music.update(); loops.update(); + if(Core.input.keyTap(Binding.fullscreen)){ + boolean full = settings.getBool("fullscreen"); + if(full){ + graphics.setWindowedMode(graphics.getWidth(), graphics.getHeight()); + }else{ + graphics.setFullscreenMode(graphics.getDisplayMode()); + } + settings.put("fullscreen", !full); + settings.save(); + } + if(!state.is(State.menu)){ input.update(); diff --git a/core/src/io/anuke/mindustry/core/Logic.java b/core/src/io/anuke/mindustry/core/Logic.java index 1cf43878d2..abfb994939 100644 --- a/core/src/io/anuke/mindustry/core/Logic.java +++ b/core/src/io/anuke/mindustry/core/Logic.java @@ -101,15 +101,15 @@ public class Logic implements ApplicationListener{ state.rules = new Rules(); state.stats = new Stats(); + entities.clear(); Time.clear(); - Entities.clear(); TileEntity.sleepingEntities = 0; Events.fire(new ResetEvent()); } public void runWave(){ - world.spawner.spawnEnemies(); + spawner.spawnEnemies(); state.wave++; state.wavetime = world.isZone() && world.getZone().isBossWave(state.wave) ? state.rules.waveSpacing * state.rules.bossWaveMultiplier : world.isZone() && world.getZone().isLaunchWave(state.wave) ? state.rules.waveSpacing * state.rules.launchWaveMultiplier : state.rules.waveSpacing; @@ -195,20 +195,20 @@ public class Logic implements ApplicationListener{ } if(!headless){ - Entities.update(effectGroup); - Entities.update(groundEffectGroup); + effectGroup.update(); + groundEffectGroup.update(); } if(!state.isEditor()){ for(EntityGroup group : unitGroups){ - Entities.update(group); + group.update(); } - Entities.update(puddleGroup); - Entities.update(shieldGroup); - Entities.update(bulletGroup); - Entities.update(tileGroup); - Entities.update(fireGroup); + puddleGroup.update(); + shieldGroup.update(); + bulletGroup.update(); + tileGroup.update(); + fireGroup.update(); }else{ for(EntityGroup group : unitGroups){ group.updateEvents(); @@ -217,11 +217,11 @@ public class Logic implements ApplicationListener{ } - Entities.update(playerGroup); + playerGroup.update(); //effect group only contains item transfers in the headless version, update it! if(headless){ - Entities.update(effectGroup); + effectGroup.update(); } if(!state.isEditor()){ @@ -234,7 +234,7 @@ public class Logic implements ApplicationListener{ collisions.collideGroups(bulletGroup, playerGroup); } - world.pathfinder.update(); + pathfinder.update(); } if(!Net.client() && !world.isInvalidMap() && !state.isEditor()){ diff --git a/core/src/io/anuke/mindustry/core/NetClient.java b/core/src/io/anuke/mindustry/core/NetClient.java index 4766340831..8de8d51252 100644 --- a/core/src/io/anuke/mindustry/core/NetClient.java +++ b/core/src/io/anuke/mindustry/core/NetClient.java @@ -7,11 +7,11 @@ import io.anuke.arc.collection.IntSet; import io.anuke.arc.graphics.Color; import io.anuke.arc.math.RandomXS128; import io.anuke.arc.util.*; +import io.anuke.arc.util.CommandHandler.*; import io.anuke.arc.util.io.ReusableByteInStream; import io.anuke.arc.util.serialization.Base64Coder; import io.anuke.mindustry.Vars; import io.anuke.mindustry.core.GameState.State; -import io.anuke.mindustry.entities.Entities; import io.anuke.mindustry.entities.EntityGroup; import io.anuke.mindustry.entities.traits.BuilderTrait.BuildRequest; import io.anuke.mindustry.entities.traits.SyncTrait; @@ -151,15 +151,38 @@ public class NetClient implements ApplicationListener{ throw new ValidateException(player, "Player has sent a message above the text limit."); } - //server console logging - Log.info("&y{0}: &lb{1}", player.name, message); + //check if it's a command + CommandResponse response = netServer.clientCommands.handleMessage(message, player); + if(response.type == ResponseType.noCommand){ //no command to handle + //server console logging + Log.info("&y{0}: &lb{1}", player.name, message); - //invoke event for all clients but also locally - //this is required so other clients get the correct name even if they don't know who's sending it yet - Call.sendMessage(message, colorizeName(player.id, player.name), player); + //invoke event for all clients but also locally + //this is required so other clients get the correct name even if they don't know who's sending it yet + Call.sendMessage(message, colorizeName(player.id, player.name), player); + }else{ + //log command to console but with brackets + Log.info("<&y{0}: &lm{1}&lg>", player.name, message); + + //a command was sent, now get the output + if(response.type != ResponseType.valid){ + String text; + + //send usage + if(response.type == ResponseType.manyArguments){ + text = "[scarlet]Too many arguments. Usage:[lightgray] " + response.command.text + "[gray] " + response.command.paramText; + }else if(response.type == ResponseType.fewArguments){ + text = "[scarlet]Too few arguments. Usage:[lightgray] " + response.command.text + "[gray] " + response.command.paramText; + }else{ //unknown command + text = "[scarlet]Unknown command. Check [lightgray]/help[scarlet]."; + } + + player.sendMessage(text); + } + } } - private static String colorizeName(int id, String name){ + public static String colorizeName(int id, String name){ Player player = playerGroup.getByID(id); if(name == null || player == null) return null; return "[#" + player.color.toString().toUpperCase() + "]" + name; @@ -195,7 +218,7 @@ public class NetClient implements ApplicationListener{ @Remote(variants = Variant.both) public static void onWorldDataBegin(){ - Entities.clear(); + entities.clear(); netClient.removed.clear(); logic.reset(); @@ -229,7 +252,7 @@ public class NetClient implements ApplicationListener{ netClient.byteStream.setBytes(Net.decompressSnapshot(data, dataLen)); DataInputStream input = netClient.dataStream; - EntityGroup group = Entities.getGroup(groupID); + EntityGroup group = entities.get(groupID); //go through each entity for(int j = 0; j < amount; j++){ @@ -347,7 +370,7 @@ public class NetClient implements ApplicationListener{ quiet = false; lastSent = 0; - Entities.clear(); + entities.clear(); ui.chatfrag.clearMessages(); } diff --git a/core/src/io/anuke/mindustry/core/NetServer.java b/core/src/io/anuke/mindustry/core/NetServer.java index 79b7d82116..3915d88091 100644 --- a/core/src/io/anuke/mindustry/core/NetServer.java +++ b/core/src/io/anuke/mindustry/core/NetServer.java @@ -4,18 +4,17 @@ import io.anuke.annotations.Annotations.Loc; import io.anuke.annotations.Annotations.Remote; import io.anuke.arc.ApplicationListener; import io.anuke.arc.Events; -import io.anuke.arc.collection.IntMap; -import io.anuke.arc.collection.ObjectSet; +import io.anuke.arc.collection.*; import io.anuke.arc.graphics.Color; import io.anuke.arc.graphics.Colors; import io.anuke.arc.math.Mathf; import io.anuke.arc.math.geom.Rectangle; import io.anuke.arc.math.geom.Vector2; import io.anuke.arc.util.*; +import io.anuke.arc.util.CommandHandler.*; import io.anuke.arc.util.io.*; import io.anuke.mindustry.content.Blocks; import io.anuke.mindustry.core.GameState.State; -import io.anuke.mindustry.entities.Entities; import io.anuke.mindustry.entities.EntityGroup; import io.anuke.mindustry.entities.traits.BuilderTrait.BuildRequest; import io.anuke.mindustry.entities.traits.Entity; @@ -47,6 +46,7 @@ public class NetServer implements ApplicationListener{ private final static float correctDist = 16f; public final Administration admins = new Administration(); + public final CommandHandler clientCommands = new CommandHandler("/"); /** Maps connection IDs to players. */ private IntMap connections = new IntMap<>(); @@ -112,7 +112,7 @@ public class NetServer implements ApplicationListener{ } if(packet.versionType == null || ((packet.version == -1 || !packet.versionType.equals(Version.type)) && Version.build != -1 && !admins.allowsCustomClients())){ - kick(id, KickReason.customClient); + kick(id, !Version.type.equals(packet.versionType) ? KickReason.typeMismatch : KickReason.customClient); return; } @@ -191,6 +191,138 @@ public class NetServer implements ApplicationListener{ if(player == null) return; RemoteReadServer.readPacket(packet.writeBuffer, packet.type, player); }); + + registerCommands(); + } + + private void registerCommands(){ + clientCommands.register("help", "[page]", "Lists all commands.", (args, player) -> { + if(args.length > 0 && !Strings.canParseInt(args[0])){ + player.sendMessage("[scarlet]'page' must be a number."); + return; + } + int commandsPerPage = 6; + int page = args.length > 0 ? Strings.parseInt(args[0]) : 1; + int pages = Mathf.ceil((float)clientCommands.getCommandList().size / commandsPerPage); + + page --; + + if(page > pages || page < 0){ + player.sendMessage("[scarlet]'page' must be a number between[orange] 1[] and[orange] " + pages + "[scarlet]."); + return; + } + + StringBuilder result = new StringBuilder(); + result.append(Strings.format("[orange]-- Commands Page[lightgray] {0}[gray]/[lightgray]{1}[orange] --\n\n", (page+1), pages)); + + for(int i = commandsPerPage * page; i < Math.min(commandsPerPage * (page + 1), clientCommands.getCommandList().size); i++){ + Command command = clientCommands.getCommandList().get(i); + result.append("[orange] /").append(command.text).append("[white] ").append(command.paramText).append("[lightgray] - ").append(command.description).append("\n"); + } + player.sendMessage(result.toString()); + }); + + clientCommands.register("t", "", "Send a message only to your teammates.", (args, player) -> { + playerGroup.all().each(p -> p.getTeam() == player.getTeam(), o -> o.sendMessage(args[0], player, "[#" + player.getTeam().color.toString() + "]" + NetClient.colorizeName(player.id, player.name))); + }); + + //duration of a a kick in seconds + int kickDuration = 10 * 60; + + class VoteSession{ + Player target; + ObjectSet voted = new ObjectSet<>(); + ObjectMap map; + Timer.Task task; + int votes; + + public VoteSession(ObjectMap map, Player target){ + this.target = target; + this.map = map; + this.task = Timer.schedule(() -> { + if(!checkPass()){ + Call.sendMessage(Strings.format("[lightgray]Vote failed. Not enough votes to kick[orange] {0}[lightgray].", target.name)); + } + map.remove(target); + task.cancel(); + }, 60 * 1.5f); + } + + boolean checkPass(){ + if(votes >= votesRequired() && target.isAdded() && target.con.isConnected()){ + Call.sendMessage(Strings.format("[orange]Vote passed.[scarlet] {0}[orange] will be kicked from the server.", target.name)); + admins.getInfo(target.uuid).lastKicked = Time.millis() + kickDuration*1000; + kick(target.con.id, KickReason.vote); + return true; + } + return false; + } + } + + //cooldown between votes + int voteTime = 60 * 10; + Timekeeper vtime = new Timekeeper(voteTime); + //current kick sessions + ObjectMap currentlyKicking = new ObjectMap<>(); + + clientCommands.register("votekick", "[player...]", "Vote to kick a player, with a cooldown.", (args, player) -> { + if(playerGroup.size() < 3){ + player.sendMessage("[scarlet]At least 3 players are needed to start a votekick."); + return; + } + + if(currentlyKicking.values().toArray().contains(v -> v.voted.contains(player.uuid) || v.voted.contains(admins.getInfo(player.uuid).lastIP))){ + player.sendMessage("[scarlet]You've already voted. Sit down."); + return; + } + + if(args.length == 0){ + StringBuilder builder = new StringBuilder(); + builder.append("[orange]Players to kick: \n"); + for(Player p : playerGroup.all()){ + if(p.isAdmin || p.con == null || p == player) continue; + + builder.append("[lightgray] ").append(p.name).append("[accent] (#").append(p.con.id).append(")\n"); + } + player.sendMessage(builder.toString()); + }else{ + Player found; + if(args[0].length() > 1 && args[0].startsWith("#") && Strings.canParseInt(args[0].substring(1))){ + int id = Strings.parseInt(args[0].substring(1)); + found = playerGroup.find(p -> p.con != null && p.con.id == id); + }else{ + found = playerGroup.find(p -> p.name.equalsIgnoreCase(args[0])); + } + + if(found != null){ + if(player == found){ + player.sendMessage("[scarlet]If you're interested in kicking yourself, just leave."); + }else if(found.isAdmin){ + player.sendMessage("[scarlet]Did you really expect to be able to kick an admin?"); + }else{ + if(!currentlyKicking.containsKey(found) && !vtime.get()){ + player.sendMessage("[scarlet]You must wait " + voteTime/60 + " minutes between votekicks."); + return; + } + + VoteSession session = currentlyKicking.getOr(found, () -> new VoteSession(currentlyKicking, found)); + session.votes ++; + session.voted.addAll(player.uuid, admins.getInfo(player.uuid).lastIP); + + Call.sendMessage(Strings.format("[orange]{0}[lightgray] has voted to kick[orange] {1}[].[accent] ({2}/{3})\n[lightgray]Type[orange] /votekick #{4}[] to agree.", + player.name, found.name, session.votes, votesRequired(), found.con.id)); + session.checkPass(); + vtime.reset(); + } + }else{ + player.sendMessage("[scarlet]No player[orange]'" + args[0] + "'[scarlet] found."); + } + } + }); + } + + public int votesRequired(){ + return playerGroup.size() * 2 / 3; } public Team assignTeam(Player current, Iterable players){ @@ -422,10 +554,10 @@ public class NetServer implements ApplicationListener{ Player player = connections.get(con.id); - if(player != null && (reason == KickReason.kick || reason == KickReason.banned) && player.uuid != null){ + if(player != null && (reason == KickReason.kick || reason == KickReason.banned || reason == KickReason.vote) && player.uuid != null){ PlayerInfo info = admins.getInfo(player.uuid); info.timesKicked++; - info.lastKicked = Time.millis(); + info.lastKicked = Math.max(Time.millis(), info.lastKicked); } Call.onKick(connection, reason); @@ -455,7 +587,7 @@ public class NetServer implements ApplicationListener{ viewport.setSize(player.con.viewWidth, player.con.viewHeight).setCenter(player.con.viewX, player.con.viewY); //check for syncable groups - for(EntityGroup group : Entities.getAllGroups()){ + for(EntityGroup group : entities.all()){ if(group.isEmpty() || !(group.all().get(0) instanceof SyncTrait)) continue; //make sure mapping is enabled for this group diff --git a/core/src/io/anuke/mindustry/core/Renderer.java b/core/src/io/anuke/mindustry/core/Renderer.java index 6041017533..b23e46dc91 100644 --- a/core/src/io/anuke/mindustry/core/Renderer.java +++ b/core/src/io/anuke/mindustry/core/Renderer.java @@ -43,9 +43,6 @@ public class Renderer implements ApplicationListener{ public Renderer(){ camera = new Camera(); - if(settings.getBool("bloom")){ - setupBloom(); - } Shaders.init(); Effects.setScreenShakeProvider((intensity, duration) -> { @@ -93,6 +90,13 @@ public class Renderer implements ApplicationListener{ clearColor = new Color(0f, 0f, 0f, 1f); } + @Override + public void init(){ + if(settings.getBool("bloom")){ + setupBloom(); + } + } + @Override public void update(){ //TODO hack, find source of this bug @@ -205,9 +209,9 @@ public class Renderer implements ApplicationListener{ blocks.floor.drawFloor(); - draw(groundEffectGroup, e -> e instanceof BelowLiquidTrait); - draw(puddleGroup); - draw(groundEffectGroup, e -> !(e instanceof BelowLiquidTrait)); + groundEffectGroup.draw(e -> e instanceof BelowLiquidTrait); + puddleGroup.draw(); + groundEffectGroup.draw(e -> !(e instanceof BelowLiquidTrait)); blocks.processBlocks(); @@ -244,8 +248,8 @@ public class Renderer implements ApplicationListener{ bloom.capture(); } - draw(bulletGroup); - draw(effectGroup); + bulletGroup.draw(); + effectGroup.draw(); Draw.flush(); if(bloom != null && !pixelator.enabled()){ @@ -253,15 +257,15 @@ public class Renderer implements ApplicationListener{ } overlays.drawBottom(); - draw(playerGroup, p -> true, Player::drawBuildRequests); + playerGroup.draw(p -> true, Player::drawBuildRequests); - if(Entities.countInBounds(shieldGroup) > 0){ - if(settings.getBool("animatedshields")){ + if(shieldGroup.countInBounds() > 0){ + if(settings.getBool("animatedshields") && Shaders.shield != null){ Draw.flush(); shieldBuffer.begin(); graphics.clear(Color.CLEAR); - Entities.draw(shieldGroup); - Entities.draw(shieldGroup, shield -> true, shield -> ((ShieldEntity)shield).drawOver()); + shieldGroup.draw(); + shieldGroup.draw(shield -> true, ShieldEntity::drawOver); Draw.flush(); shieldBuffer.end(); Draw.shader(Shaders.shield); @@ -270,13 +274,13 @@ public class Renderer implements ApplicationListener{ Draw.color(); Draw.shader(); }else{ - Entities.draw(shieldGroup, shield -> true, shield -> ((ShieldEntity)shield).drawSimple()); + shieldGroup.draw(shield -> true, ShieldEntity::drawSimple); } } overlays.drawTop(); - draw(playerGroup, p -> !p.isDead() && !p.isLocal, Player::drawName); + playerGroup.draw(p -> !p.isDead() && !p.isLocal, Player::drawName); Draw.color(); Draw.flush(); @@ -293,12 +297,12 @@ public class Renderer implements ApplicationListener{ for(EntityGroup group : unitGroups){ if(!group.isEmpty()){ - draw(group, unit -> !unit.isDead(), draw::accept); + group.draw(unit -> !unit.isDead(), draw::accept); } } if(!playerGroup.isEmpty()){ - draw(playerGroup, unit -> !unit.isDead(), draw::accept); + playerGroup.draw(unit -> !unit.isDead(), draw::accept); } Draw.color(); @@ -310,12 +314,12 @@ public class Renderer implements ApplicationListener{ for(EntityGroup group : unitGroups){ if(!group.isEmpty()){ - draw(group, unit -> unit.isFlying() && !unit.isDead(), baseUnit -> baseUnit.drawShadow(trnsX, trnsY)); + group.draw(unit -> unit.isFlying() && !unit.isDead(), baseUnit -> baseUnit.drawShadow(trnsX, trnsY)); } } if(!playerGroup.isEmpty()){ - draw(playerGroup, unit -> unit.isFlying() && !unit.isDead(), player -> player.drawShadow(trnsX, trnsY)); + playerGroup.draw(unit -> unit.isFlying() && !unit.isDead(), player -> player.drawShadow(trnsX, trnsY)); } Draw.color(); @@ -327,29 +331,17 @@ public class Renderer implements ApplicationListener{ if(group.count(p -> p.isFlying() == flying) + playerGroup.count(p -> p.isFlying() == flying && p.getTeam() == team) == 0 && flying) continue; - draw(unitGroups[team.ordinal()], u -> u.isFlying() == flying && !u.isDead(), Unit::drawUnder); - draw(playerGroup, p -> p.isFlying() == flying && p.getTeam() == team && !p.isDead(), Unit::drawUnder); + unitGroups[team.ordinal()].draw(u -> u.isFlying() == flying && !u.isDead(), Unit::drawUnder); + playerGroup.draw(p -> p.isFlying() == flying && p.getTeam() == team && !p.isDead(), Unit::drawUnder); - draw(unitGroups[team.ordinal()], u -> u.isFlying() == flying && !u.isDead(), Unit::drawAll); - draw(playerGroup, p -> p.isFlying() == flying && p.getTeam() == team, Unit::drawAll); + unitGroups[team.ordinal()].draw(u -> u.isFlying() == flying && !u.isDead(), Unit::drawAll); + playerGroup.draw(p -> p.isFlying() == flying && p.getTeam() == team, Unit::drawAll); - draw(unitGroups[team.ordinal()], u -> u.isFlying() == flying && !u.isDead(), Unit::drawOver); - draw(playerGroup, p -> p.isFlying() == flying && p.getTeam() == team, Unit::drawOver); + unitGroups[team.ordinal()].draw(u -> u.isFlying() == flying && !u.isDead(), Unit::drawOver); + playerGroup.draw(p -> p.isFlying() == flying && p.getTeam() == team, Unit::drawOver); } } - public void draw(EntityGroup group){ - draw(group, t -> true, DrawTrait::draw); - } - - public void draw(EntityGroup group, Predicate toDraw){ - draw(group, toDraw, DrawTrait::draw); - } - - public void draw(EntityGroup group, Predicate toDraw, Consumer drawer){ - Entities.draw(group, toDraw, drawer); - } - public void scaleCamera(float amount){ targetscale += amount; clampScale(); diff --git a/core/src/io/anuke/mindustry/core/UI.java b/core/src/io/anuke/mindustry/core/UI.java index ee10191570..a784bd7c60 100644 --- a/core/src/io/anuke/mindustry/core/UI.java +++ b/core/src/io/anuke/mindustry/core/UI.java @@ -3,8 +3,13 @@ package io.anuke.mindustry.core; import io.anuke.arc.*; import io.anuke.arc.Graphics.*; import io.anuke.arc.Graphics.Cursor.*; +import io.anuke.arc.assets.*; +import io.anuke.arc.assets.loaders.*; +import io.anuke.arc.assets.loaders.resolvers.*; +import io.anuke.arc.collection.*; 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.graphics.*; import io.anuke.arc.graphics.g2d.*; @@ -31,8 +36,8 @@ import io.anuke.mindustry.ui.fragments.*; import static io.anuke.arc.scene.actions.Actions.*; import static io.anuke.mindustry.Vars.*; -public class UI implements ApplicationListener{ - private FreeTypeFontGenerator generator; +public class UI implements ApplicationListener, Loadable{ + private Skin skin; public MenuFragment menufrag; public HudFragment hudfrag; @@ -67,9 +72,23 @@ public class UI implements ApplicationListener{ public Cursor drillCursor, unloadCursor; public UI(){ - Skin skin = new Skin(Core.atlas); - generateFonts(skin); + skin = new Skin(); + setupFonts(); + } + + @Override + public void loadAsync(){ + + } + + @Override + public void loadSync(){ + //TODO type-safe skin files + skin.addRegions(Core.atlas); loadExtraStyle(skin); + skin.add("outline", Core.assets.get("outline")); + skin.getFont("default").getData().markupEnabled = true; + skin.getFont("default").setOwnsTexture(false); skin.load(Core.files.internal("sprites/uiskin.json")); for(BitmapFont font : skin.getAll(BitmapFont.class).values()){ @@ -97,6 +116,11 @@ public class UI implements ApplicationListener{ loadExtraCursors(); } + @Override + public Array getDependencies(){ + return Array.with(new AssetDescriptor<>(Control.class), new AssetDescriptor<>("outline", BitmapFont.class), new AssetDescriptor<>("default", BitmapFont.class), new AssetDescriptor<>("chat", BitmapFont.class)); + } + /** Called from a static context to make the cursor appear immediately upon startup.*/ public static void loadSystemCursors(){ SystemCursor.arrow.set(Core.graphics.newCursor("cursor")); @@ -106,6 +130,23 @@ public class UI implements ApplicationListener{ Core.graphics.restoreCursor(); } + /** Called from a static context for use in the loading screen.*/ + public static void loadDefaultFont(){ + FileHandleResolver resolver = new InternalFileHandleResolver(); + Core.assets.setLoader(FreeTypeFontGenerator.class, new FreeTypeFontGeneratorLoader(resolver)); + Core.assets.setLoader(BitmapFont.class, null, new FreetypeFontLoader(resolver)); + + FreeTypeFontParameter param = new FreeTypeFontParameter(){{ + size = fontParameter().size; + borderColor = Color.DARK_GRAY; + borderWidth = UnitScl.dp.scl(2f); + spaceX -= borderWidth; + incremental = true; + }}; + + Core.assets.load("outline", BitmapFont.class, new FreeTypeFontLoaderParameter("fonts/font.ttf", param)); + } + void loadExtraStyle(Skin skin){ AtlasRegion region = Core.atlas.find("flat-down-base"); int[] splits = region.splits; @@ -130,29 +171,22 @@ public class UI implements ApplicationListener{ unloadCursor = Core.graphics.newCursor("unload"); } - void generateFonts(Skin skin){ - generator = new FreeTypeFontGenerator(Core.files.internal("fonts/font.ttf")); + public void setupFonts(){ + String fontName = "fonts/font.ttf"; - FreeTypeFontParameter param = new FreeTypeFontParameter(){{ + FreeTypeFontParameter param = fontParameter(); + + Core.assets.load("default", BitmapFont.class, new FreeTypeFontLoaderParameter(fontName, param)).loaded = f -> skin.add("default", f); + Core.assets.load("chat", BitmapFont.class, new FreeTypeFontLoaderParameter(fontName, param)).loaded = f -> skin.add("chat", f); + } + + static FreeTypeFontParameter fontParameter(){ + return new FreeTypeFontParameter(){{ size = (int)(UnitScl.dp.scl(18f)); shadowColor = Color.DARK_GRAY; shadowOffsetY = 2; incremental = true; }}; - - FreeTypeFontParameter outlined = new FreeTypeFontParameter(){{ - size = param.size; - borderColor = Color.DARK_GRAY; - borderWidth = UnitScl.dp.scl(2f); - spaceX -= borderWidth; - incremental = true; - }}; - - skin.add("outline", generator.generateFont(outlined)); - skin.add("default", generator.generateFont(param)); - skin.add("chat", generator.generateFont(param)); - skin.getFont("default").getData().markupEnabled = true; - skin.getFont("default").setOwnsTexture(false); } @Override @@ -225,13 +259,14 @@ public class UI implements ApplicationListener{ @Override public void resize(int width, int height){ + if(Core.scene == null) return; Core.scene.resize(width, height); Events.fire(new ResizeEvent()); } @Override public void dispose(){ - generator.dispose(); + //generator.dispose(); } public void loadAnd(Runnable call){ diff --git a/core/src/io/anuke/mindustry/core/World.java b/core/src/io/anuke/mindustry/core/World.java index 1c330ce397..5f47708369 100644 --- a/core/src/io/anuke/mindustry/core/World.java +++ b/core/src/io/anuke/mindustry/core/World.java @@ -6,10 +6,8 @@ import io.anuke.arc.collection.*; import io.anuke.arc.math.*; import io.anuke.arc.math.geom.*; import io.anuke.arc.util.*; -import io.anuke.mindustry.ai.*; import io.anuke.mindustry.content.*; import io.anuke.mindustry.core.GameState.*; -import io.anuke.mindustry.entities.*; import io.anuke.mindustry.game.EventType.*; import io.anuke.mindustry.game.*; import io.anuke.mindustry.io.*; @@ -23,11 +21,7 @@ import io.anuke.mindustry.world.blocks.*; import static io.anuke.mindustry.Vars.*; -public class World implements ApplicationListener{ - public final Maps maps = new Maps(); - public final BlockIndexer indexer = new BlockIndexer(); - public final WaveSpawner spawner = new WaveSpawner(); - public final Pathfinder pathfinder = new Pathfinder(); +public class World{ public final Context context = new Context(); private Map currentMap; @@ -36,17 +30,7 @@ public class World implements ApplicationListener{ private boolean generating, invalidMap; public World(){ - maps.load(); - } - @Override - public void init(){ - maps.loadLegacyMaps(); - } - - @Override - public void dispose(){ - maps.dispose(); } public boolean isInvalidMap(){ @@ -190,9 +174,11 @@ public class World implements ApplicationListener{ } } - addDarkness(tiles); + if(!headless){ + addDarkness(tiles); + } - Entities.getAllGroups().each(group -> group.resize(-finalWorldBounds, -finalWorldBounds, tiles.length * tilesize + finalWorldBounds * 2, tiles[0].length * tilesize + finalWorldBounds * 2)); + entities.all().each(group -> group.resize(-finalWorldBounds, -finalWorldBounds, tiles.length * tilesize + finalWorldBounds * 2, tiles[0].length * tilesize + finalWorldBounds * 2)); generating = false; Events.fire(new WorldLoadEvent()); @@ -354,7 +340,7 @@ public class World implements ApplicationListener{ for(int x = 0; x < tiles.length; x++){ for(int y = 0; y < tiles[0].length; y++){ Tile tile = tiles[x][y]; - if(tile.block().solid && !tile.block().synthetic() && tile.block().fillsTile){ + if(tile.isDarkened()){ dark[x][y] = darkIterations; } } @@ -383,9 +369,21 @@ public class World implements ApplicationListener{ for(int x = 0; x < tiles.length; x++){ for(int y = 0; y < tiles[0].length; y++){ Tile tile = tiles[x][y]; - if(tile.block().solid && !tile.block().synthetic()){ + if(tile.isDarkened()){ tiles[x][y].rotation(dark[x][y]); } + if(dark[x][y] == 4){ + boolean full = true; + for(Point2 p : Geometry.d4){ + int px = p.x + x, py = p.y + y; + if(Structs.inBounds(px, py, tiles) && !(tiles[px][py].isDarkened() && dark[px][py] == 4)){ + full = false; + break; + } + } + + if(full) tiles[x][y].rotation(5); + } } } } diff --git a/core/src/io/anuke/mindustry/editor/MapEditorDialog.java b/core/src/io/anuke/mindustry/editor/MapEditorDialog.java index a5080952e1..92fb76e808 100644 --- a/core/src/io/anuke/mindustry/editor/MapEditorDialog.java +++ b/core/src/io/anuke/mindustry/editor/MapEditorDialog.java @@ -93,11 +93,11 @@ public class MapEditorDialog extends Dialog implements Disposable{ "$editor.importmap", "$editor.importmap.description", "icon-load-map", (Runnable)loadDialog::show, "$editor.importfile", "$editor.importfile.description", "icon-file", (Runnable)() -> Platform.instance.showFileChooser("$editor.loadmap", "Map Files", file -> ui.loadAnd(() -> { - world.maps.tryCatchMapError(() -> { + maps.tryCatchMapError(() -> { if(MapIO.isImage(file)){ ui.showInfo("$editor.errorimage"); }else if(file.extension().equalsIgnoreCase(oldMapExtension)){ - editor.beginEdit(world.maps.makeLegacyMap(file)); + editor.beginEdit(maps.makeLegacyMap(file)); }else{ editor.beginEdit(MapIO.createMap(file, true)); } @@ -286,11 +286,11 @@ public class MapEditorDialog extends Dialog implements Disposable{ infoDialog.show(); Core.app.post(() -> ui.showError("$editor.save.noname")); }else{ - Map map = world.maps.all().find(m -> m.name().equals(name)); + Map map = maps.all().find(m -> m.name().equals(name)); if(map != null && !map.custom){ handleSaveBuiltin(map); }else{ - world.maps.saveMap(editor.getTags()); + maps.saveMap(editor.getTags()); ui.showInfoFade("$editor.saved"); } } diff --git a/core/src/io/anuke/mindustry/editor/MapGenerateDialog.java b/core/src/io/anuke/mindustry/editor/MapGenerateDialog.java index 7b490f8c63..1538318170 100644 --- a/core/src/io/anuke/mindustry/editor/MapGenerateDialog.java +++ b/core/src/io/anuke/mindustry/editor/MapGenerateDialog.java @@ -72,7 +72,7 @@ public class MapGenerateDialog extends FloatingDialog{ }).size(160f, 64f); }else{ buttons.addButton("$settings.reset", () -> { - filters.set(world.maps.readFilters("")); + filters.set(maps.readFilters("")); rebuildFilters(); update(); }).size(160f, 64f); @@ -304,7 +304,7 @@ public class MapGenerateDialog extends FloatingDialog{ } selection.cont.addButton("$filter.defaultores", () -> { - world.maps.addDefaultOres(filters); + maps.addDefaultOres(filters); rebuildFilters(); update(); selection.hide(); diff --git a/core/src/io/anuke/mindustry/editor/MapInfoDialog.java b/core/src/io/anuke/mindustry/editor/MapInfoDialog.java index 82ee7bcd6d..65d57f6175 100644 --- a/core/src/io/anuke/mindustry/editor/MapInfoDialog.java +++ b/core/src/io/anuke/mindustry/editor/MapInfoDialog.java @@ -9,8 +9,6 @@ import io.anuke.mindustry.game.*; import io.anuke.mindustry.io.*; import io.anuke.mindustry.ui.dialogs.*; -import static io.anuke.mindustry.Vars.world; - public class MapInfoDialog extends FloatingDialog{ private final MapEditor editor; private final WaveInfoDialog waveInfo; @@ -70,7 +68,7 @@ public class MapInfoDialog extends FloatingDialog{ t.row(); t.add("$editor.generation").padRight(8).left(); t.addButton("$edit", - () -> generate.show(world.maps.readFilters(editor.getTags().get("genfilters", "")), + () -> generate.show(Vars.maps.readFilters(editor.getTags().get("genfilters", "")), filters -> editor.getTags().put("genfilters", JsonIO.write(filters))) ).left().width(200f); diff --git a/core/src/io/anuke/mindustry/editor/MapLoadDialog.java b/core/src/io/anuke/mindustry/editor/MapLoadDialog.java index de02642f9c..27453cb187 100644 --- a/core/src/io/anuke/mindustry/editor/MapLoadDialog.java +++ b/core/src/io/anuke/mindustry/editor/MapLoadDialog.java @@ -1,14 +1,14 @@ package io.anuke.mindustry.editor; -import io.anuke.arc.function.Consumer; +import io.anuke.arc.function.*; import io.anuke.arc.scene.ui.*; -import io.anuke.arc.scene.ui.layout.Table; -import io.anuke.arc.util.Scaling; -import io.anuke.mindustry.maps.Map; -import io.anuke.mindustry.ui.BorderImage; -import io.anuke.mindustry.ui.dialogs.FloatingDialog; +import io.anuke.arc.scene.ui.layout.*; +import io.anuke.arc.util.*; +import io.anuke.mindustry.maps.*; +import io.anuke.mindustry.ui.*; +import io.anuke.mindustry.ui.dialogs.*; -import static io.anuke.mindustry.Vars.world; +import static io.anuke.mindustry.Vars.maps; public class MapLoadDialog extends FloatingDialog{ private Map selected = null; @@ -17,7 +17,6 @@ public class MapLoadDialog extends FloatingDialog{ super("$editor.loadmap"); shown(this::rebuild); - rebuild(); TextButton button = new TextButton("$load"); button.setDisabled(() -> selected == null); @@ -35,8 +34,8 @@ public class MapLoadDialog extends FloatingDialog{ public void rebuild(){ cont.clear(); - if(world.maps.all().size > 0){ - selected = world.maps.all().first(); + if(maps.all().size > 0){ + selected = maps.all().first(); } ButtonGroup group = new ButtonGroup<>(); @@ -52,7 +51,7 @@ public class MapLoadDialog extends FloatingDialog{ ScrollPane pane = new ScrollPane(table, "horizontal"); pane.setFadeScrollBars(false); - for(Map map : world.maps.all()){ + for(Map map : maps.all()){ TextButton button = new TextButton(map.name(), "toggle"); button.add(new BorderImage(map.texture, 2f).setScaling(Scaling.fit)).size(16 * 4f); @@ -64,7 +63,7 @@ public class MapLoadDialog extends FloatingDialog{ if(++i % maxcol == 0) table.row(); } - if(world.maps.all().size == 0){ + if(maps.all().size == 0){ table.add("$maps.none").center(); }else{ cont.add("$editor.loadmap"); diff --git a/core/src/io/anuke/mindustry/editor/MapRenderer.java b/core/src/io/anuke/mindustry/editor/MapRenderer.java index 0be885abab..c6ec218735 100644 --- a/core/src/io/anuke/mindustry/editor/MapRenderer.java +++ b/core/src/io/anuke/mindustry/editor/MapRenderer.java @@ -8,7 +8,7 @@ import io.anuke.arc.graphics.Texture; import io.anuke.arc.graphics.g2d.Draw; import io.anuke.arc.graphics.g2d.TextureRegion; import io.anuke.arc.math.Mathf; -import io.anuke.arc.util.Disposable; +import io.anuke.arc.util.*; import io.anuke.mindustry.content.Blocks; import io.anuke.mindustry.game.Team; import io.anuke.mindustry.graphics.IndexedRenderer; diff --git a/core/src/io/anuke/mindustry/editor/MapSaveDialog.java b/core/src/io/anuke/mindustry/editor/MapSaveDialog.java index 57ed966a0a..44cb9490fd 100644 --- a/core/src/io/anuke/mindustry/editor/MapSaveDialog.java +++ b/core/src/io/anuke/mindustry/editor/MapSaveDialog.java @@ -1,14 +1,13 @@ package io.anuke.mindustry.editor; -import io.anuke.arc.function.Consumer; -import io.anuke.arc.scene.ui.TextButton; -import io.anuke.arc.scene.ui.TextField; -import io.anuke.mindustry.core.Platform; -import io.anuke.mindustry.maps.Map; -import io.anuke.mindustry.ui.dialogs.FloatingDialog; +import io.anuke.arc.function.*; +import io.anuke.arc.scene.ui.*; +import io.anuke.mindustry.*; +import io.anuke.mindustry.core.*; +import io.anuke.mindustry.maps.*; +import io.anuke.mindustry.ui.dialogs.*; import static io.anuke.mindustry.Vars.ui; -import static io.anuke.mindustry.Vars.world; public class MapSaveDialog extends FloatingDialog{ private TextField field; @@ -24,7 +23,7 @@ public class MapSaveDialog extends FloatingDialog{ shown(() -> { cont.clear(); cont.label(() -> { - Map map = world.maps.byName(field.getText()); + Map map = Vars.maps.byName(field.getText()); if(map != null){ if(map.custom){ return "$editor.overwrite"; @@ -69,7 +68,7 @@ public class MapSaveDialog extends FloatingDialog{ if(field.getText().isEmpty()){ return true; } - Map map = world.maps.byName(field.getText()); + Map map = Vars.maps.byName(field.getText()); return map != null && !map.custom; } } diff --git a/core/src/io/anuke/mindustry/editor/WaveInfoDialog.java b/core/src/io/anuke/mindustry/editor/WaveInfoDialog.java index 34c421450d..ad5dccb5d8 100644 --- a/core/src/io/anuke/mindustry/editor/WaveInfoDialog.java +++ b/core/src/io/anuke/mindustry/editor/WaveInfoDialog.java @@ -52,13 +52,13 @@ public class WaveInfoDialog extends FloatingDialog{ dialog.cont.defaults().size(210f, 64f); dialog.cont.addButton("$waves.copy", () -> { ui.showInfoFade("$waves.copied"); - Core.app.setClipboardText(world.maps.writeWaves(groups)); + Core.app.setClipboardText(maps.writeWaves(groups)); dialog.hide(); }).disabled(b -> groups == null); dialog.cont.row(); dialog.cont.addButton("$waves.load", () -> { try{ - groups = world.maps.readWaves(Core.app.getClipboardText()); + groups = maps.readWaves(Core.app.getClipboardText()); buildGroups(); }catch(Exception e){ ui.showError("$waves.invalid"); diff --git a/core/src/io/anuke/mindustry/entities/Entities.java b/core/src/io/anuke/mindustry/entities/Entities.java index 2a6f388ff5..8f9ff98300 100755 --- a/core/src/io/anuke/mindustry/entities/Entities.java +++ b/core/src/io/anuke/mindustry/entities/Entities.java @@ -1,89 +1,33 @@ package io.anuke.mindustry.entities; -import io.anuke.arc.Core; -import io.anuke.arc.collection.Array; -import io.anuke.arc.collection.IntMap; -import io.anuke.arc.function.Consumer; -import io.anuke.arc.function.Predicate; -import io.anuke.arc.graphics.Camera; -import io.anuke.arc.math.geom.Rectangle; -import io.anuke.mindustry.entities.traits.DrawTrait; -import io.anuke.mindustry.entities.traits.Entity; - -import static io.anuke.mindustry.Vars.collisions; +import io.anuke.arc.collection.*; +import io.anuke.mindustry.entities.traits.*; +/** Simple container for managing entity groups.*/ public class Entities{ - private static final Array> groupArray = new Array<>(); - private static final IntMap> groups = new IntMap<>(); - private static final Rectangle viewport = new Rectangle(); - private static final boolean clip = true; - private static int count = 0; + private final Array> groupArray = new Array<>(); - public static void clear(){ + public void clear(){ for(EntityGroup group : groupArray){ group.clear(); } } - public static EntityGroup getGroup(int id){ - return groups.get(id); + public EntityGroup get(int id){ + return groupArray.get(id); } - public static Array> getAllGroups(){ + public Array> all(){ return groupArray; } - public static EntityGroup addGroup(Class type){ - return addGroup(type, true); + public EntityGroup add(Class type){ + return add(type, true); } - public static EntityGroup addGroup(Class type, boolean useTree){ - EntityGroup group = new EntityGroup<>(type, useTree); - groups.put(group.getID(), group); + public EntityGroup add(Class type, boolean useTree){ + EntityGroup group = new EntityGroup<>(groupArray.size, type, useTree); groupArray.add(group); return group; } - - public static void update(EntityGroup group){ - group.updateEvents(); - - if(group.useTree()){ - collisions.updatePhysics(group); - } - - for(Entity e : group.all()){ - e.update(); - } - } - - public static int countInBounds(EntityGroup group){ - count = 0; - draw(group, e -> true, e -> count++); - return count; - } - - public static void draw(EntityGroup group){ - draw(group, e -> true); - } - - public static void draw(EntityGroup group, Predicate toDraw){ - draw(group, toDraw, DrawTrait::draw); - } - - @SuppressWarnings("unchecked") - public static void draw(EntityGroup group, Predicate toDraw, Consumer cons){ - if(clip){ - 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 : group.all()){ - if(!(e instanceof DrawTrait) || !toDraw.test((T)e) || !e.isAdded()) continue; - DrawTrait draw = (DrawTrait)e; - - if(!clip || viewport.overlaps(draw.getX() - draw.drawSize()/2f, draw.getY() - draw.drawSize()/2f, draw.drawSize(), draw.drawSize())){ - cons.accept((T)e); - } - } - } } diff --git a/core/src/io/anuke/mindustry/entities/EntityGroup.java b/core/src/io/anuke/mindustry/entities/EntityGroup.java index 6b2e343ae3..ff48a1ad2e 100644 --- a/core/src/io/anuke/mindustry/entities/EntityGroup.java +++ b/core/src/io/anuke/mindustry/entities/EntityGroup.java @@ -1,30 +1,34 @@ package io.anuke.mindustry.entities; -import io.anuke.arc.collection.Array; -import io.anuke.arc.collection.IntMap; -import io.anuke.arc.function.Consumer; -import io.anuke.arc.function.Predicate; -import io.anuke.arc.math.geom.QuadTree; -import io.anuke.arc.math.geom.Rectangle; -import io.anuke.arc.util.*; -import io.anuke.mindustry.entities.traits.Entity; +import io.anuke.arc.*; +import io.anuke.arc.collection.*; +import io.anuke.arc.function.*; +import io.anuke.arc.graphics.*; +import io.anuke.arc.math.geom.*; +import io.anuke.mindustry.entities.traits.*; +import static io.anuke.mindustry.Vars.collisions; + +/** Represents a group of a certain type of entity.*/ +@SuppressWarnings("unchecked") public class EntityGroup{ - private static int lastid; private final boolean useTree; private final int id; private final Class type; - private final Array entityArray = new Array<>(false, 16); - private final Array entitiesToRemove = new Array<>(false, 16); - private final Array entitiesToAdd = new Array<>(false, 16); + private final Array entityArray = new Array<>(false, 32); + private final Array entitiesToRemove = new Array<>(false, 32); + private final Array entitiesToAdd = new Array<>(false, 32); private IntMap map; private QuadTree tree; private Consumer removeListener; private Consumer addListener; - public EntityGroup(Class type, boolean useTree){ + private final Rectangle viewport = new Rectangle(); + private int count = 0; + + public EntityGroup(int id, Class type, boolean useTree){ this.useTree = useTree; - this.id = lastid++; + this.id = id; this.type = type; if(useTree){ @@ -32,6 +36,46 @@ public class EntityGroup{ } } + public void update(){ + updateEvents(); + + if(useTree()){ + collisions.updatePhysics(this); + } + + for(Entity e : all()){ + e.update(); + } + } + + public int countInBounds(){ + count = 0; + draw(e -> true, e -> count++); + return count; + } + + public void draw(){ + draw(e -> true); + } + + public void draw(Predicate toDraw){ + draw(toDraw, t -> ((DrawTrait)t).draw()); + } + + public void draw(Predicate toDraw, Consumer 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; + 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); + } + } + } + public boolean useTree(){ return useTree; } diff --git a/core/src/io/anuke/mindustry/entities/Units.java b/core/src/io/anuke/mindustry/entities/Units.java index 75bc44dede..0b412a8c98 100644 --- a/core/src/io/anuke/mindustry/entities/Units.java +++ b/core/src/io/anuke/mindustry/entities/Units.java @@ -68,13 +68,13 @@ public class Units{ /** Returns the neareset damaged tile. */ public static TileEntity findDamagedTile(Team team, float x, float y){ - Tile tile = Geometry.findClosest(x, y, world.indexer.getDamaged(team)); + Tile tile = Geometry.findClosest(x, y, indexer.getDamaged(team)); return tile == null ? null : tile.entity; } /** Returns the neareset ally tile in a range. */ public static TileEntity findAllyTile(Team team, float x, float y, float range, Predicate pred){ - return world.indexer.findTile(team, x, y, range, pred); + return indexer.findTile(team, x, y, range, pred); } /** Returns the neareset enemy tile in a range. */ @@ -82,7 +82,7 @@ public class Units{ if(team == Team.derelict) return null; for(Team enemy : state.teams.enemiesOf(team)){ - TileEntity entity = world.indexer.findTile(enemy, x, y, range, pred); + TileEntity entity = indexer.findTile(enemy, x, y, range, pred); if(entity != null){ return entity; } diff --git a/core/src/io/anuke/mindustry/entities/traits/HealthTrait.java b/core/src/io/anuke/mindustry/entities/traits/HealthTrait.java index 536b6caad2..644e099e75 100644 --- a/core/src/io/anuke/mindustry/entities/traits/HealthTrait.java +++ b/core/src/io/anuke/mindustry/entities/traits/HealthTrait.java @@ -20,6 +20,10 @@ public interface HealthTrait{ default void onDeath(){ } + default boolean damaged(){ + return health() < maxHealth() - 0.0001f; + } + default void damage(float amount){ health(health() - amount); if(health() <= 0 && !isDead()){ diff --git a/core/src/io/anuke/mindustry/entities/type/BaseUnit.java b/core/src/io/anuke/mindustry/entities/type/BaseUnit.java index e6c182d029..82615e8a01 100644 --- a/core/src/io/anuke/mindustry/entities/type/BaseUnit.java +++ b/core/src/io/anuke/mindustry/entities/type/BaseUnit.java @@ -16,6 +16,7 @@ import io.anuke.mindustry.gen.*; import io.anuke.mindustry.net.Net; import io.anuke.mindustry.type.*; import io.anuke.mindustry.world.*; +import io.anuke.mindustry.world.blocks.units.CommandCenter.*; import io.anuke.mindustry.world.blocks.units.UnitFactory.*; import io.anuke.mindustry.world.meta.*; @@ -25,7 +26,6 @@ import static io.anuke.mindustry.Vars.*; /** Base class for AI units. */ public abstract class BaseUnit extends Unit implements ShooterTrait{ - protected static int timerIndex = 0; protected static final int timerTarget = timerIndex++; @@ -83,6 +83,22 @@ public abstract class BaseUnit extends Unit implements ShooterTrait{ return world.tile(spawner); } + public boolean isCommanded(){ + return indexer.getAllied(team, BlockFlag.comandCenter).size != 0 && indexer.getAllied(team, BlockFlag.comandCenter).first().entity instanceof CommandCenterEntity; + } + + public UnitCommand getCommand(){ + if(isCommanded()){ + return indexer.getAllied(team, BlockFlag.comandCenter).first().entity().command; + } + return null; + } + + /**Called when a command is recieved from the command center.*/ + public void onCommand(UnitCommand command){ + + } + /** Initialize the type and team of this unit. Only call once! */ public void init(UnitType type, Team team){ if(this.type != null) throw new RuntimeException("This unit is already initialized!"); @@ -129,12 +145,12 @@ public abstract class BaseUnit extends Unit implements ShooterTrait{ } public void targetClosestAllyFlag(BlockFlag flag){ - Tile target = Geometry.findClosest(x, y, world.indexer.getAllied(team, flag)); + Tile target = Geometry.findClosest(x, y, indexer.getAllied(team, flag)); if(target != null) this.target = target.entity; } public void targetClosestEnemyFlag(BlockFlag flag){ - Tile target = Geometry.findClosest(x, y, world.indexer.getEnemy(team, flag)); + Tile target = Geometry.findClosest(x, y, indexer.getEnemy(team, flag)); if(target != null) this.target = target.entity; } @@ -303,6 +319,10 @@ public abstract class BaseUnit extends Unit implements ShooterTrait{ state.set(getStartState()); health(maxHealth()); + + if(isCommanded()){ + onCommand(getCommand()); + } } @Override diff --git a/core/src/io/anuke/mindustry/entities/type/FlyingUnit.java b/core/src/io/anuke/mindustry/entities/type/FlyingUnit.java index 83f9434810..d02ad55ec1 100644 --- a/core/src/io/anuke/mindustry/entities/type/FlyingUnit.java +++ b/core/src/io/anuke/mindustry/entities/type/FlyingUnit.java @@ -1,20 +1,19 @@ package io.anuke.mindustry.entities.type; -import io.anuke.arc.graphics.Color; -import io.anuke.arc.graphics.g2d.Draw; -import io.anuke.arc.graphics.g2d.Fill; -import io.anuke.arc.math.Angles; -import io.anuke.arc.math.Mathf; -import io.anuke.arc.math.geom.Vector2; -import io.anuke.arc.util.Time; -import io.anuke.arc.util.Tmp; -import io.anuke.mindustry.entities.Predict; -import io.anuke.mindustry.entities.Units; -import io.anuke.mindustry.entities.bullet.BulletType; -import io.anuke.mindustry.entities.units.UnitState; -import io.anuke.mindustry.graphics.Pal; -import io.anuke.mindustry.net.Net; -import io.anuke.mindustry.world.meta.BlockFlag; +import io.anuke.arc.graphics.*; +import io.anuke.arc.graphics.g2d.*; +import io.anuke.arc.math.*; +import io.anuke.arc.math.geom.*; +import io.anuke.arc.util.*; +import io.anuke.mindustry.entities.*; +import io.anuke.mindustry.entities.bullet.*; +import io.anuke.mindustry.entities.units.*; +import io.anuke.mindustry.graphics.*; +import io.anuke.mindustry.net.*; +import io.anuke.mindustry.world.*; +import io.anuke.mindustry.world.meta.*; + +import static io.anuke.mindustry.Vars.*; public abstract class FlyingUnit extends BaseUnit{ protected float[] weaponAngles = {0, 0}; @@ -80,14 +79,40 @@ public abstract class FlyingUnit extends BaseUnit{ return; } - target = getClosestCore(); - }; + target = getSpawner(); + if(target == null) target = getClosestCore(); + } if(target != null){ - circle(60f + Mathf.absin(Time.time() + Mathf.randomSeed(id) * 1200f, 70f, 1200f)); + circle(80f + Mathf.randomSeed(id) * 120); } } - }; + }, + retreat = new UnitState(){ + public void entered(){ + target = null; + } + + public void update(){ + if(retarget()){ + target = getSpawner(); + + Tile repair = Geometry.findClosest(x, y, indexer.getAllied(team, BlockFlag.repair)); + if(repair != null && damaged()) FlyingUnit.this.target = repair.entity; + if(target == null) target = getClosestCore(); + } + + circle(targetHasFlag(BlockFlag.repair) ? 20f : 60f + Mathf.randomSeed(id) * 50, 0.65f * type.speed); + } + };; + + @Override + public void onCommand(UnitCommand command){ + state.set(command == UnitCommand.retreat ? retreat : + command == UnitCommand.attack ? attack : + command == UnitCommand.patrol ? patrol : + null); + } @Override public void move(float x, float y){ diff --git a/core/src/io/anuke/mindustry/entities/type/GroundUnit.java b/core/src/io/anuke/mindustry/entities/type/GroundUnit.java index 47d0e11280..d538d05c10 100644 --- a/core/src/io/anuke/mindustry/entities/type/GroundUnit.java +++ b/core/src/io/anuke/mindustry/entities/type/GroundUnit.java @@ -1,22 +1,20 @@ package io.anuke.mindustry.entities.type; -import io.anuke.arc.graphics.Color; -import io.anuke.arc.graphics.g2d.Draw; -import io.anuke.arc.math.Angles; -import io.anuke.arc.math.Mathf; -import io.anuke.arc.math.geom.Vector2; -import io.anuke.arc.util.Time; -import io.anuke.mindustry.Vars; -import io.anuke.mindustry.entities.Predict; -import io.anuke.mindustry.entities.Units; -import io.anuke.mindustry.entities.bullet.BulletType; -import io.anuke.mindustry.entities.units.UnitState; -import io.anuke.mindustry.game.Team; -import io.anuke.mindustry.type.Weapon; -import io.anuke.mindustry.world.Tile; -import io.anuke.mindustry.world.blocks.Floor; +import io.anuke.arc.graphics.*; +import io.anuke.arc.graphics.g2d.*; +import io.anuke.arc.math.*; +import io.anuke.arc.math.geom.*; +import io.anuke.arc.util.*; +import io.anuke.mindustry.*; +import io.anuke.mindustry.entities.*; +import io.anuke.mindustry.entities.bullet.*; +import io.anuke.mindustry.entities.units.*; +import io.anuke.mindustry.game.*; +import io.anuke.mindustry.type.*; +import io.anuke.mindustry.world.*; +import io.anuke.mindustry.world.blocks.*; -import static io.anuke.mindustry.Vars.world; +import static io.anuke.mindustry.Vars.*; public abstract class GroundUnit extends BaseUnit{ protected static Vector2 vec = new Vector2(); @@ -63,8 +61,25 @@ public abstract class GroundUnit extends BaseUnit{ } } } + }, + retreat = new UnitState(){ + public void entered(){ + target = null; + } + + public void update(){ + moveAwayFromCore(); + } }; + @Override + public void onCommand(UnitCommand command){ + state.set(command == UnitCommand.retreat ? retreat : + command == UnitCommand.attack ? attack : + command == UnitCommand.patrol ? patrol : + null); + } + @Override public void interpolate(){ super.interpolate(); @@ -182,9 +197,9 @@ public abstract class GroundUnit extends BaseUnit{ protected void patrol(){ vec.trns(baseRotation, type.speed * Time.delta()); velocity.add(vec.x, vec.y); - vec.trns(baseRotation, type.hitsizeTile * 3); + vec.trns(baseRotation, type.hitsizeTile * 5); Tile tile = world.tileWorld(x + vec.x, y + vec.y); - if((tile == null || tile.solid() || tile.floor().drownTime > 0) || stuckTime > 10f){ + if((tile == null || tile.solid() || tile.floor().drownTime > 0 || tile.floor().isLiquid) || stuckTime > 10f){ baseRotation += Mathf.sign(id % 2 - 0.5f) * Time.delta() * 3f; } @@ -208,7 +223,7 @@ public abstract class GroundUnit extends BaseUnit{ protected void moveToCore(){ Tile tile = world.tileWorld(x, y); if(tile == null) return; - Tile targetTile = world.pathfinder.getTargetTile(team, tile); + Tile targetTile = pathfinder.getTargetTile(team, tile); if(tile == targetTile) return; @@ -231,10 +246,10 @@ public abstract class GroundUnit extends BaseUnit{ Tile tile = world.tileWorld(x, y); if(tile == null) return; - Tile targetTile = world.pathfinder.getTargetTile(enemy, tile); + Tile targetTile = pathfinder.getTargetTile(enemy, tile); TileEntity core = getClosestCore(); - if(tile == targetTile || core == null || dst(core) < 90f) return; + if(tile == targetTile || core == null || dst(core) < 120f) return; velocity.add(vec.trns(angleTo(targetTile), type.speed * Time.delta())); rotation = Mathf.slerpDelta(rotation, baseRotation, type.rotatespeed); diff --git a/core/src/io/anuke/mindustry/entities/type/Player.java b/core/src/io/anuke/mindustry/entities/type/Player.java index 6d0ab81cc5..0b481a6105 100644 --- a/core/src/io/anuke/mindustry/entities/type/Player.java +++ b/core/src/io/anuke/mindustry/entities/type/Player.java @@ -14,6 +14,7 @@ import io.anuke.arc.util.*; import io.anuke.arc.util.pooling.Pools; import io.anuke.mindustry.Vars; import io.anuke.mindustry.content.*; +import io.anuke.mindustry.core.*; import io.anuke.mindustry.entities.*; import io.anuke.mindustry.entities.traits.*; import io.anuke.mindustry.game.*; @@ -731,7 +732,7 @@ public class Player extends Unit implements BuilderMinerTrait, ShooterTrait{ target = Units.closestTarget(team, x, y, getWeapon().bullet.range(), u -> u.getTeam() != Team.derelict, u -> u.getTeam() != Team.derelict); if(mech.canHeal && target == null){ - target = Geometry.findClosest(x, y, world.indexer.getDamaged(Team.sharded)); + target = Geometry.findClosest(x, y, indexer.getDamaged(Team.sharded)); if(target != null && dst(target) > getWeapon().bullet.range()){ target = null; }else if(target != null){ @@ -774,6 +775,31 @@ public class Player extends Unit implements BuilderMinerTrait, ShooterTrait{ //region utility methods + public void sendMessage(String text){ + if(isLocal){ + if(Vars.ui != null){ + Log.info("add " + text); + Vars.ui.chatfrag.addMessage(text, null); + } + }else{ + Call.sendMessage(con.id, text, null, null); + } + } + + public void sendMessage(String text, Player from){ + sendMessage(text, from, NetClient.colorizeName(from.id, from.name)); + } + + public void sendMessage(String text, Player from, String fromName){ + if(isLocal){ + if(Vars.ui != null){ + Vars.ui.chatfrag.addMessage(text, fromName); + } + }else{ + Call.sendMessage(con.id, text, fromName, from); + } + } + /** Resets all values of the player. */ public void reset(){ resetNoAdd(); diff --git a/core/src/io/anuke/mindustry/entities/type/TileEntity.java b/core/src/io/anuke/mindustry/entities/type/TileEntity.java index ce9af0012b..3205eee53a 100644 --- a/core/src/io/anuke/mindustry/entities/type/TileEntity.java +++ b/core/src/io/anuke/mindustry/entities/type/TileEntity.java @@ -52,7 +52,7 @@ public class TileEntity extends BaseEntity implements TargetTrait, HealthTrait{ tile.entity.health = health; if(tile.entity.damaged()){ - world.indexer.notifyTileDamaged(tile.entity); + indexer.notifyTileDamaged(tile.entity); } } } @@ -171,14 +171,10 @@ public class TileEntity extends BaseEntity implements TargetTrait, HealthTrait{ } if(preHealth >= maxHealth() - 0.00001f && health < maxHealth() && world != null){ //when just damaged - world.indexer.notifyTileDamaged(this); + indexer.notifyTileDamaged(this); } } - public boolean damaged(){ - return health < maxHealth() - 0.00001f; - } - public Tile getTile(){ return tile; } diff --git a/core/src/io/anuke/mindustry/entities/type/Unit.java b/core/src/io/anuke/mindustry/entities/type/Unit.java index c3ba24a6b9..2bf5f63b17 100644 --- a/core/src/io/anuke/mindustry/entities/type/Unit.java +++ b/core/src/io/anuke/mindustry/entities/type/Unit.java @@ -256,7 +256,7 @@ public abstract class Unit extends DestructibleEntity implements SaveTrait, Targ //apply knockback based on spawns if(getTeam() != waveTeam){ float relativeSize = state.rules.dropZoneRadius + getSize()/2f + 1f; - for(Tile spawn : world.spawner.getGroundSpawns()){ + for(Tile spawn : spawner.getGroundSpawns()){ if(withinDst(spawn.worldx(), spawn.worldy(), relativeSize)){ velocity.add(Tmp.v1.set(this).sub(spawn.worldx(), spawn.worldy()).setLength(0.1f + 1f - dst(spawn) / relativeSize).scl(0.45f * Time.delta())); } diff --git a/core/src/io/anuke/mindustry/entities/type/base/BaseDrone.java b/core/src/io/anuke/mindustry/entities/type/base/BaseDrone.java index 0ce42b0bc1..2821a00832 100644 --- a/core/src/io/anuke/mindustry/entities/type/base/BaseDrone.java +++ b/core/src/io/anuke/mindustry/entities/type/base/BaseDrone.java @@ -3,11 +3,11 @@ package io.anuke.mindustry.entities.type.base; import io.anuke.arc.math.Mathf; import io.anuke.arc.math.geom.Geometry; import io.anuke.mindustry.entities.type.FlyingUnit; -import io.anuke.mindustry.entities.units.UnitState; +import io.anuke.mindustry.entities.units.*; import io.anuke.mindustry.world.Tile; import io.anuke.mindustry.world.meta.BlockFlag; -import static io.anuke.mindustry.Vars.world; +import static io.anuke.mindustry.Vars.*; public abstract class BaseDrone extends FlyingUnit{ public final UnitState retreat = new UnitState(){ @@ -20,7 +20,7 @@ public abstract class BaseDrone extends FlyingUnit{ state.set(getStartState()); }else if(!targetHasFlag(BlockFlag.repair)){ if(retarget()){ - Tile repairPoint = Geometry.findClosest(x, y, world.indexer.getAllied(team, BlockFlag.repair)); + Tile repairPoint = Geometry.findClosest(x, y, indexer.getAllied(team, BlockFlag.repair)); if(repairPoint != null){ target = repairPoint; }else{ @@ -33,6 +33,11 @@ public abstract class BaseDrone extends FlyingUnit{ } }; + @Override + public void onCommand(UnitCommand command){ + //do nothing, normal commands are not applicable here + } + @Override protected void updateRotation(){ if(target != null && shouldRotate() && target.dst(this) < type.range){ @@ -44,7 +49,7 @@ public abstract class BaseDrone extends FlyingUnit{ @Override public void behavior(){ - if(health <= maxHealth() * type.retreatPercent && !state.is(retreat) && Geometry.findClosest(x, y, world.indexer.getAllied(team, BlockFlag.repair)) != null){ + if(health <= maxHealth() * type.retreatPercent && !state.is(retreat) && Geometry.findClosest(x, y, indexer.getAllied(team, BlockFlag.repair)) != null){ setState(retreat); } } diff --git a/core/src/io/anuke/mindustry/entities/type/base/MinerDrone.java b/core/src/io/anuke/mindustry/entities/type/base/MinerDrone.java index 450ed3cc34..2d90b8a604 100644 --- a/core/src/io/anuke/mindustry/entities/type/base/MinerDrone.java +++ b/core/src/io/anuke/mindustry/entities/type/base/MinerDrone.java @@ -14,7 +14,7 @@ import io.anuke.mindustry.world.Tile; import java.io.*; -import static io.anuke.mindustry.Vars.world; +import static io.anuke.mindustry.Vars.*; /** A drone that only mines.*/ public class MinerDrone extends BaseDrone implements MinerTrait{ @@ -46,7 +46,7 @@ public class MinerDrone extends BaseDrone implements MinerTrait{ setState(drop); }else{ if(retarget() && targetItem != null){ - target = world.indexer.findClosestOre(x, y, targetItem); + target = indexer.findClosestOre(x, y, targetItem); } if(target instanceof Tile){ @@ -174,6 +174,6 @@ public class MinerDrone extends BaseDrone implements MinerTrait{ if(entity == null){ return; } - targetItem = Structs.findMin(type.toMine, world.indexer::hasOre, (a, b) -> -Integer.compare(entity.items.get(a), entity.items.get(b))); + targetItem = Structs.findMin(type.toMine, indexer::hasOre, (a, b) -> -Integer.compare(entity.items.get(a), entity.items.get(b))); } } diff --git a/core/src/io/anuke/mindustry/entities/units/UnitCommand.java b/core/src/io/anuke/mindustry/entities/units/UnitCommand.java new file mode 100644 index 0000000000..0972905fb9 --- /dev/null +++ b/core/src/io/anuke/mindustry/entities/units/UnitCommand.java @@ -0,0 +1,18 @@ +package io.anuke.mindustry.entities.units; + +import io.anuke.arc.*; + +public enum UnitCommand{ + attack, retreat, patrol; + + private final String localized; + public static final UnitCommand[] all = values(); + + UnitCommand(){ + localized = Core.bundle.get("command." + name()); + } + + public String localized(){ + return localized; + } +} \ No newline at end of file diff --git a/core/src/io/anuke/mindustry/game/Content.java b/core/src/io/anuke/mindustry/game/Content.java index b03177e9c3..f75a4495fb 100644 --- a/core/src/io/anuke/mindustry/game/Content.java +++ b/core/src/io/anuke/mindustry/game/Content.java @@ -19,7 +19,7 @@ public abstract class Content{ */ public abstract ContentType getContentType(); - /** Called after all content is created. Do not use to load regions or texture data! */ + /** Called after all content and modules are created. Do not use to load regions or texture data! */ public void init(){ } diff --git a/core/src/io/anuke/mindustry/game/EventType.java b/core/src/io/anuke/mindustry/game/EventType.java index c9da8c9c57..6d8b8a0b40 100644 --- a/core/src/io/anuke/mindustry/game/EventType.java +++ b/core/src/io/anuke/mindustry/game/EventType.java @@ -27,8 +27,8 @@ public class EventType{ } } - /** Called when the game is first loaded. */ - public static class GameLoadEvent{ + /** Called when the client game is first loaded. */ + public static class ClientLoadEvent{ } diff --git a/core/src/io/anuke/mindustry/game/Gamemode.java b/core/src/io/anuke/mindustry/game/Gamemode.java index 4c8e42e1f1..16f129f065 100644 --- a/core/src/io/anuke/mindustry/game/Gamemode.java +++ b/core/src/io/anuke/mindustry/game/Gamemode.java @@ -20,7 +20,6 @@ public enum Gamemode{ rules.respawnTime = 0f; }), attack(rules -> { - rules.enemyCheat = true; rules.unitDrops = true; rules.attackMode = true; rules.waves = true; diff --git a/core/src/io/anuke/mindustry/game/GlobalData.java b/core/src/io/anuke/mindustry/game/GlobalData.java index a905f09d39..43b8095937 100644 --- a/core/src/io/anuke/mindustry/game/GlobalData.java +++ b/core/src/io/anuke/mindustry/game/GlobalData.java @@ -2,11 +2,16 @@ package io.anuke.mindustry.game; import io.anuke.arc.*; import io.anuke.arc.collection.*; +import io.anuke.arc.files.*; +import io.anuke.arc.util.io.*; import io.anuke.mindustry.*; import io.anuke.mindustry.content.*; import io.anuke.mindustry.game.EventType.*; import io.anuke.mindustry.type.*; +import java.io.*; +import java.util.zip.*; + import static io.anuke.mindustry.Vars.*; /** Stores player unlocks. Clientside only. */ @@ -29,6 +34,43 @@ public class GlobalData{ }); } + public void exportData(FileHandle file) throws IOException{ + Array files = new Array<>(); + files.add(Core.settings.getSettingsFile()); + files.addAll(customMapDirectory.list()); + files.addAll(saveDirectory.list()); + String base = Core.settings.getDataDirectory().path(); + + try(OutputStream fos = file.write(false, 2048); ZipOutputStream zos = new ZipOutputStream(fos)){ + for(FileHandle add : files){ + zos.putNextEntry(new ZipEntry(add.path().substring(base.length()))); + Streams.copyStream(add.read(), zos); + zos.closeEntry(); + } + + } + } + + public void importData(FileHandle file){ + FileHandle zipped = new ZipFileHandle(file); + + FileHandle base = Core.settings.getDataDirectory(); + if(!base.child("settings.bin").exists()){ + throw new IllegalArgumentException("Not valid save data."); + } + + //purge existing data + for(FileHandle f : base.list()){ + if(f.isDirectory()){ + f.deleteDirectory(); + }else{ + f.delete(); + } + } + + zipped.walk(f -> f.copyTo(base.child(f.path()))); + } + public void modified(){ modified = true; } diff --git a/core/src/io/anuke/mindustry/game/MusicControl.java b/core/src/io/anuke/mindustry/game/MusicControl.java index 643626c318..28991e87e2 100644 --- a/core/src/io/anuke/mindustry/game/MusicControl.java +++ b/core/src/io/anuke/mindustry/game/MusicControl.java @@ -14,15 +14,12 @@ import static io.anuke.mindustry.Vars.*; /** Controls playback of multiple music tracks.*/ public class MusicControl{ - private static final float finTime = 120f, foutTime = 120f, musicInterval = 60 * 60 * 3f, musicChance = 0.45f, musicWaveChance = 0.35f; + private static final float finTime = 120f, foutTime = 120f, musicInterval = 60 * 60 * 3f, musicChance = 0.5f, musicWaveChance = 0.4f; /** normal, ambient music, plays at any time */ public final Array ambientMusic = Array.with(Musics.game1, Musics.game3, Musics.game4, Musics.game6); /** darker music, used in times of conflict */ public final Array darkMusic = Array.with(Musics.game2, Musics.game5, Musics.game7); - /** all music, both dark and ambient */ - public final Array allMusic = Array.withArrays(ambientMusic, darkMusic); - private Music lastRandomPlayed; private Interval timer = new Interval(); private @Nullable Music current; @@ -88,7 +85,7 @@ public class MusicControl{ } //dark based on enemies - return Mathf.chance(state.enemies() / 70f); + return Mathf.chance(state.enemies() / 70f + 0.1f); } /** Plays and fades in a music track. This must be called every frame. diff --git a/core/src/io/anuke/mindustry/game/Tutorial.java b/core/src/io/anuke/mindustry/game/Tutorial.java index eb39c55eca..4989d07c73 100644 --- a/core/src/io/anuke/mindustry/game/Tutorial.java +++ b/core/src/io/anuke/mindustry/game/Tutorial.java @@ -161,7 +161,7 @@ public class Tutorial{ } }, deposit(() -> event("deposit")), - waves(() -> state.wave > 2 && state.enemies() <= 0 && !world.spawner.isSpawning()){ + waves(() -> state.wave > 2 && state.enemies() <= 0 && !spawner.isSpawning()){ void begin(){ state.rules.waveTimer = true; logic.runWave(); diff --git a/core/src/io/anuke/mindustry/graphics/Drawf.java b/core/src/io/anuke/mindustry/graphics/Drawf.java index 9881185226..46dedb5262 100644 --- a/core/src/io/anuke/mindustry/graphics/Drawf.java +++ b/core/src/io/anuke/mindustry/graphics/Drawf.java @@ -85,4 +85,6 @@ public class Drawf{ float oy = 17f / 63f * length; Draw.rect(Core.atlas.find("shape-3"), x, y - oy + length / 2f, width, length, width / 2f, oy, rotation - 90); } + + } diff --git a/core/src/io/anuke/mindustry/graphics/FloorRenderer.java b/core/src/io/anuke/mindustry/graphics/FloorRenderer.java index 06dba70468..58d022f579 100644 --- a/core/src/io/anuke/mindustry/graphics/FloorRenderer.java +++ b/core/src/io/anuke/mindustry/graphics/FloorRenderer.java @@ -22,7 +22,7 @@ public class FloorRenderer implements Disposable{ private final static int chunksize = 64; private Chunk[][] cache; - private CacheBatch cbatch; + private MultiCacheBatch cbatch; private IntSet drawnLayerSet = new IntSet(); private IntArray drawnLayers = new IntArray(); private ObjectSet used = new ObjectSet<>(); @@ -185,7 +185,7 @@ public class FloorRenderer implements Disposable{ floor = tile.floor(); } - if(tile.block().cacheLayer == layer && layer == CacheLayer.walls){ + if(tile.block().cacheLayer == layer && layer == CacheLayer.walls && !(tile.isDarkened() && tile.rotation() >= 5)){ tile.block().draw(tile); }else if(floor.cacheLayer == layer && (world.isAccessible(tile.x, tile.y) || tile.block().cacheLayer != CacheLayer.walls || !tile.block().fillsTile)){ floor.draw(tile); @@ -204,8 +204,7 @@ public class FloorRenderer implements Disposable{ int chunksx = Mathf.ceil((float)(world.width()) / chunksize), chunksy = Mathf.ceil((float)(world.height()) / chunksize); cache = new Chunk[chunksx][chunksy]; - SpriteCache sprites = new SpriteCache(world.width() * world.height() * 6, (world.width() / chunksize) * (world.height() / chunksize) * 2, false); - cbatch = new CacheBatch(sprites); + cbatch = new MultiCacheBatch(chunksize * chunksize * 4); Time.mark(); diff --git a/core/src/io/anuke/mindustry/graphics/OverlayRenderer.java b/core/src/io/anuke/mindustry/graphics/OverlayRenderer.java index fda9f63e52..4ca26d2317 100644 --- a/core/src/io/anuke/mindustry/graphics/OverlayRenderer.java +++ b/core/src/io/anuke/mindustry/graphics/OverlayRenderer.java @@ -96,7 +96,7 @@ public class OverlayRenderer{ Lines.stroke(2f); Draw.color(Color.GRAY, Color.LIGHT_GRAY, Mathf.absin(Time.time(), 8f, 1f)); - for(Tile tile : world.spawner.getGroundSpawns()){ + for(Tile tile : spawner.getGroundSpawns()){ if(tile.withinDst(player.x, player.y, state.rules.dropZoneRadius + spawnerMargin)){ Draw.alpha(Mathf.clamp(1f - (player.dst(tile) - state.rules.dropZoneRadius) / spawnerMargin)); Lines.dashCircle(tile.worldx(), tile.worldy(), state.rules.dropZoneRadius); diff --git a/core/src/io/anuke/mindustry/graphics/Pixelator.java b/core/src/io/anuke/mindustry/graphics/Pixelator.java index 8cc252eebd..5637ae8d8a 100644 --- a/core/src/io/anuke/mindustry/graphics/Pixelator.java +++ b/core/src/io/anuke/mindustry/graphics/Pixelator.java @@ -55,7 +55,7 @@ public class Pixelator implements Disposable{ Draw.rect(Draw.wrap(buffer.getTexture()), Core.camera.position.x, Core.camera.position.y, Core.camera.width, -Core.camera.height); Draw.blend(); - renderer.draw(playerGroup, p -> !p.isDead() && !p.isLocal, Player::drawName); + playerGroup.draw(p -> !p.isDead() && !p.isLocal, Player::drawName); Core.camera.position.set(px, py); Core.settings.put("animatedwater", hadWater); diff --git a/core/src/io/anuke/mindustry/graphics/Shaders.java b/core/src/io/anuke/mindustry/graphics/Shaders.java index 4aa6f02754..afa94cd6ec 100644 --- a/core/src/io/anuke/mindustry/graphics/Shaders.java +++ b/core/src/io/anuke/mindustry/graphics/Shaders.java @@ -1,5 +1,6 @@ package io.anuke.mindustry.graphics; +import io.anuke.annotations.Annotations.*; import io.anuke.arc.Core; import io.anuke.arc.graphics.Color; import io.anuke.arc.graphics.g2d.TextureRegion; @@ -10,7 +11,7 @@ import io.anuke.arc.util.Time; public class Shaders{ public static Shadow shadow; public static BlockBuild blockbuild; - public static Shield shield; + public static @Nullable Shield shield; public static UnitBuild build; public static FogShader fog; public static MenuShader menu; @@ -19,7 +20,13 @@ public class Shaders{ public static void init(){ shadow = new Shadow(); blockbuild = new BlockBuild(); - shield = new Shield(); + try{ + shield = new Shield(); + }catch(Throwable t){ + //don't load shield shader + shield = null; + t.printStackTrace(); + } build = new UnitBuild(); fog = new FogShader(); menu = new MenuShader(); diff --git a/core/src/io/anuke/mindustry/input/Binding.java b/core/src/io/anuke/mindustry/input/Binding.java index a2953a0dea..1eb5da1875 100644 --- a/core/src/io/anuke/mindustry/input/Binding.java +++ b/core/src/io/anuke/mindustry/input/Binding.java @@ -21,6 +21,7 @@ public enum Binding implements KeyBind{ zoom_hold(KeyCode.CONTROL_LEFT, "view"), zoom(new Axis(KeyCode.SCROLL)), menu(Core.app.getType() == ApplicationType.Android ? KeyCode.BACK : KeyCode.ESCAPE), + fullscreen(KeyCode.F11), pause(KeyCode.SPACE), minimap(KeyCode.M), toggle_menus(KeyCode.C), diff --git a/core/src/io/anuke/mindustry/input/MobileInput.java b/core/src/io/anuke/mindustry/input/MobileInput.java index 138a7120eb..13f1e4b46b 100644 --- a/core/src/io/anuke/mindustry/input/MobileInput.java +++ b/core/src/io/anuke/mindustry/input/MobileInput.java @@ -33,7 +33,7 @@ public class MobileInput extends InputHandler implements GestureListener{ //gesture data private Vector2 vector = new Vector2(); - private float lastDistance = -1f; + private float lastZoom = -1; /** Position where the player started dragging a line. */ private int lineStartX, lineStartY; @@ -469,6 +469,7 @@ public class MobileInput extends InputHandler implements GestureListener{ @Override public boolean touchUp(int screenX, int screenY, int pointer, KeyCode button){ + lastZoom = renderer.getScale(); //place down a line if in line mode if(lineMode){ @@ -728,11 +729,11 @@ public class MobileInput extends InputHandler implements GestureListener{ @Override public boolean zoom(float initialDistance, float distance){ if(Core.settings.getBool("keyboard")) return false; - if(lastDistance == -1) lastDistance = initialDistance; + if(lastZoom < 0){ + lastZoom = renderer.getScale(); + } - float amount = (Mathf.sign(distance > lastDistance) * 0.04f) * Time.delta(); - renderer.scaleCamera(UnitScl.dp.scl(amount)); - lastDistance = distance; + renderer.setScale(distance / initialDistance * lastZoom); return true; } diff --git a/core/src/io/anuke/mindustry/io/BundleLoader.java b/core/src/io/anuke/mindustry/io/BundleLoader.java deleted file mode 100644 index 74a123b23f..0000000000 --- a/core/src/io/anuke/mindustry/io/BundleLoader.java +++ /dev/null @@ -1,63 +0,0 @@ -package io.anuke.mindustry.io; - -import io.anuke.arc.Core; -import io.anuke.arc.files.FileHandle; -import io.anuke.arc.util.*; -import io.anuke.mindustry.Vars; -import io.anuke.mindustry.input.Binding; - -import java.util.Locale; - -import static io.anuke.mindustry.Vars.headless; - -public class BundleLoader{ - - public static void load(){ - Core.settings.defaults("locale", "default"); - Core.keybinds.setDefaults(Binding.values()); - Core.settings.load(); - loadBundle(); - } - - private static Locale getLocale(){ - String loc = Core.settings.getString("locale"); - if(loc.equals("default")){ - return Locale.getDefault(); - }else{ - Locale lastLocale; - if(loc.contains("_")){ - String[] split = loc.split("_"); - lastLocale = new Locale(split[0], split[1]); - }else{ - lastLocale = new Locale(loc); - } - - return lastLocale; - } - } - - private static void loadBundle(){ - if(headless) return; - - try{ - //try loading external bundle - FileHandle handle = Core.files.local("bundle"); - - Locale locale = Locale.ENGLISH; - Core.bundle = I18NBundle.createBundle(handle, locale); - - Log.info("NOTE: external translation bundle has been loaded."); - if(!headless){ - Time.run(10f, () -> Vars.ui.showInfo("Note: You have successfully loaded an external translation bundle.")); - } - }catch(Throwable e){ - //no external bundle found - - FileHandle handle = Core.files.internal("bundles/bundle"); - - Locale locale = getLocale(); - Locale.setDefault(locale); - Core.bundle = I18NBundle.createBundle(handle, locale); - } - } -} diff --git a/core/src/io/anuke/mindustry/io/SaveMeta.java b/core/src/io/anuke/mindustry/io/SaveMeta.java index c3fd749024..429c82561d 100644 --- a/core/src/io/anuke/mindustry/io/SaveMeta.java +++ b/core/src/io/anuke/mindustry/io/SaveMeta.java @@ -1,10 +1,10 @@ package io.anuke.mindustry.io; import io.anuke.arc.collection.*; -import io.anuke.mindustry.game.Rules; -import io.anuke.mindustry.maps.Map; +import io.anuke.mindustry.game.*; +import io.anuke.mindustry.maps.*; -import static io.anuke.mindustry.Vars.world; +import static io.anuke.mindustry.Vars.maps; public class SaveMeta{ public int version; @@ -21,7 +21,7 @@ public class SaveMeta{ this.build = build; this.timestamp = timestamp; this.timePlayed = timePlayed; - this.map = world.maps.all().find(m -> m.name().equals(map)); + this.map = maps.all().find(m -> m.name().equals(map)); this.wave = wave; this.rules = rules; this.tags = tags; diff --git a/core/src/io/anuke/mindustry/io/SaveVersion.java b/core/src/io/anuke/mindustry/io/SaveVersion.java index 90d3af2210..53524d4625 100644 --- a/core/src/io/anuke/mindustry/io/SaveVersion.java +++ b/core/src/io/anuke/mindustry/io/SaveVersion.java @@ -81,7 +81,7 @@ public abstract class SaveVersion extends SaveFileReader{ if(state.rules.spawns.isEmpty()) state.rules.spawns = defaultWaves.get(); lastReadBuild = map.getInt("build", -1); - Map worldmap = world.maps.byName(map.get("mapname", "\\\\\\")); + Map worldmap = maps.byName(map.get("mapname", "\\\\\\")); world.setMap(worldmap == null ? new Map(StringMap.of( "name", map.get("mapname", "Unknown"), "width", 1, @@ -209,7 +209,7 @@ public abstract class SaveVersion extends SaveFileReader{ //write entity chunk int groups = 0; - for(EntityGroup group : Entities.getAllGroups()){ + for(EntityGroup group : entities.all()){ if(!group.isEmpty() && group.all().get(0) instanceof SaveTrait){ groups++; } @@ -217,7 +217,7 @@ public abstract class SaveVersion extends SaveFileReader{ stream.writeByte(groups); - for(EntityGroup group : Entities.getAllGroups()){ + for(EntityGroup group : entities.all()){ if(!group.isEmpty() && group.all().get(0) instanceof SaveTrait){ stream.writeInt(group.size()); for(Entity entity : group.all()){ diff --git a/core/src/io/anuke/mindustry/io/TypeIO.java b/core/src/io/anuke/mindustry/io/TypeIO.java index 97f92584f2..25d6f92bec 100644 --- a/core/src/io/anuke/mindustry/io/TypeIO.java +++ b/core/src/io/anuke/mindustry/io/TypeIO.java @@ -5,12 +5,12 @@ import io.anuke.annotations.Annotations.WriteClass; import io.anuke.arc.graphics.Color; import io.anuke.mindustry.entities.Effects; import io.anuke.mindustry.entities.Effects.Effect; -import io.anuke.mindustry.entities.Entities; import io.anuke.mindustry.entities.bullet.Bullet; import io.anuke.mindustry.entities.bullet.BulletType; 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.net.Administration.TraceInfo; import io.anuke.mindustry.net.Packets.AdminAction; @@ -57,7 +57,7 @@ public class TypeIO{ byte gid = buffer.get(); if(gid == -1) return null; int id = buffer.getInt(); - return (Unit)Entities.getGroup(gid).getByID(id); + return (Unit)entities.get(gid).getByID(id); } @WriteClass(ShooterTrait.class) @@ -70,7 +70,7 @@ public class TypeIO{ public static ShooterTrait readShooter(ByteBuffer buffer){ byte gid = buffer.get(); int id = buffer.getInt(); - return (ShooterTrait)Entities.getGroup(gid).getByID(id); + return (ShooterTrait)entities.get(gid).getByID(id); } @WriteClass(Bullet.class) @@ -177,6 +177,16 @@ public class TypeIO{ return Team.all[buffer.get()]; } + @WriteClass(UnitCommand.class) + public static void writeUnitCommand(ByteBuffer buffer, UnitCommand reason){ + buffer.put((byte)reason.ordinal()); + } + + @ReadClass(UnitCommand.class) + public static UnitCommand readUnitCommand(ByteBuffer buffer){ + return UnitCommand.all[buffer.get()]; + } + @WriteClass(AdminAction.class) public static void writeAction(ByteBuffer buffer, AdminAction reason){ buffer.put((byte)reason.ordinal()); diff --git a/core/src/io/anuke/mindustry/maps/Map.java b/core/src/io/anuke/mindustry/maps/Map.java index 7e2e63071a..92789727dc 100644 --- a/core/src/io/anuke/mindustry/maps/Map.java +++ b/core/src/io/anuke/mindustry/maps/Map.java @@ -9,7 +9,7 @@ import io.anuke.mindustry.game.*; import io.anuke.mindustry.io.*; import io.anuke.mindustry.maps.filters.*; -import static io.anuke.mindustry.Vars.world; +import static io.anuke.mindustry.Vars.maps; public class Map implements Comparable{ /** Whether this is a custom map. */ @@ -57,6 +57,14 @@ public class Map implements Comparable{ return Core.settings.getInt("hiscore" + file.nameWithoutExtension(), 0); } + public FileHandle previewFile(){ + return Vars.mapPreviewDirectory.child(file.nameWithoutExtension() + ".png"); + } + + public FileHandle cacheFile(){ + return Vars.mapPreviewDirectory.child(file.nameWithoutExtension() + "-cache.dat"); + } + public void setHighScore(int score){ Core.settings.put("hiscore" + file.nameWithoutExtension(), score); Vars.data.modified(); @@ -94,7 +102,7 @@ public class Map implements Comparable{ if(tags.getInt("build", -1) < 83 && tags.getInt("build", -1) != -1 && tags.get("genfilters", "").isEmpty()){ return Array.with(); } - return world.maps.readFilters(tags.get("genfilters", "")); + return maps.readFilters(tags.get("genfilters", "")); } public String author(){ @@ -120,11 +128,11 @@ public class Map implements Comparable{ @Override public int compareTo(Map map){ int type = -Boolean.compare(custom, map.custom); - if(type != 0){ - return type; - }else{ - return name().compareTo(map.name()); - } + if(type != 0) return type; + int modes = Boolean.compare(Gamemode.pvp.valid(this), Gamemode.pvp.valid(map)); + if(modes != 0) return modes; + + return name().compareTo(map.name()); } @Override diff --git a/core/src/io/anuke/mindustry/maps/MapPreviewLoader.java b/core/src/io/anuke/mindustry/maps/MapPreviewLoader.java new file mode 100644 index 0000000000..26d8214243 --- /dev/null +++ b/core/src/io/anuke/mindustry/maps/MapPreviewLoader.java @@ -0,0 +1,40 @@ +package io.anuke.mindustry.maps; + +import io.anuke.arc.assets.*; +import io.anuke.arc.assets.loaders.*; +import io.anuke.arc.assets.loaders.resolvers.*; +import io.anuke.arc.collection.*; +import io.anuke.arc.files.*; +import io.anuke.mindustry.*; +import io.anuke.mindustry.game.*; + +public class MapPreviewLoader extends TextureLoader{ + + public MapPreviewLoader(){ + super(new AbsoluteFileHandleResolver()); + } + + @Override + public void loadAsync(AssetManager manager, String fileName, FileHandle file, TextureParameter parameter){ + try{ + super.loadAsync(manager, fileName, file.sibling(file.nameWithoutExtension()), parameter); + }catch(Exception e){ + e.printStackTrace(); + MapPreviewParameter param = (MapPreviewParameter)parameter; + Vars.maps.createNewPreview(param.map); + } + } + + @Override + public Array getDependencies(String fileName, FileHandle file, TextureParameter parameter){ + return Array.with(new AssetDescriptor<>("contentcreate", Content.class)); + } + + public static class MapPreviewParameter extends TextureParameter{ + public Map map; + + public MapPreviewParameter(Map map){ + this.map = map; + } + } +} diff --git a/core/src/io/anuke/mindustry/maps/Maps.java b/core/src/io/anuke/mindustry/maps/Maps.java index 111142e76f..13e5d73f8a 100644 --- a/core/src/io/anuke/mindustry/maps/Maps.java +++ b/core/src/io/anuke/mindustry/maps/Maps.java @@ -1,15 +1,22 @@ package io.anuke.mindustry.maps; import io.anuke.arc.*; +import io.anuke.arc.assets.*; +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.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.game.EventType.*; import io.anuke.mindustry.io.*; +import io.anuke.mindustry.maps.MapPreviewLoader.*; import io.anuke.mindustry.maps.filters.*; import io.anuke.mindustry.world.*; import io.anuke.mindustry.world.blocks.storage.*; @@ -18,7 +25,7 @@ import java.io.*; import static io.anuke.mindustry.Vars.*; -public class Maps implements Disposable{ +public class Maps{ /** List of all built-in maps. Filenames only. */ private static String[] defaultMapNames = {"maze", "fortress", "labyrinth", "islands", "tendrils", "caldera", "wasteland", "shattered", "fork", "triad", "veins", "glacier"}; /** All maps stored in an ordered array. */ @@ -26,6 +33,8 @@ public class Maps implements Disposable{ /** Serializer for meta. */ private Json json = new Json(); + private AsyncExecutor executor = new AsyncExecutor(2); + /** Returns a list of all maps, including custom ones. */ public Array all(){ return maps; @@ -45,6 +54,12 @@ public class Maps implements Disposable{ return maps.find(m -> m.name().equals(name)); } + public Maps(){ + Events.on(ClientLoadEvent.class, event -> { + maps.sort(); + }); + } + /** * Loads a map from the map folder and returns it. Should only be used for zone maps. * Does not add this map to the map list. @@ -74,7 +89,13 @@ public class Maps implements Disposable{ } public void reload(){ - dispose(); + for(Map map : maps){ + if(map.texture != null){ + map.texture.dispose(); + map.texture = null; + } + } + maps.clear(); load(); } @@ -128,7 +149,10 @@ public class Maps implements Disposable{ } } - map.texture = new Texture(MapIO.generatePreview(world.getTiles())); + Pixmap pix = MapIO.generatePreview(world.getTiles()); + executor.submit(() -> map.previewFile().writePNG(pix)); + + map.texture = new Texture(pix); } maps.add(map); maps.sort(); @@ -227,8 +251,8 @@ public class Maps implements Disposable{ int index = 0; for(Block block : new Block[]{Blocks.oreCopper, Blocks.oreLead, Blocks.oreCoal, Blocks.oreTitanium, Blocks.oreThorium}){ OreFilter filter = new OreFilter(); - filter.threshold += index ++ * 0.019f; - filter.scl += index/2f; + filter.threshold += index ++ * 0.018f; + filter.scl += index/2.1f; filter.ore = block; filters.add(filter); } @@ -284,6 +308,70 @@ public class Maps implements Disposable{ } } + public void loadPreviews(){ + Array createNew = new Array<>(); + + for(Map map : maps){ + //try to load preview + if(map.previewFile().exists()){ + //this may fail, but calls createNewPreview + Core.assets.load(new AssetDescriptor<>(map.previewFile().path() + "." + mapExtension, Texture.class, new MapPreviewParameter(map))).loaded = t -> map.texture = (Texture)t; + }else{ + createNew.add(map); + } + + try{ + readCache(map); + }catch(Exception ignored){ + } + } + + ((CustomLoader)Core.assets.getLoader(Content.class)).loaded = () -> Core.app.post(() -> createNew.each(this::createNewPreview)); + } + + public void createNewPreview(Map map){ + try{ + //if it's here, then the preview failed to load or doesn't exist, make it + //this has to be done synchronously! + Pixmap pix = MapIO.generatePreview(map); + Core.app.post(() -> map.texture = new Texture(pix)); + executor.submit(() -> { + try{ + map.previewFile().writePNG(pix); + writeCache(map); + }catch(Exception e){ + e.printStackTrace(); + } + }); + }catch(IOException e){ + Log.err("Failed to generate preview!", e); + Core.app.post(() -> map.texture = new Texture("sprites/error.png")); + } + } + + private void writeCache(Map map) throws IOException{ + try(DataOutputStream stream = new DataOutputStream(map.cacheFile().write(false, Streams.DEFAULT_BUFFER_SIZE))){ + stream.write(0); + stream.writeInt(map.spawns); + stream.write(map.teams.size); + IntSetIterator iter = map.teams.iterator(); + while(iter.hasNext){ + stream.write(iter.next()); + } + } + } + + private void readCache(Map map) throws IOException{ + try(DataInputStream stream = new DataInputStream(map.cacheFile().read(Streams.DEFAULT_BUFFER_SIZE))){ + stream.read(); //version + map.spawns = stream.readInt(); + int teamsize = stream.readByte(); + for(int i = 0; i < teamsize; i++){ + map.teams.add(stream.read()); + } + } + } + /** Find a new filename to put a map to. */ private FileHandle findFile(){ //find a map name that isn't used. @@ -301,12 +389,8 @@ public class Maps implements Disposable{ throw new IOException("Map name cannot be empty! File: " + file); } - if(!headless){ - map.texture = new Texture(MapIO.generatePreview(map)); - } - maps.add(map); - //maps.sort(); + maps.sort(); } private void loadCustomMaps(){ @@ -321,15 +405,4 @@ public class Maps implements Disposable{ } } } - - @Override - public void dispose(){ - for(Map map : maps){ - if(map.texture != null){ - map.texture.dispose(); - map.texture = null; - } - } - maps.clear(); - } } \ No newline at end of file diff --git a/core/src/io/anuke/mindustry/maps/filters/MirrorFilter.java b/core/src/io/anuke/mindustry/maps/filters/MirrorFilter.java index f3c9062b5e..27fc101b5e 100644 --- a/core/src/io/anuke/mindustry/maps/filters/MirrorFilter.java +++ b/core/src/io/anuke/mindustry/maps/filters/MirrorFilter.java @@ -33,7 +33,9 @@ public class MirrorFilter extends GenerateFilter{ mirror(v3, v1.x, v1.y, v2.x, v2.y); Tile tile = in.tile(v3.x, v3.y); in.floor = tile.floor(); - in.block = tile.block(); + if(!tile.block().synthetic()){ + in.block = tile.block(); + } in.ore = tile.overlay(); } } diff --git a/core/src/io/anuke/mindustry/maps/filters/OreFilter.java b/core/src/io/anuke/mindustry/maps/filters/OreFilter.java index e04f9935a4..d1ebce2f7d 100644 --- a/core/src/io/anuke/mindustry/maps/filters/OreFilter.java +++ b/core/src/io/anuke/mindustry/maps/filters/OreFilter.java @@ -8,7 +8,7 @@ import static io.anuke.mindustry.maps.filters.FilterOption.BlockOption; import static io.anuke.mindustry.maps.filters.FilterOption.oresOnly; public class OreFilter extends GenerateFilter{ - public float scl = 23, threshold = 0.811f, octaves = 2f, falloff = 0.3f; + public float scl = 23, threshold = 0.81f, octaves = 2f, falloff = 0.3f; public Block ore = Blocks.oreCopper; { diff --git a/core/src/io/anuke/mindustry/maps/generators/MapGenerator.java b/core/src/io/anuke/mindustry/maps/generators/MapGenerator.java index 52ad2b35c9..08092e7fdb 100644 --- a/core/src/io/anuke/mindustry/maps/generators/MapGenerator.java +++ b/core/src/io/anuke/mindustry/maps/generators/MapGenerator.java @@ -51,7 +51,7 @@ public class MapGenerator extends Generator{ @Override public void init(Loadout loadout){ this.loadout = loadout; - map = world.maps.loadInternalMap(mapName); + map = maps.loadInternalMap(mapName); width = map.width; height = map.height; } diff --git a/core/src/io/anuke/mindustry/net/Administration.java b/core/src/io/anuke/mindustry/net/Administration.java index c1edec3ecb..bebd0c9115 100644 --- a/core/src/io/anuke/mindustry/net/Administration.java +++ b/core/src/io/anuke/mindustry/net/Administration.java @@ -7,7 +7,6 @@ import io.anuke.arc.collection.*; import static io.anuke.mindustry.Vars.headless; public class Administration{ - /** All player info. Maps UUIDs to info. This persists throughout restarts. */ private ObjectMap playerInfo = new ObjectMap<>(); private Array bannedIPs = new Array<>(); diff --git a/core/src/io/anuke/mindustry/net/CrashSender.java b/core/src/io/anuke/mindustry/net/CrashSender.java index f7370b629d..cea92225a2 100644 --- a/core/src/io/anuke/mindustry/net/CrashSender.java +++ b/core/src/io/anuke/mindustry/net/CrashSender.java @@ -97,7 +97,7 @@ public class CrashSender{ ex(() -> value.addChild("server", new JsonValue(fs))); ex(() -> value.addChild("players", new JsonValue(Vars.playerGroup.size()))); ex(() -> value.addChild("state", new JsonValue(Vars.state.getState().name()))); - ex(() -> value.addChild("os", new JsonValue(System.getProperty("os.name")))); + ex(() -> value.addChild("os", new JsonValue(System.getProperty("os.name") + "x" + (OS.is64Bit ? "64" : "32")))); ex(() -> value.addChild("trace", new JsonValue(parseException(exception)))); boolean[] sent = {false}; diff --git a/core/src/io/anuke/mindustry/net/Net.java b/core/src/io/anuke/mindustry/net/Net.java index bad3e6c04f..637502015c 100644 --- a/core/src/io/anuke/mindustry/net/Net.java +++ b/core/src/io/anuke/mindustry/net/Net.java @@ -1,19 +1,18 @@ package io.anuke.mindustry.net; -import io.anuke.arc.Core; +import io.anuke.arc.*; import io.anuke.arc.collection.*; -import io.anuke.arc.function.BiConsumer; -import io.anuke.arc.function.Consumer; +import io.anuke.arc.function.*; import io.anuke.arc.util.*; -import io.anuke.arc.util.pooling.Pools; -import io.anuke.mindustry.core.Platform; -import io.anuke.mindustry.gen.Call; +import io.anuke.arc.util.pooling.*; +import io.anuke.mindustry.core.*; +import io.anuke.mindustry.gen.*; import io.anuke.mindustry.net.Packets.*; -import io.anuke.mindustry.net.Streamable.StreamBuilder; +import io.anuke.mindustry.net.Streamable.*; +import net.jpountz.lz4.*; -import java.io.IOException; -import java.nio.BufferOverflowException; -import java.nio.BufferUnderflowException; +import java.io.*; +import java.nio.*; import static io.anuke.mindustry.Vars.*; @@ -28,6 +27,8 @@ public class Net{ private static ClientProvider clientProvider; private static ServerProvider serverProvider; private static IntMap streams = new IntMap<>(); + private static final LZ4FastDecompressor decompressor = LZ4Factory.fastestInstance().fastDecompressor(); + private static final LZ4Compressor compressor = LZ4Factory.fastestInstance().fastCompressor(); /** Display a network error. Call on the graphics thread. */ public static void showError(Throwable e){ @@ -149,11 +150,11 @@ public class Net{ } public static byte[] compressSnapshot(byte[] input){ - return serverProvider.compressSnapshot(input); + return compressor.compress(input); } public static byte[] decompressSnapshot(byte[] input, int size){ - return clientProvider.decompressSnapshot(input, size); + return decompressor.decompress(input, size); } /** @@ -359,9 +360,6 @@ public class Net{ /** Disconnect from the server. */ void disconnect(); - /** Decompress an input snapshot byte array. */ - byte[] decompressSnapshot(byte[] input, int size); - /** * Discover servers. This should run the callback regardless of whether any servers are found. Should not block. * Callback should be run on libGDX main thread. @@ -435,9 +433,6 @@ public class Net{ /** Close the server connection. */ void close(); - /** Compress an input snapshot byte array. */ - byte[] compressSnapshot(byte[] input); - /** Return all connected users. */ Iterable getConnections(); diff --git a/core/src/io/anuke/mindustry/net/NetworkIO.java b/core/src/io/anuke/mindustry/net/NetworkIO.java index 1729f3d4e4..663cfcdf0d 100644 --- a/core/src/io/anuke/mindustry/net/NetworkIO.java +++ b/core/src/io/anuke/mindustry/net/NetworkIO.java @@ -45,7 +45,7 @@ public class NetworkIO{ state.wave = stream.readInt(); state.wavetime = stream.readFloat(); - Entities.clear(); + entities.clear(); int id = stream.readInt(); player.resetNoAdd(); player.read(stream); diff --git a/core/src/io/anuke/mindustry/net/Packets.java b/core/src/io/anuke/mindustry/net/Packets.java index 75d218cc11..12d9d75067 100644 --- a/core/src/io/anuke/mindustry/net/Packets.java +++ b/core/src/io/anuke/mindustry/net/Packets.java @@ -14,7 +14,7 @@ public class Packets{ public enum KickReason{ kick, clientOutdated, serverOutdated, banned, gameover(true), recentKick, - nameInUse, idInUse, nameEmpty, customClient, serverClose; + nameInUse, idInUse, nameEmpty, customClient, serverClose, vote, typeMismatch; public final boolean quiet; diff --git a/core/src/io/anuke/mindustry/plugin/Plugin.java b/core/src/io/anuke/mindustry/plugin/Plugin.java new file mode 100644 index 0000000000..5208f609fc --- /dev/null +++ b/core/src/io/anuke/mindustry/plugin/Plugin.java @@ -0,0 +1,21 @@ +package io.anuke.mindustry.plugin; + +import io.anuke.arc.util.*; + +public abstract class Plugin{ + + /** Called after all plugins have been created and commands have been registered.*/ + public void init(){ + + } + + /** Register any commands to be used on the server side, e.g. from the console. */ + public void registerServerCommands(CommandHandler handler){ + + } + + /** Register any commands to be used on the client side, e.g. sent from an in-game player.. */ + public void registerClientCommands(CommandHandler handler){ + + } +} diff --git a/core/src/io/anuke/mindustry/plugin/Plugins.java b/core/src/io/anuke/mindustry/plugin/Plugins.java new file mode 100644 index 0000000000..e371c78b66 --- /dev/null +++ b/core/src/io/anuke/mindustry/plugin/Plugins.java @@ -0,0 +1,82 @@ +package io.anuke.mindustry.plugin; + +import io.anuke.arc.collection.Array; +import io.anuke.arc.files.*; +import io.anuke.arc.function.*; +import io.anuke.arc.util.*; +import io.anuke.mindustry.io.*; + +import java.lang.reflect.*; +import java.net.*; + +import static io.anuke.mindustry.Vars.pluginDirectory; + +public class Plugins{ + private Array loaded = new Array<>(); + + /** Loads all plugins from the folder, but does call any methods on them.*/ + public void load(){ + for(FileHandle file : pluginDirectory.list()){ + if(!file.extension().equals("jar")) continue; + + try{ + loaded.add(loadPlugin(file)); + }catch(IllegalArgumentException ignored){ + }catch(Exception e){ + Log.err("Failed to load plugin file {0}. Skipping.", file); + e.printStackTrace(); + } + } + } + + /** @return all loaded plugins. */ + public Array all(){ + return loaded; + } + + /** Iterates through each plugin.*/ + public void each(Consumer cons){ + loaded.each(p -> cons.accept(p.plugin)); + } + + private LoadedPlugin loadPlugin(FileHandle jar) throws Exception{ + FileHandle zip = new ZipFileHandle(jar); + + FileHandle metaf = zip.child("plugin.json"); + if(!metaf.exists()){ + Log.warn("Plugin {0} doesn't have a 'plugin.json' file, skipping.", jar); + throw new IllegalArgumentException(); + } + + PluginMeta meta = JsonIO.read(PluginMeta.class, metaf.readString()); + + URLClassLoader classLoader = (URLClassLoader)ClassLoader.getSystemClassLoader(); + Method method = URLClassLoader.class.getDeclaredMethod("addURL", URL.class); + method.setAccessible(true); + method.invoke(classLoader, jar.file().toURI().toURL()); + + Class main = Class.forName(meta.main); + return new LoadedPlugin(jar, zip, (Plugin)main.newInstance(), meta); + } + + /** Represents a plugin that has been loaded from a jar file.*/ + public static class LoadedPlugin{ + public final FileHandle jarFile; + public final FileHandle zipRoot; + public final Plugin plugin; + public final PluginMeta meta; + + public LoadedPlugin(FileHandle jarFile, FileHandle zipRoot, Plugin plugin, PluginMeta meta){ + this.zipRoot = zipRoot; + this.jarFile = jarFile; + this.plugin = plugin; + this.meta = meta; + } + } + + /** Plugin metadata information.*/ + public static class PluginMeta{ + public String name, author, main, description; + public String version; + } +} diff --git a/core/src/io/anuke/mindustry/type/Item.java b/core/src/io/anuke/mindustry/type/Item.java index b3ae589254..19ca42e7b4 100644 --- a/core/src/io/anuke/mindustry/type/Item.java +++ b/core/src/io/anuke/mindustry/type/Item.java @@ -1,14 +1,13 @@ package io.anuke.mindustry.type; -import io.anuke.arc.Core; -import io.anuke.arc.collection.Array; -import io.anuke.arc.graphics.Color; -import io.anuke.arc.graphics.g2d.TextureRegion; -import io.anuke.arc.scene.ui.layout.Table; -import io.anuke.mindustry.game.UnlockableContent; -import io.anuke.mindustry.ui.ContentDisplay; -import io.anuke.mindustry.world.blocks.Floor; -import io.anuke.mindustry.world.blocks.OreBlock; +import io.anuke.arc.*; +import io.anuke.arc.collection.*; +import io.anuke.arc.graphics.*; +import io.anuke.arc.graphics.g2d.*; +import io.anuke.arc.scene.ui.layout.*; +import io.anuke.mindustry.game.*; +import io.anuke.mindustry.ui.*; +import io.anuke.mindustry.world.blocks.*; import static io.anuke.mindustry.Vars.content; @@ -40,6 +39,7 @@ public class Item extends UnlockableContent implements Comparable{ this.description = Core.bundle.getOrNull("item." + this.name + ".description"); } + @Override public void load(){ regions = new TextureRegion[Icon.values().length]; for(int i = 0; i < regions.length; i++){ diff --git a/core/src/io/anuke/mindustry/type/Zone.java b/core/src/io/anuke/mindustry/type/Zone.java index 02ef87b8e1..34a42d9d17 100644 --- a/core/src/io/anuke/mindustry/type/Zone.java +++ b/core/src/io/anuke/mindustry/type/Zone.java @@ -3,7 +3,6 @@ package io.anuke.mindustry.type; import io.anuke.arc.*; import io.anuke.arc.collection.*; 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.*; @@ -28,7 +27,7 @@ public class Zone extends UnlockableContent{ public int configureWave = 15; public int launchPeriod = 10; public Loadout loadout = Loadouts.basicShard; - public Texture preview; + public TextureRegion preview; protected ItemStack[] baseLaunchCost = {}; protected Array startingItems = new Array<>(); @@ -41,6 +40,11 @@ public class Zone extends UnlockableContent{ this.generator = generator; } + @Override + public void load(){ + preview = Core.atlas.find(name); + } + public Rules getRules(){ if(generator instanceof MapGenerator){ return ((MapGenerator)generator).getMap().rules(); @@ -174,13 +178,6 @@ public class Zone extends UnlockableContent{ } } - @Override - public void load(){ - if(Core.files.internal("zones/" + name + ".png").exists() && !headless){ - preview = new Texture(Core.files.internal("zones/" + name + ".png")); - } - } - @Override public boolean alwaysUnlocked(){ return alwaysUnlocked; diff --git a/core/src/io/anuke/mindustry/ui/dialogs/CustomGameDialog.java b/core/src/io/anuke/mindustry/ui/dialogs/CustomGameDialog.java index fccf4fff16..9fd1f6f847 100644 --- a/core/src/io/anuke/mindustry/ui/dialogs/CustomGameDialog.java +++ b/core/src/io/anuke/mindustry/ui/dialogs/CustomGameDialog.java @@ -6,13 +6,12 @@ import io.anuke.arc.math.*; import io.anuke.arc.scene.ui.*; import io.anuke.arc.scene.ui.layout.*; import io.anuke.arc.util.*; +import io.anuke.mindustry.*; import io.anuke.mindustry.game.*; import io.anuke.mindustry.graphics.*; import io.anuke.mindustry.maps.*; import io.anuke.mindustry.ui.*; -import static io.anuke.mindustry.Vars.world; - public class CustomGameDialog extends FloatingDialog{ private MapPlayDialog dialog = new MapPlayDialog(); @@ -42,7 +41,7 @@ public class CustomGameDialog extends FloatingDialog{ int i = 0; maps.defaults().width(170).fillY().top().pad(4f); - for(Map map : world.maps.all()){ + for(Map map : Vars.maps.all()){ if(i % maxwidth == 0){ maps.row(); @@ -83,7 +82,7 @@ public class CustomGameDialog extends FloatingDialog{ i++; } - if(world.maps.all().size == 0){ + if(Vars.maps.all().size == 0){ maps.add("$maps.none").pad(50); } diff --git a/core/src/io/anuke/mindustry/ui/dialogs/DeployDialog.java b/core/src/io/anuke/mindustry/ui/dialogs/DeployDialog.java index 166697e4ff..b1e8acca02 100644 --- a/core/src/io/anuke/mindustry/ui/dialogs/DeployDialog.java +++ b/core/src/io/anuke/mindustry/ui/dialogs/DeployDialog.java @@ -14,9 +14,8 @@ import io.anuke.arc.scene.ui.layout.*; import io.anuke.arc.scene.utils.*; import io.anuke.arc.util.*; import io.anuke.mindustry.content.*; -import io.anuke.mindustry.core.*; import io.anuke.mindustry.core.GameState.*; -import io.anuke.mindustry.game.EventType.*; +import io.anuke.mindustry.core.*; import io.anuke.mindustry.game.Saves.*; import io.anuke.mindustry.graphics.*; import io.anuke.mindustry.io.SaveIO.*; @@ -33,13 +32,10 @@ public class DeployDialog extends FloatingDialog{ private ObjectSet nodes = new ObjectSet<>(); private ZoneInfoDialog info = new ZoneInfoDialog(); private Rectangle bounds = new Rectangle(); - private Texture nomap = new Texture("zones/nomap.png"); public DeployDialog(){ super("", "fulldialog"); - Events.on(DisposeEvent.class, e -> nomap.dispose()); - ZoneNode root = new ZoneNode(Zones.groundZero, null); TreeLayout layout = new TreeLayout(); @@ -90,6 +86,7 @@ public class DeployDialog extends FloatingDialog{ Stack sub = new Stack(); if(control.saves.getZoneSlot().getZone() != null){ + sub.add(new Table(f -> f.margin(4f).add(new Image("whiteui")).color(Color.fromGray(0.1f)).grow())); sub.add(new Table(f -> f.margin(4f).add(new Image(control.saves.getZoneSlot().getZone().preview).setScaling(Scaling.fit)).color(Color.DARK_GRAY).grow())); } @@ -195,7 +192,7 @@ public class DeployDialog extends FloatingDialog{ } stack.setSize(Tmp.v1.x, Tmp.v1.y); - stack.add(new Table(t -> t.margin(4f).add(new Image(node.zone.preview != null ? node.zone.preview : nomap).setScaling(Scaling.stretch)).color(node.zone.unlocked() ? Color.DARK_GRAY : Color.fromGray(0.2f)).grow())); + stack.add(new Table(t -> t.margin(4f).add(new Image(node.zone.preview).setScaling(Scaling.stretch)).color(node.zone.unlocked() ? Color.DARK_GRAY : Color.fromGray(0.2f)).grow())); stack.update(() -> stack.setPosition(node.x + panX + width / 2f, node.y + panY + height / 2f, Align.center)); Button button = new Button("square"); diff --git a/core/src/io/anuke/mindustry/ui/dialogs/LoadDialog.java b/core/src/io/anuke/mindustry/ui/dialogs/LoadDialog.java index 043bc7585a..8440fe031b 100644 --- a/core/src/io/anuke/mindustry/ui/dialogs/LoadDialog.java +++ b/core/src/io/anuke/mindustry/ui/dialogs/LoadDialog.java @@ -51,6 +51,7 @@ public class LoadDialog extends FloatingDialog{ Time.runTask(2f, () -> Core.scene.setScrollFocus(pane)); Array array = control.saves.getSaveSlots(); + array.sort((slot, other) -> -Long.compare(slot.getTimestamp(), other.getTimestamp())); for(SaveSlot slot : array){ if(slot.isHidden()) continue; diff --git a/core/src/io/anuke/mindustry/ui/dialogs/MapsDialog.java b/core/src/io/anuke/mindustry/ui/dialogs/MapsDialog.java index 41a7ec23c8..2cf501c17d 100644 --- a/core/src/io/anuke/mindustry/ui/dialogs/MapsDialog.java +++ b/core/src/io/anuke/mindustry/ui/dialogs/MapsDialog.java @@ -63,7 +63,7 @@ public class MapsDialog extends FloatingDialog{ if(!ios){ buttons.addImageTextButton("$editor.importmap", "icon-load", iconsize, () -> { Platform.instance.showFileChooser("$editor.importmap", "Map File", file -> { - world.maps.tryCatchMapError(() -> { + maps.tryCatchMapError(() -> { if(MapIO.isImage(file)){ ui.showError("$editor.errorimage"); return; @@ -73,14 +73,14 @@ public class MapsDialog extends FloatingDialog{ if(file.extension().equalsIgnoreCase(mapExtension)){ map = MapIO.createMap(file, true); }else{ - map = world.maps.makeLegacyMap(file); + map = maps.makeLegacyMap(file); } //when you attempt to import a save, it will have no name, so generate one String name = map.tags.getOr("name", () -> { String result = "unknown"; int number = 0; - while(world.maps.byName(result + number++) != null) ; + while(maps.byName(result + number++) != null) ; return result + number; }); @@ -90,19 +90,19 @@ public class MapsDialog extends FloatingDialog{ return; } - Map conflict = world.maps.all().find(m -> m.name().equals(name)); + Map conflict = maps.all().find(m -> m.name().equals(name)); if(conflict != null && !conflict.custom){ ui.showInfo(Core.bundle.format("editor.import.exists", name)); }else if(conflict != null){ ui.showConfirm("$confirm", "$editor.overwrite.confirm", () -> { - world.maps.tryCatchMapError(() -> { - world.maps.importMap(file); + maps.tryCatchMapError(() -> { + maps.importMap(file); setup(); }); }); }else{ - world.maps.importMap(map.file); + maps.importMap(map.file); setup(); } @@ -123,7 +123,7 @@ public class MapsDialog extends FloatingDialog{ float mapsize = 200f; int i = 0; - for(Map map : world.maps.all()){ + for(Map map : Vars.maps.all()){ if(i % maxwidth == 0){ maps.row(); @@ -143,7 +143,7 @@ public class MapsDialog extends FloatingDialog{ i++; } - if(world.maps.all().size == 0){ + if(Vars.maps.all().size == 0){ maps.add("$maps.none"); } @@ -200,7 +200,7 @@ public class MapsDialog extends FloatingDialog{ table.addImageTextButton("$delete", "icon-trash-16-small", iconsizesmall, () -> { ui.showConfirm("$confirm", Core.bundle.format("map.delete", map.name()), () -> { - world.maps.removeMap(map); + maps.removeMap(map); dialog.hide(); setup(); }); diff --git a/core/src/io/anuke/mindustry/ui/dialogs/SettingsMenuDialog.java b/core/src/io/anuke/mindustry/ui/dialogs/SettingsMenuDialog.java index 19fbf6a4d3..08c515a950 100644 --- a/core/src/io/anuke/mindustry/ui/dialogs/SettingsMenuDialog.java +++ b/core/src/io/anuke/mindustry/ui/dialogs/SettingsMenuDialog.java @@ -22,12 +22,13 @@ import static io.anuke.arc.Core.bundle; import static io.anuke.mindustry.Vars.*; public class SettingsMenuDialog extends SettingsDialog{ - public SettingsTable graphics; - public SettingsTable game; - public SettingsTable sound; + private SettingsTable graphics; + private SettingsTable game; + private SettingsTable sound; private Table prefs; private Table menu; + private FloatingDialog dataDialog; private boolean wasPaused; public SettingsMenuDialog(){ @@ -75,6 +76,85 @@ public class SettingsMenuDialog extends SettingsDialog{ prefs.clearChildren(); prefs.add(menu); + dataDialog = new FloatingDialog("$settings.data"); + dataDialog.addCloseButton(); + + dataDialog.cont.table("button", t -> { + t.defaults().size(240f, 60f).left(); + String style = "clear"; + + t.addButton("$settings.cleardata", style, () -> ui.showConfirm("$confirm", "$settings.clearall.confirm", () -> { + ObjectMap map = new ObjectMap<>(); + for(String value : Core.settings.keys()){ + if(value.contains("usid") || value.contains("uuid")){ + map.put(value, Core.settings.getString(value)); + } + } + Core.settings.clear(); + Core.settings.putAll(map); + Core.settings.save(); + + for(FileHandle file : dataDirectory.list()){ + file.deleteDirectory(); + } + + Core.app.exit(); + })); + + t.row(); + + if(android && (Core.files.local("mindustry-maps").exists() || Core.files.local("mindustry-saves").exists())){ + t.addButton("$classic.export", style, () -> { + control.checkClassicData(); + }); + } + + t.row(); + + t.addButton("$data.export", style, () -> { + if(ios){ + FileHandle file = Core.files.local("mindustry-data-export.zip"); + try{ + data.exportData(file); + }catch(Exception e){ + ui.showError(Strings.parseException(e, true)); + } + Platform.instance.shareFile(file); + }else{ + Platform.instance.showFileChooser("$data.export", "Zip Files", file -> { + FileHandle ff = file; + if(!ff.extension().equals("zip")){ + ff = ff.sibling(ff.nameWithoutExtension() + ".zip"); + } + try{ + data.exportData(ff); + ui.showInfo("$data.exported"); + }catch(Exception e){ + e.printStackTrace(); + ui.showError(Strings.parseException(e, true)); + } + }, false, f -> false); + } + }); + + t.row(); + + //iOS doesn't have a file chooser. + if(!ios){ + t.addButton("$data.import", style, () -> ui.showConfirm("$confirm", "$data.import.confirm", () -> Platform.instance.showFileChooser("$data.import", "Zip Files", file -> { + try{ + data.importData(file); + Core.app.exit(); + }catch(IllegalArgumentException e){ + ui.showError("$data.invalid"); + }catch(Exception e){ + e.printStackTrace(); + ui.showError(Strings.parseException(e, true)); + } + }, true, f -> f.equalsIgnoreCase("zip")))); + } + }); + ScrollPane pane = new ScrollPane(prefs); pane.addCaptureListener(new InputListener(){ @Override @@ -121,6 +201,9 @@ public class SettingsMenuDialog extends SettingsDialog{ menu.row(); menu.addButton("$settings.controls", style, ui.controls::show); } + + menu.row(); + menu.addButton("$settings.data", style, () -> dataDialog.show()); } void addSettings(){ @@ -139,30 +222,7 @@ public class SettingsMenuDialog extends SettingsDialog{ game.checkPref("crashreport", true); } - game.pref(new Setting(){ - @Override - public void add(SettingsTable table){ - table.addButton("$settings.cleardata", () -> ui.showConfirm("$confirm", "$settings.clearall.confirm", () -> { - ObjectMap map = new ObjectMap<>(); - for(String value : Core.settings.keys()){ - if(value.contains("usid") || value.contains("uuid")){ - map.put(value, Core.settings.getString(value)); - } - } - Core.settings.clear(); - Core.settings.putAll(map); - Core.settings.save(); - - for(FileHandle file : dataDirectory.list()){ - file.deleteDirectory(); - } - - Core.app.exit(); - })).size(220f, 60f).pad(6).left(); - table.add(); - table.row(); - } - }); + game.checkPref("savecreate", true); game.pref(new Setting(){ @Override @@ -177,28 +237,13 @@ public class SettingsMenuDialog extends SettingsDialog{ } }); - if(android && (Core.files.local("mindustry-maps").exists() || Core.files.local("mindustry-saves").exists())){ - game.pref(new Setting(){ - @Override - public void add(SettingsTable table){ - table.addButton("$classic.export", () -> { - control.checkClassicData(); - }).size(220f, 60f).pad(6).left(); - table.add(); - table.row(); - hide(); - } - }); - } - graphics.sliderPref("uiscale", 100, 25, 400, 25, s -> { - if(Core.graphics.getFrameId() > 10){ - Log.info("changed"); + if(ui.settings != null){ Core.settings.put("uiscalechanged", true); } return s + "%"; }); - graphics.sliderPref("fpscap", 241, 5, 241, 5, s -> (s > 240 ? Core.bundle.get("setting.fpscap.none") : Core.bundle.format("setting.fpscap.text", s))); + graphics.sliderPref("fpscap", 240, 5, 245, 5, s -> (s > 240 ? Core.bundle.get("setting.fpscap.none") : Core.bundle.format("setting.fpscap.text", s))); graphics.sliderPref("chatopacity", 100, 0, 100, 5, s -> s + "%"); if(!mobile){ @@ -207,7 +252,7 @@ public class SettingsMenuDialog extends SettingsDialog{ if(b){ Core.graphics.setFullscreenMode(Core.graphics.getDisplayMode()); }else{ - Core.graphics.setWindowedMode(600, 480); + Core.graphics.setWindowedMode(Core.graphics.getWidth(), Core.graphics.getHeight()); } }); @@ -241,7 +286,9 @@ public class SettingsMenuDialog extends SettingsDialog{ graphics.checkPref("fps", false); graphics.checkPref("indicators", true); graphics.checkPref("animatedwater", false); - graphics.checkPref("animatedshields", !mobile); + if(Shaders.shield != null){ + graphics.checkPref("animatedshields", !mobile); + } graphics.checkPref("bloom", false, val -> renderer.toggleBloom(val)); graphics.checkPref("lasers", true); graphics.checkPref("pixelate", false); diff --git a/core/src/io/anuke/mindustry/ui/fragments/HudFragment.java b/core/src/io/anuke/mindustry/ui/fragments/HudFragment.java index 72a01f3070..d3cc688ebb 100644 --- a/core/src/io/anuke/mindustry/ui/fragments/HudFragment.java +++ b/core/src/io/anuke/mindustry/ui/fragments/HudFragment.java @@ -257,7 +257,7 @@ public class HudFragment extends Fragment{ t.table("flat", c -> c.add("$nearpoint") .update(l -> l.setColor(Tmp.c1.set(Color.WHITE).lerp(Color.SCARLET, Mathf.absin(Time.time(), 10f, 1f)))) .get().setAlignment(Align.center, Align.center)) - .margin(6).update(u -> u.color.a = Mathf.lerpDelta(u.color.a, Mathf.num(world.spawner.playerNear()), 0.1f)).get().color.a = 0f; + .margin(6).update(u -> u.color.a = Mathf.lerpDelta(u.color.a, Mathf.num(spawner.playerNear()), 0.1f)).get().color.a = 0f; }); parent.fill(t -> { @@ -543,7 +543,7 @@ public class HudFragment extends Fragment{ return world.isZone() && world.getZone().metCondition() && !Net.client() && - state.wave % world.getZone().launchPeriod == 0 && !world.spawner.isSpawning(); + state.wave % world.getZone().launchPeriod == 0 && !spawner.isSpawning(); } private boolean canLaunch(){ @@ -639,7 +639,7 @@ public class HudFragment extends Fragment{ } private boolean canSkipWave(){ - return state.rules.waves && ((Net.server() || player.isAdmin) || !Net.active()) && state.enemies() == 0 && !world.spawner.isSpawning() && !state.rules.tutorial; + return state.rules.waves && ((Net.server() || player.isAdmin) || !Net.active()) && state.enemies() == 0 && !spawner.isSpawning() && !state.rules.tutorial; } private void addPlayButton(Table table){ diff --git a/core/src/io/anuke/mindustry/ui/fragments/MenuFragment.java b/core/src/io/anuke/mindustry/ui/fragments/MenuFragment.java index 6f6dd9ec8f..72bc97522b 100644 --- a/core/src/io/anuke/mindustry/ui/fragments/MenuFragment.java +++ b/core/src/io/anuke/mindustry/ui/fragments/MenuFragment.java @@ -19,18 +19,19 @@ import io.anuke.mindustry.game.Version; import io.anuke.mindustry.graphics.MenuRenderer; import io.anuke.mindustry.ui.MobileButton; +import static io.anuke.arc.Core.assets; import static io.anuke.mindustry.Vars.*; public class MenuFragment extends Fragment{ - private Texture logo = new Texture("sprites/logo.png"); private Table container, submenu; private Button currentMenu; private MenuRenderer renderer; public MenuFragment(){ + assets.load("sprites/logo.png", Texture.class); + assets.finishLoading(); Events.on(DisposeEvent.class, event -> { renderer.dispose(); - logo.dispose(); }); } @@ -59,19 +60,16 @@ public class MenuFragment extends Fragment{ } }); - //discord icon in top right - //parent.fill(c -> c.top().right().addButton("", "discord", ui.discord::show).size(84, 45) - //.visible(() -> state.is(State.menu))); - //info icon if(mobile){ parent.fill(c -> c.bottom().left().addButton("", "info", ui.about::show).size(84, 45)); parent.fill(c -> c.bottom().right().addButton("", "discord", ui.discord::show).size(84, 45)); } - String versionText = "[#ffffffba]" + ((Version.build == -1) ? "[#fc8140aa]custom build" : Version.modifier + " build " + Version.build); + String versionText = "[#ffffffba]" + ((Version.build == -1) ? "[#fc8140aa]custom build" : (Version.type.equals("official") ? Version.modifier : Version.type) + " build " + Version.build); parent.fill((x, y, w, h) -> { + Texture logo = Core.assets.get("sprites/logo.png"); float logoscl = UnitScl.dp.scl(1); float logow = Math.min(logo.getWidth() * logoscl, Core.graphics.getWidth() - UnitScl.dp.scl(20)); float logoh = logow * (float)logo.getHeight() / logo.getWidth(); @@ -81,6 +79,7 @@ public class MenuFragment extends Fragment{ Draw.color(); Draw.rect(Draw.wrap(logo), fx, fy, logow, logoh); + Core.scene.skin.font().setColor(Color.WHITE); Core.scene.skin.font().draw(versionText, fx, fy - logoh/2f, Align.center); }).touchable(Touchable.disabled); diff --git a/core/src/io/anuke/mindustry/ui/fragments/PlacementFragment.java b/core/src/io/anuke/mindustry/ui/fragments/PlacementFragment.java index cdf0921d68..0652803f82 100644 --- a/core/src/io/anuke/mindustry/ui/fragments/PlacementFragment.java +++ b/core/src/io/anuke/mindustry/ui/fragments/PlacementFragment.java @@ -1,26 +1,22 @@ package io.anuke.mindustry.ui.fragments; -import io.anuke.arc.Core; -import io.anuke.arc.Events; -import io.anuke.arc.collection.Array; -import io.anuke.arc.graphics.Color; -import io.anuke.arc.input.KeyCode; -import io.anuke.arc.math.geom.Vector2; -import io.anuke.arc.scene.Group; -import io.anuke.arc.scene.event.Touchable; -import io.anuke.arc.scene.style.TextureRegionDrawable; +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.*; +import io.anuke.arc.scene.style.*; import io.anuke.arc.scene.ui.*; -import io.anuke.arc.scene.ui.layout.Table; -import io.anuke.mindustry.content.Blocks; -import io.anuke.mindustry.entities.type.TileEntity; +import io.anuke.arc.scene.ui.layout.*; +import io.anuke.mindustry.entities.type.*; import io.anuke.mindustry.game.EventType.*; -import io.anuke.mindustry.graphics.Pal; -import io.anuke.mindustry.input.Binding; -import io.anuke.mindustry.input.InputHandler; +import io.anuke.mindustry.graphics.*; +import io.anuke.mindustry.input.*; import io.anuke.mindustry.type.*; -import io.anuke.mindustry.world.Block; -import io.anuke.mindustry.world.Block.Icon; -import io.anuke.mindustry.world.Tile; +import io.anuke.mindustry.world.*; +import io.anuke.mindustry.world.Block.*; import static io.anuke.mindustry.Vars.*; @@ -151,8 +147,7 @@ public class PlacementFragment extends Fragment{ button.update(() -> { //color unplacable things gray TileEntity core = player.getClosestCore(); - Color color = block.buildVisibility == Blocks.padVisible && !block.buildVisibility.get() ? Pal.noplace : - state.rules.infiniteResources || (core != null && (core.items.has(block.buildRequirements, state.rules.buildCostMultiplier) || state.rules.infiniteResources)) ? Color.WHITE : Color.GRAY; + Color color = state.rules.infiniteResources || (core != null && (core.items.has(block.buildRequirements, state.rules.buildCostMultiplier) || state.rules.infiniteResources)) ? Color.WHITE : Color.GRAY; button.forEach(elem -> elem.setColor(color)); button.setChecked(input.block == block); }); @@ -204,10 +199,6 @@ public class PlacementFragment extends Fragment{ Events.fire(new BlockInfoEvent()); }).size(8 * 5).padTop(-5).padRight(-5).right().grow().name("blockinfo"); } - if(lastDisplay.buildVisibility == Blocks.padVisible && !lastDisplay.buildVisibility.get()){ - header.row(); - header.add("$attackpvponly").width(230f).wrap().colspan(3).left(); - } }).growX().left(); topTable.row(); //add requirement table @@ -305,7 +296,7 @@ public class PlacementFragment extends Fragment{ Array getByCategory(Category cat){ returnArray.clear(); for(Block block : content.blocks()){ - if(block.buildCategory == cat && (block.isVisible() || block.buildVisibility == Blocks.padVisible)){ + if(block.buildCategory == cat && block.isVisible()){ returnArray.add(block); } } diff --git a/core/src/io/anuke/mindustry/world/Tile.java b/core/src/io/anuke/mindustry/world/Tile.java index 05e0f6c1ac..e67be3d812 100644 --- a/core/src/io/anuke/mindustry/world/Tile.java +++ b/core/src/io/anuke/mindustry/world/Tile.java @@ -104,6 +104,10 @@ public class Tile implements Position, TargetTrait{ return block().offset() + worldy(); } + public boolean isDarkened(){ + return block().solid && !block().synthetic() && block().fillsTile; + } + public Floor floor(){ return floor; } diff --git a/core/src/io/anuke/mindustry/world/blocks/StaticWall.java b/core/src/io/anuke/mindustry/world/blocks/StaticWall.java index 79a9b6f1d7..0797fee02a 100644 --- a/core/src/io/anuke/mindustry/world/blocks/StaticWall.java +++ b/core/src/io/anuke/mindustry/world/blocks/StaticWall.java @@ -10,6 +10,7 @@ import static io.anuke.mindustry.Vars.*; public class StaticWall extends Rock{ TextureRegion large; + TextureRegion[][] split; public StaticWall(String name){ super(name); @@ -25,9 +26,7 @@ public class StaticWall extends Rock{ int ry = tile.y / 2 * 2; if(Core.atlas.isFound(large) && eq(rx, ry) && Mathf.randomSeed(Pos.get(rx, ry)) < 0.5){ - if(rx == tile.x && ry == tile.y){ - Draw.rect(large, tile.worldx() + tilesize / 2f, tile.worldy() + tilesize / 2f); - } + Draw.rect(split[tile.x % 2][1 - tile.y % 2], tile.worldx(), tile.worldy()); }else if(variants > 0){ Draw.rect(variantRegions[Mathf.randomSeed(tile.pos(), 0, Math.max(0, variantRegions.length - 1))], tile.worldx(), tile.worldy()); }else{ @@ -39,6 +38,7 @@ public class StaticWall extends Rock{ public void load(){ super.load(); large = Core.atlas.find(name + "-large"); + split = large.split(32, 32); } boolean eq(int rx, int ry){ diff --git a/core/src/io/anuke/mindustry/world/blocks/defense/Door.java b/core/src/io/anuke/mindustry/world/blocks/defense/Door.java index 1653b57840..db08a2bdf4 100644 --- a/core/src/io/anuke/mindustry/world/blocks/defense/Door.java +++ b/core/src/io/anuke/mindustry/world/blocks/defense/Door.java @@ -15,11 +15,12 @@ import io.anuke.mindustry.world.*; import java.io.*; -import static io.anuke.mindustry.Vars.world; +import static io.anuke.mindustry.Vars.*; public class Door extends Wall{ protected final Rectangle rect = new Rectangle(); + protected int timerToggle = timers++; protected Effect openfx = Fx.dooropen; protected Effect closefx = Fx.doorclose; @@ -39,7 +40,7 @@ public class Door extends Wall{ entity.open = open; Door door = (Door)tile.block(); - world.pathfinder.updateSolid(tile); + pathfinder.updateSolid(tile); if(!entity.open){ Effects.effect(door.openfx, tile.drawx(), tile.drawy()); }else{ @@ -81,7 +82,7 @@ public class Door extends Wall{ public void tapped(Tile tile, Player player){ DoorEntity entity = tile.entity(); - if(Units.anyEntities(tile) && entity.open){ + if((Units.anyEntities(tile) && entity.open) || !tile.entity.timer.get(timerToggle, 30f)){ return; } diff --git a/core/src/io/anuke/mindustry/world/blocks/defense/ForceProjector.java b/core/src/io/anuke/mindustry/world/blocks/defense/ForceProjector.java index c0a857f625..5bbd09e4fa 100644 --- a/core/src/io/anuke/mindustry/world/blocks/defense/ForceProjector.java +++ b/core/src/io/anuke/mindustry/world/blocks/defense/ForceProjector.java @@ -1,23 +1,20 @@ package io.anuke.mindustry.world.blocks.defense; -import io.anuke.arc.Core; -import io.anuke.arc.function.Consumer; -import io.anuke.arc.graphics.Blending; -import io.anuke.arc.graphics.Color; +import io.anuke.arc.*; +import io.anuke.arc.function.*; +import io.anuke.arc.graphics.*; import io.anuke.arc.graphics.g2d.*; -import io.anuke.arc.math.Mathf; -import io.anuke.arc.util.Time; -import io.anuke.mindustry.content.Fx; +import io.anuke.arc.math.*; +import io.anuke.arc.util.*; +import io.anuke.mindustry.content.*; import io.anuke.mindustry.entities.*; -import io.anuke.mindustry.entities.impl.BaseEntity; +import io.anuke.mindustry.entities.impl.*; import io.anuke.mindustry.entities.traits.*; -import io.anuke.mindustry.entities.type.TileEntity; -import io.anuke.mindustry.graphics.Pal; -import io.anuke.mindustry.world.Block; -import io.anuke.mindustry.world.Tile; +import io.anuke.mindustry.entities.type.*; +import io.anuke.mindustry.graphics.*; +import io.anuke.mindustry.world.*; import io.anuke.mindustry.world.consumers.*; -import io.anuke.mindustry.world.meta.BlockStat; -import io.anuke.mindustry.world.meta.StatUnit; +import io.anuke.mindustry.world.meta.*; import java.io.*; @@ -94,7 +91,6 @@ public class ForceProjector extends Block{ @Override public void update(Tile tile){ ForceEntity entity = tile.entity(); - boolean cheat = tile.isEnemyCheat(); if(entity.shield == null){ entity.shield = new ShieldEntity(tile); @@ -109,21 +105,15 @@ public class ForceProjector extends Block{ entity.cons.trigger(); } - entity.radscl = Mathf.lerpDelta(entity.radscl, entity.broken ? 0f : 1f, 0.05f); + entity.radscl = Mathf.lerpDelta(entity.radscl, entity.broken ? 0f : entity.warmup, 0.05f); if(Mathf.chance(Time.delta() * entity.buildup / breakage * 0.1f)){ Effects.effect(Fx.reactorsmoke, tile.drawx() + Mathf.range(tilesize / 2f), tile.drawy() + Mathf.range(tilesize / 2f)); } - //use cases: - // - There is enough power in the buffer, and there are no shots fired => Draw base power and keep shield up - // - There is enough power in the buffer, but not enough power to cope for shots being fired => Draw all power and break shield - // - There is enough power in the buffer and enough power to cope for shots being fired => Draw base power + additional power based on shots absorbed - // - There is not enough base power in the buffer => Draw all power and break shield - // - The generator is in the AI base and uses cheat mode => Only draw power from shots being absorbed - - float relativePowerDraw = cheat ? 0f : 1f; + entity.warmup = Mathf.lerpDelta(entity.warmup, entity.power.satisfaction, 0.1f); +/* if(entity.power.satisfaction < relativePowerDraw){ entity.warmup = Mathf.lerpDelta(entity.warmup, 0f, 0.15f); entity.power.satisfaction = 0f; @@ -132,7 +122,7 @@ public class ForceProjector extends Block{ } }else{ entity.warmup = Mathf.lerpDelta(entity.warmup, 1f, 0.1f); - } + }*/ if(entity.buildup > 0){ float scale = !entity.broken ? cooldownNormal : cooldownBrokenBase; @@ -145,7 +135,7 @@ public class ForceProjector extends Block{ entity.buildup -= Time.delta() * scale; } - if(entity.broken && entity.buildup <= 0 && entity.warmup >= 0.9f){ + if(entity.broken && entity.buildup <= 0){ entity.broken = false; } 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 7721d95510..d2149dcbab 100644 --- a/core/src/io/anuke/mindustry/world/blocks/defense/MendProjector.java +++ b/core/src/io/anuke/mindustry/world/blocks/defense/MendProjector.java @@ -101,7 +101,7 @@ public class MendProjector extends Block{ @Override public void drawPlace(int x, int y, int rotation, boolean valid){ - Drawf.dashCircle(x * tilesize, y * tilesize, range, Pal.accent); + Drawf.dashCircle(x * tilesize + offset(), y * tilesize + offset(), range, Pal.accent); } @Override diff --git a/core/src/io/anuke/mindustry/world/blocks/power/PowerGraph.java b/core/src/io/anuke/mindustry/world/blocks/power/PowerGraph.java index 172ad36f28..2703c9abc0 100644 --- a/core/src/io/anuke/mindustry/world/blocks/power/PowerGraph.java +++ b/core/src/io/anuke/mindustry/world/blocks/power/PowerGraph.java @@ -109,10 +109,7 @@ public class PowerGraph{ for(Tile battery : batteries){ Consumers consumes = battery.block().consumes; if(consumes.hasPower()){ - ConsumePower consumePower = consumes.getPower(); - if(consumePower.capacity > 0f){ - battery.entity.power.satisfaction = Math.max(0.0f, battery.entity.power.satisfaction - consumedPowerPercentage); - } + battery.entity.power.satisfaction *= (1f-consumedPowerPercentage); } } return used; 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 358fb27a43..194df6ca88 100644 --- a/core/src/io/anuke/mindustry/world/blocks/power/PowerNode.java +++ b/core/src/io/anuke/mindustry/world/blocks/power/PowerNode.java @@ -122,7 +122,7 @@ public class PowerNode extends PowerBlock{ private void getPotentialLinks(Tile tile, Consumer others){ Predicate 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) + 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(); @@ -222,20 +222,7 @@ 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); - }); - - /* - for(int cx = (int)(x - laserRange - 1); cx <= x + laserRange + 1; cx++){ - for(int cy = (int)(y - laserRange - 1); cy <= y + laserRange + 1; cy++){ - Tile link = world.ltile(cx, cy); - - if(link != null && !(link.x == x && link.y == y) && link.block().hasPower && overlaps(x * tilesize + offset(), y *tilesize + offset(), link, laserRange * tilesize)){ - Drawf.square(link.drawx(), link.drawy(), link.block().size * tilesize / 2f + 2f, link.pos() == lastPlaced ? Pal.place : Pal.accent); - } - } - }*/ + getPotentialLinks(tile, other -> Drawf.square(other.drawx(), other.drawy(), other.block().size * tilesize / 2f + 2f, Pal.place)); Draw.reset(); } diff --git a/core/src/io/anuke/mindustry/world/blocks/units/CommandCenter.java b/core/src/io/anuke/mindustry/world/blocks/units/CommandCenter.java new file mode 100644 index 0000000000..9b93edaec3 --- /dev/null +++ b/core/src/io/anuke/mindustry/world/blocks/units/CommandCenter.java @@ -0,0 +1,129 @@ +package io.anuke.mindustry.world.blocks.units; + +import io.anuke.annotations.Annotations.*; +import io.anuke.arc.*; +import io.anuke.arc.collection.*; +import io.anuke.arc.graphics.*; +import io.anuke.arc.graphics.g2d.*; +import io.anuke.arc.scene.ui.*; +import io.anuke.arc.scene.ui.layout.*; +import io.anuke.arc.util.*; +import io.anuke.mindustry.content.*; +import io.anuke.mindustry.entities.*; +import io.anuke.mindustry.entities.Effects.*; +import io.anuke.mindustry.entities.type.*; +import io.anuke.mindustry.entities.units.*; +import io.anuke.mindustry.game.*; +import io.anuke.mindustry.gen.*; +import io.anuke.mindustry.graphics.*; +import io.anuke.mindustry.world.*; +import io.anuke.mindustry.world.meta.*; + +import java.io.*; + +import static io.anuke.mindustry.Vars.*; + +public class CommandCenter extends Block{ + protected TextureRegion[] commandRegions = new TextureRegion[UnitCommand.all.length]; + protected Color topColor = Pal.command; + protected Color bottomColor = Color.valueOf("5e5e5e"); + protected Effect effect = Fx.commandSend; + + public CommandCenter(String name){ + super(name); + + flags = EnumSet.of(BlockFlag.comandCenter); + destructible = true; + solid = true; + configurable = true; + } + + @Override + public void placed(Tile tile){ + super.placed(tile); + ObjectSet set = indexer.getAllied(tile.getTeam(), BlockFlag.comandCenter); + + if(set.size > 0){ + CommandCenterEntity entity = tile.entity(); + CommandCenterEntity oe = set.first().entity(); + entity.command = oe.command; + } + } + + @Override + public void load(){ + super.load(); + + for(UnitCommand cmd : UnitCommand.all){ + commandRegions[cmd.ordinal()] = Core.atlas.find("icon-command-" + cmd.name() + "-small"); + } + } + + @Override + public void draw(Tile tile){ + CommandCenterEntity entity = tile.entity(); + super.draw(tile); + + float size = iconsizesmall/4f; + + Draw.color(bottomColor); + Draw.rect(commandRegions[entity.command.ordinal()], tile.drawx(), tile.drawy() - 1, size, size); + Draw.color(topColor); + Draw.rect(commandRegions[entity.command.ordinal()], tile.drawx(), tile.drawy(), size, size); + Draw.color(); + } + + @Override + public void buildTable(Tile tile, Table table){ + CommandCenterEntity entity = tile.entity(); + ButtonGroup group = new ButtonGroup<>(); + Table buttons = new Table(); + + for(UnitCommand cmd : UnitCommand.all){ + buttons.addImageButton("icon-command-" + cmd.name() + "-small", "clear-toggle-trans", iconsizesmall, () -> Call.onCommandCenterSet(player, tile, cmd)) + .size(44).group(group).update(b -> b.setChecked(entity.command == cmd)); + } + table.add(buttons); + table.row(); + table.label(() -> entity.command.localized()).style("outline").center().growX().get().setAlignment(Align.center); + } + + @Remote(called = Loc.server, forward = true, targets = Loc.both) + public static void onCommandCenterSet(Player player, Tile tile, UnitCommand command){ + Effects.effect(((CommandCenter)tile.block()).effect, tile); + + for(Tile center : indexer.getAllied(tile.getTeam(), BlockFlag.comandCenter)){ + if(center.block() instanceof CommandCenter){ + CommandCenterEntity entity = center.entity(); + entity.command = command; + } + } + + Team team = (player == null ? tile.getTeam() : player.getTeam()); + + for(BaseUnit unit : unitGroups[team.ordinal()].all()){ + unit.onCommand(command); + } + } + + @Override + public TileEntity newEntity(){ + return new CommandCenterEntity(); + } + + public class CommandCenterEntity extends TileEntity{ + public UnitCommand command = UnitCommand.attack; + + @Override + public void write(DataOutput stream) throws IOException{ + super.write(stream); + stream.writeByte(command.ordinal()); + } + + @Override + public void read(DataInput stream, byte version) throws IOException{ + super.read(stream, version); + command = UnitCommand.all[stream.readByte()]; + } + } +} diff --git a/core/src/io/anuke/mindustry/world/meta/BlockFlag.java b/core/src/io/anuke/mindustry/world/meta/BlockFlag.java index 716c51d11f..7b1dd6697e 100644 --- a/core/src/io/anuke/mindustry/world/meta/BlockFlag.java +++ b/core/src/io/anuke/mindustry/world/meta/BlockFlag.java @@ -7,6 +7,8 @@ public enum BlockFlag{ producer(Float.MAX_VALUE), /** A turret. */ turret(Float.MAX_VALUE), + /** Only the command center block.*/ + comandCenter(Float.MAX_VALUE), /** Repair point. */ repair(Float.MAX_VALUE); diff --git a/desktop/build.gradle b/desktop/build.gradle index 0f8aaacae4..b31d856679 100644 --- a/desktop/build.gradle +++ b/desktop/build.gradle @@ -9,6 +9,7 @@ sourceSets.main.java.srcDirs = [ "src/" ] project.ext.mainClassName = "io.anuke.mindustry.desktop.DesktopLauncher" project.ext.assetsDir = new File("../core/assets") +def enableTemplates = true def JDK_DIR = "$System.env.PACKR_DIR" def ICON_DIR = new File("core/assets/icons/icon.icns") @@ -75,7 +76,7 @@ PackrConfig.Platform.values().each{ platform -> delete "build/packr/output/" } - if(platform == PackrConfig.Platform.Windows32 || platform == PackrConfig.Platform.Windows64){ + if(enableTemplates && (platform == PackrConfig.Platform.Windows64)){ copy{ into "build/packr/output" from "${JDK_DIR}/templates/${platform.toString().toLowerCase()}" @@ -110,7 +111,7 @@ PackrConfig.Platform.values().each{ platform -> new Packr().pack(config) - if(platform == PackrConfig.Platform.Linux64){ + if(platform != PackrConfig.Platform.MacOS){ copy{ into "build/packr/output/jre/" from "build/packr/output/desktop.jar" @@ -125,16 +126,24 @@ PackrConfig.Platform.values().each{ platform -> if(platform == PackrConfig.Platform.MacOS){ copy{ - into "build/packr/${appName}.app/Contents/" - from "build/packr/Contents/" + into "build/packr/output/${appName}.app/Contents/" + from "build/packr/output/Contents/" } delete{ - delete "build/packr/Contents/" + delete "build/packr/output/Contents/" } } } + if((platform == PackrConfig.Platform.Windows64 || platform == PackrConfig.Platform.Windows32)){ + copy{ + from "build/packr/output/jre/bin/msvcr100.dll" + into "build/packr/output/" + rename("msvcr100.dll", "MSVCR100.dll") + } + } + 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 e4a08eb89c..1570afff42 100644 --- a/desktop/src/io/anuke/mindustry/desktop/DesktopLauncher.java +++ b/desktop/src/io/anuke/mindustry/desktop/DesktopLauncher.java @@ -23,7 +23,7 @@ public class DesktopLauncher{ Net.setServerProvider(new ArcNetServer()); } - new SdlApplication(new Mindustry(), new SdlConfig(){{ + new SdlApplication(new ClientLauncher(), new SdlConfig(){{ title = "Mindustry"; maximized = true; depth = 0; diff --git a/fastlane/metadata/android/ru-RU/short_description.txt b/fastlane/metadata/android/ru-RU/short_description.txt index b6b5a942cd..19f1f83834 100644 --- a/fastlane/metadata/android/ru-RU/short_description.txt +++ b/fastlane/metadata/android/ru-RU/short_description.txt @@ -1 +1 @@ -A factory-based sandbox tower defense game. \ No newline at end of file + Заводостроительная игра-песочница в жанре защита башен. diff --git a/fastlane/metadata/android/uk-UA/full_description.txt b/fastlane/metadata/android/uk-UA/full_description.txt new file mode 100644 index 0000000000..d1f27119ef --- /dev/null +++ b/fastlane/metadata/android/uk-UA/full_description.txt @@ -0,0 +1,15 @@ +Створюйте складні логістичні мережі для перенесення боєприпасів у башточки, видобувайте ресурси для будівництва, і захищайте своє ядро від різних хвиль ворогів. +Грайте з друзями на різних платформах у кооперативні ігри, або киньте їм виклик в командних PvP-матчах. + +Особливості гри: +- 24 вбудовані мапи +- Кампанія, з повноцінним деревом технологій і прогресією мап +- 4 види потужних босів +- Системи для транспорту електроенергії, рідин і ресурсів +- 19 видів дронів, кораблів та наземних бойових одиниць +- Понад 120 блоків у дереві технологій +- Понад 75 видів блоків навколишнього середовища +- Багатоплатформовий мультиплеєр з підтримкою як і локальних мереж, так і серверів +- Користувацькі налаштування гри — ціну блоків, сила ворогів, кількість початкових ресурсів, інтервал між хвилями, тощо +- Редактор мап з незкінченними можливостями, інструментами для випадкової генерації руд, рельєфу, декорацій, а також для симетрії мап +- Розкладки хвиль для мап можна налаштувати diff --git a/fastlane/metadata/android/uk-UA/short_description.txt b/fastlane/metadata/android/uk-UA/short_description.txt new file mode 100644 index 0000000000..fea6ef13fa --- /dev/null +++ b/fastlane/metadata/android/uk-UA/short_description.txt @@ -0,0 +1 @@ +Виробнича пісочниця у жанрі «захист башт» (англ. — Tower Defence, TD). diff --git a/fastlane/metadata/android/uk-UA/title.txt b/fastlane/metadata/android/uk-UA/title.txt new file mode 100644 index 0000000000..2beb939017 --- /dev/null +++ b/fastlane/metadata/android/uk-UA/title.txt @@ -0,0 +1 @@ +Mindustry \ No newline at end of file diff --git a/fastlane/metadata/android/uk-UA/video.txt b/fastlane/metadata/android/uk-UA/video.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/ios/build.gradle b/ios/build.gradle index 6fc88382bb..94e198be83 100644 --- a/ios/build.gradle +++ b/ios/build.gradle @@ -36,6 +36,12 @@ task copyAssets(){ } } +task deploy{ + dependsOn copyAssets + dependsOn createIPA +} + + build.dependsOn copyAssets launchIPhoneSimulator.dependsOn build diff --git a/ios/src/io/anuke/mindustry/IOSLauncher.java b/ios/src/io/anuke/mindustry/IOSLauncher.java index 4161d44017..67df891bd2 100644 --- a/ios/src/io/anuke/mindustry/IOSLauncher.java +++ b/ios/src/io/anuke/mindustry/IOSLauncher.java @@ -7,6 +7,7 @@ import io.anuke.arc.scene.ui.layout.*; import io.anuke.arc.util.*; import io.anuke.arc.util.io.*; import io.anuke.mindustry.core.*; +import io.anuke.mindustry.game.EventType.*; import io.anuke.mindustry.game.Saves.*; import io.anuke.mindustry.io.*; import io.anuke.mindustry.net.Net; @@ -65,7 +66,7 @@ public class IOSLauncher extends IOSApplication.Delegate{ }; IOSApplicationConfiguration config = new IOSApplicationConfiguration(); - return new IOSApplication(new Mindustry(), config); + return new IOSApplication(new ClientLauncher(), config); } @Override @@ -90,17 +91,19 @@ public class IOSLauncher extends IOSApplication.Delegate{ openURL(((NSURL)options.get(UIApplicationLaunchOptions.Keys.URL()))); } - Core.app.post(() -> Core.app.post(() -> { - Core.scene.table("dialogDim", t -> { - t.visible(() -> { - if(!forced) return false; - t.toFront(); - UIInterfaceOrientation o = UIApplication.getSharedApplication().getStatusBarOrientation(); - return forced && (o == UIInterfaceOrientation.Portrait || o == UIInterfaceOrientation.PortraitUpsideDown); + Events.on(ClientLoadEvent.class, e -> { + Core.app.post(() -> Core.app.post(() -> { + Core.scene.table("dialogDim", t -> { + t.visible(() -> { + if(!forced) return false; + t.toFront(); + UIInterfaceOrientation o = UIApplication.getSharedApplication().getStatusBarOrientation(); + return forced && (o == UIInterfaceOrientation.Portrait || o == UIInterfaceOrientation.PortraitUpsideDown); + }); + t.add("Please rotate the device to landscape orientation to use the editor.").wrap().grow(); }); - t.add("Please rotate the device to landscape orientation to use the editor.").wrap().grow(); - }); - })); + })); + }); return b; } diff --git a/net/src/io/anuke/mindustry/net/ArcNetClient.java b/net/src/io/anuke/mindustry/net/ArcNetClient.java index af4ca06894..2739660e0e 100644 --- a/net/src/io/anuke/mindustry/net/ArcNetClient.java +++ b/net/src/io/anuke/mindustry/net/ArcNetClient.java @@ -8,7 +8,6 @@ import io.anuke.arc.util.async.*; import io.anuke.arc.util.pooling.*; import io.anuke.mindustry.net.Net.*; import io.anuke.mindustry.net.Packets.*; -import net.jpountz.lz4.*; import java.io.*; import java.net.*; @@ -20,7 +19,6 @@ import static io.anuke.mindustry.Vars.*; public class ArcNetClient implements ClientProvider{ final Client client; final Supplier packetSupplier = () -> new DatagramPacket(new byte[256], 256); - final LZ4FastDecompressor decompressor = LZ4Factory.fastestInstance().fastDecompressor(); public ArcNetClient(){ client = new Client(8192, 4096, new PacketSerializer()); @@ -75,14 +73,6 @@ public class ArcNetClient implements ClientProvider{ } } - - @Override - public byte[] decompressSnapshot(byte[] input, int size){ - byte[] result = new byte[size]; - decompressor.decompress(input, result); - return result; - } - @Override public void connect(String ip, int port, Runnable success){ Threads.daemon(() -> { @@ -90,17 +80,15 @@ public class ArcNetClient implements ClientProvider{ //just in case client.stop(); - Thread updateThread = new Thread(() -> { + Threads.daemon("Net Client", () -> { try{ client.run(); }catch(Exception e){ if(!(e instanceof ClosedSelectorException)) handleException(e); } - }, "Net Client"); - updateThread.setDaemon(true); - updateThread.start(); + }); - client.connect(5000, ip, port); + client.connect(5000, ip, port, port); success.run(); }catch(Exception e){ handleException(e); @@ -116,7 +104,11 @@ public class ArcNetClient implements ClientProvider{ @Override public void sendClient(Object object, SendMode mode){ try{ - client.sendTCP(object); + if(mode == SendMode.tcp){ + client.sendTCP(object); + }else{ + client.sendUDP(object); + } //sending things can cause an under/overflow, catch it and disconnect instead of crashing }catch(BufferOverflowException | BufferUnderflowException e){ Net.showError(e); @@ -194,4 +186,4 @@ public class ArcNetClient implements ClientProvider{ } } -} +} \ No newline at end of file diff --git a/net/src/io/anuke/mindustry/net/ArcNetServer.java b/net/src/io/anuke/mindustry/net/ArcNetServer.java index 70e56d54c5..d7198e1b1c 100644 --- a/net/src/io/anuke/mindustry/net/ArcNetServer.java +++ b/net/src/io/anuke/mindustry/net/ArcNetServer.java @@ -6,7 +6,6 @@ import io.anuke.arc.util.*; import io.anuke.arc.util.async.*; import io.anuke.mindustry.net.Net.*; import io.anuke.mindustry.net.Packets.*; -import net.jpountz.lz4.*; import java.io.*; import java.nio.*; @@ -18,7 +17,6 @@ import static io.anuke.mindustry.Vars.*; public class ArcNetServer implements ServerProvider{ final Server server; final CopyOnWriteArrayList connections = new CopyOnWriteArrayList<>(); - final LZ4Compressor compressor = LZ4Factory.fastestInstance().fastCompressor(); Thread serverThread; public ArcNetServer(){ @@ -87,11 +85,6 @@ public class ArcNetServer implements ServerProvider{ server.addListener(listener); } - @Override - public byte[] compressSnapshot(byte[] input){ - return compressor.compress(input); - } - @Override public Iterable getConnections(){ return connections; @@ -112,7 +105,7 @@ public class ArcNetServer implements ServerProvider{ @Override public void host(int port) throws IOException{ connections.clear(); - server.bind(port); + server.bind(port, port); serverThread = new Thread(() -> { try{ @@ -158,7 +151,11 @@ public class ArcNetServer implements ServerProvider{ @Override public void send(Object object, SendMode mode){ try{ - connection.sendTCP(object); + if(mode == SendMode.tcp){ + connection.sendTCP(object); + }else{ + connection.sendUDP(object); + } }catch(Exception e){ Log.err(e); Log.info("Error sending packet. Disconnecting invalid client!"); @@ -175,4 +172,4 @@ public class ArcNetServer implements ServerProvider{ } } -} +} \ No newline at end of file diff --git a/net/src/io/anuke/mindustry/net/PacketSerializer.java b/net/src/io/anuke/mindustry/net/PacketSerializer.java index e79d5457aa..a101af5145 100644 --- a/net/src/io/anuke/mindustry/net/PacketSerializer.java +++ b/net/src/io/anuke/mindustry/net/PacketSerializer.java @@ -1,12 +1,11 @@ package io.anuke.mindustry.net; -import io.anuke.arc.function.Supplier; -import io.anuke.arc.net.FrameworkMessage; +import io.anuke.arc.function.*; +import io.anuke.arc.net.*; import io.anuke.arc.net.FrameworkMessage.*; -import io.anuke.arc.net.NetSerializer; -import io.anuke.arc.util.pooling.Pools; +import io.anuke.arc.util.pooling.*; -import java.nio.ByteBuffer; +import java.nio.*; @SuppressWarnings("unchecked") public class PacketSerializer implements NetSerializer{ diff --git a/server/build.gradle b/server/build.gradle index 383ab91441..7b2fb63159 100644 --- a/server/build.gradle +++ b/server/build.gradle @@ -44,8 +44,6 @@ task dist(type: Jar){ exclude("icons/**") exclude("bundles/**") - writeVersion() - manifest{ attributes 'Main-Class': project.mainClassName } diff --git a/server/src/io/anuke/mindustry/server/MindustryServer.java b/server/src/io/anuke/mindustry/server/MindustryServer.java index 37f13187b6..5fc9eb39d5 100644 --- a/server/src/io/anuke/mindustry/server/MindustryServer.java +++ b/server/src/io/anuke/mindustry/server/MindustryServer.java @@ -1,11 +1,8 @@ package io.anuke.mindustry.server; -import io.anuke.arc.ApplicationListener; -import io.anuke.arc.Core; -import io.anuke.mindustry.Vars; +import io.anuke.arc.*; +import io.anuke.mindustry.*; import io.anuke.mindustry.core.*; -import io.anuke.mindustry.game.Content; -import io.anuke.mindustry.io.BundleLoader; import static io.anuke.mindustry.Vars.*; @@ -20,19 +17,15 @@ public class MindustryServer implements ApplicationListener{ public void init(){ Core.settings.setDataDirectory(Core.files.local("config")); loadLocales = false; - Vars.init(); - headless = true; - BundleLoader.load(); - content.verbose(false); - content.load(); + Vars.loadSettings(); + Vars.init(); + content.createContent(); + content.init(); Core.app.addListener(logic = new Logic()); - Core.app.addListener(world = new World()); Core.app.addListener(netServer = new NetServer()); Core.app.addListener(new ServerControl(args)); - - content.initialize(Content::init); } } diff --git a/server/src/io/anuke/mindustry/server/ServerControl.java b/server/src/io/anuke/mindustry/server/ServerControl.java index 42bc75d0ef..b97ff4c525 100644 --- a/server/src/io/anuke/mindustry/server/ServerControl.java +++ b/server/src/io/anuke/mindustry/server/ServerControl.java @@ -1,33 +1,35 @@ package io.anuke.mindustry.server; import io.anuke.arc.*; -import io.anuke.arc.collection.Array; -import io.anuke.arc.collection.Array.ArrayIterable; -import io.anuke.arc.collection.ObjectSet; -import io.anuke.arc.files.FileHandle; +import io.anuke.arc.collection.*; +import io.anuke.arc.collection.Array.*; +import io.anuke.arc.files.*; import io.anuke.arc.util.*; +import io.anuke.arc.util.Timer; import io.anuke.arc.util.CommandHandler.*; -import io.anuke.arc.util.Timer.Task; -import io.anuke.mindustry.core.GameState.State; -import io.anuke.mindustry.entities.Effects; -import io.anuke.mindustry.entities.type.Player; +import io.anuke.arc.util.Timer.*; +import io.anuke.mindustry.*; +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.GameOverEvent; -import io.anuke.mindustry.gen.Call; -import io.anuke.mindustry.io.SaveIO; +import io.anuke.mindustry.game.EventType.*; +import io.anuke.mindustry.gen.*; +import io.anuke.mindustry.io.*; import io.anuke.mindustry.maps.Map; -import io.anuke.mindustry.maps.MapException; -import io.anuke.mindustry.net.Administration.PlayerInfo; +import io.anuke.mindustry.maps.*; +import io.anuke.mindustry.net.Administration.*; import io.anuke.mindustry.net.Net; -import io.anuke.mindustry.net.Packets.KickReason; -import io.anuke.mindustry.type.Item; -import io.anuke.mindustry.type.ItemType; +import io.anuke.mindustry.net.Packets.*; +import io.anuke.mindustry.plugin.Plugins; +import io.anuke.mindustry.plugin.Plugins.*; +import io.anuke.mindustry.type.*; import java.io.*; import java.net.*; -import java.time.LocalDateTime; -import java.time.format.DateTimeFormatter; -import java.util.Scanner; +import java.time.*; +import java.time.format.*; +import java.util.*; import static io.anuke.arc.util.Log.*; import static io.anuke.mindustry.Vars.*; @@ -40,6 +42,7 @@ public class ServerControl implements ApplicationListener{ private final CommandHandler handler = new CommandHandler(""); private final FileHandle logFolder = Core.files.local("logs/"); + private final io.anuke.mindustry.plugin.Plugins plugins = new Plugins(); private FileHandle currentLogFile; private boolean inExtraRound; @@ -107,6 +110,9 @@ public class ServerControl implements ApplicationListener{ Effects.setScreenShakeProvider((a, b) -> {}); Effects.setEffectProvider((a, b, c, d, e, f) -> {}); + //load plugins + plugins.load(); + registerCommands(); Core.app.post(() -> { @@ -118,7 +124,7 @@ public class ServerControl implements ApplicationListener{ } for(String s : commands){ - Response response = handler.handleMessage(s); + CommandResponse response = handler.handleMessage(s); if(response.type != ResponseType.valid){ err("Invalid command argument sent: '{0}': {1}", s, response.type.name()); err("Argument usage: &lc , "); @@ -128,6 +134,7 @@ public class ServerControl implements ApplicationListener{ }); customMapDirectory.mkdirs(); + pluginDirectory.mkdirs(); Thread thread = new Thread(this::readCommands, "Server Controls"); thread.setDaemon(true); @@ -143,8 +150,8 @@ public class ServerControl implements ApplicationListener{ info("Game over!"); if(Core.settings.getBool("shuffle")){ - if(world.maps.all().size > 0){ - Array maps = world.maps.customMaps().size == 0 ? world.maps.defaultMaps() : world.maps.customMaps(); + if(maps.all().size > 0){ + Array maps = Vars.maps.customMaps().size == 0 ? Vars.maps.defaultMaps() : Vars.maps.customMaps(); Map previous = world.getMap(); Map map = maps.random(previous); @@ -166,6 +173,13 @@ public class ServerControl implements ApplicationListener{ } }); + //initialize plugins + plugins.each(io.anuke.mindustry.plugin.Plugin::init); + + if(!plugins.all().isEmpty()){ + info("&lc{0} plugins loaded.", plugins.all().size); + } + info("&lcServer loaded. Type &ly'help'&lc for help."); System.out.print("> "); @@ -208,7 +222,7 @@ public class ServerControl implements ApplicationListener{ if(lastTask != null) lastTask.cancel(); - Map result = world.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]); @@ -259,9 +273,9 @@ public class ServerControl implements ApplicationListener{ }); handler.register("maps", "Display all available maps.", arg -> { - if(!world.maps.all().isEmpty()){ + if(!maps.all().isEmpty()){ info("Maps:"); - for(Map map : world.maps.all()){ + for(Map map : maps.all()){ info(" &ly{0}: &lb&fi{1} / {2}x{3}", map.name(), map.custom ? "Custom" : "Default", map.width, map.height); } }else{ @@ -271,10 +285,10 @@ public class ServerControl implements ApplicationListener{ }); handler.register("reloadmaps", "Reload all maps from disk.", arg -> { - int beforeMaps = world.maps.all().size; - world.maps.reload(); - if(world.maps.all().size > beforeMaps){ - info("&lc{0}&ly new map(s) found and reloaded.", world.maps.all().size - beforeMaps); + int beforeMaps = maps.all().size; + maps.reload(); + if(maps.all().size > beforeMaps){ + info("&lc{0}&ly new map(s) found and reloaded.", maps.all().size - beforeMaps); }else{ info("&lyMaps reloaded."); } @@ -306,6 +320,31 @@ public class ServerControl implements ApplicationListener{ } }); + handler.register("plugins", "Display all loaded plugins.", arg -> { + if(!plugins.all().isEmpty()){ + info("Plugins:"); + for(LoadedPlugin plugin : plugins.all()){ + info(" &ly{0} &lcv{1}", plugin.meta.name, plugin.meta.version); + } + }else{ + info("No plugins found."); + } + info("&lyPlugin directory: &lb&fi{0}", pluginDirectory.file().getAbsoluteFile().toString()); + }); + + handler.register("plugin", "", "Display information about a loaded plugin.", arg -> { + LoadedPlugin plugin = plugins.all().find(p -> p.meta.name.equalsIgnoreCase(arg[0])); + if(plugin != null){ + info("Name: &ly{0}", plugin.meta.name); + info("Version: &ly{0}", plugin.meta.version); + info("Author: &ly{0}", plugin.meta.author); + info("Path: &ly{0}", plugin.jarFile.path()); + info("Description: &ly{0}", plugin.meta.description); + }else{ + info("No plugin with name &ly'{0}'&lg found."); + } + }); + handler.register("say", "", "Send a message to all players.", arg -> { if(!state.is(State.playing)){ err("Not hosting. Host a game first."); @@ -643,6 +682,16 @@ public class ServerControl implements ApplicationListener{ info("Nobody with that name could be found."); } }); + + handler.register("gc", "Trigger a grabage collection. Testing only.", arg -> { + int pre = (int)(Core.app.getJavaHeap() / 1024 / 1024); + System.gc(); + int post = (int)(Core.app.getJavaHeap() / 1024 / 1024); + info("&ly{0}&lg MB collected. Memory usage now at &ly{1}&lg MB.", pre - post, post); + }); + + plugins.each(p -> p.registerServerCommands(handler)); + plugins.each(p -> p.registerClientCommands(netServer.clientCommands)); } private void readCommands(){ @@ -655,7 +704,7 @@ public class ServerControl implements ApplicationListener{ } private void handleCommandString(String line){ - Response response = handler.handleMessage(line); + CommandResponse response = handler.handleMessage(line); if(response.type == ResponseType.unknownCommand){ diff --git a/settings.gradle b/settings.gradle index 41b5080058..0d91e99761 100644 --- a/settings.gradle +++ b/settings.gradle @@ -5,9 +5,9 @@ def use = { String name -> project(name).projectDir = new File(settingsDir, "../${name.substring(1).replace(":", "/")}") } -Properties properties = new Properties() +def properties = new Properties() -if(new File(settingsDir, 'local.properties').exists()){ +if(new File(settingsDir, 'local.properties').exists() && System.getenv("JITPACK") != "true"){ properties.load(new File(settingsDir, 'local.properties').newDataInputStream()) if(properties.containsKey("sdk.dir")){ diff --git a/tests/src/test/java/ApplicationTests.java b/tests/src/test/java/ApplicationTests.java index 320d121d19..6661a11769 100644 --- a/tests/src/test/java/ApplicationTests.java +++ b/tests/src/test/java/ApplicationTests.java @@ -11,9 +11,7 @@ import io.anuke.mindustry.core.*; import io.anuke.mindustry.entities.traits.BuilderTrait.BuildRequest; import io.anuke.mindustry.entities.type.BaseUnit; import io.anuke.mindustry.entities.type.base.*; -import io.anuke.mindustry.game.Content; import io.anuke.mindustry.game.Team; -import io.anuke.mindustry.io.BundleLoader; import io.anuke.mindustry.io.SaveIO; import io.anuke.mindustry.maps.Map; import io.anuke.mindustry.type.ContentType; @@ -43,25 +41,21 @@ public class ApplicationTests{ ApplicationCore core = new ApplicationCore(){ @Override public void setup(){ - Vars.init(); - headless = true; - - BundleLoader.load(); - content.load(); + Vars.init(); + content.createContent(); add(logic = new Logic()); - add(world = new World()); add(netServer = new NetServer()); - content.initialize(Content::init); + content.init(); } @Override public void init(){ super.init(); begins[0] = true; - testMap = world.maps.loadInternalMap("groundZero"); + testMap = maps.loadInternalMap("groundZero"); } }; @@ -100,7 +94,7 @@ public class ApplicationTests{ @Test void spawnWaves(){ world.loadMap(testMap); - assertTrue(world.spawner.countSpawns() > 0, "No spawns present."); + assertTrue(spawner.countSpawns() > 0, "No spawns present."); logic.runWave(); //force trigger delayed spawns Time.setDeltaProvider(() -> 1000f); diff --git a/tests/src/test/java/WorldTests.java b/tests/src/test/java/WorldTests.java deleted file mode 100644 index 5809b24c20..0000000000 --- a/tests/src/test/java/WorldTests.java +++ /dev/null @@ -1,112 +0,0 @@ -import io.anuke.arc.util.Time; -import io.anuke.mindustry.content.Blocks; -import io.anuke.mindustry.core.GameState.State; -import io.anuke.mindustry.world.Tile; -import org.junit.jupiter.api.*; - -import static io.anuke.mindustry.Vars.*; -import static org.junit.jupiter.api.Assertions.assertEquals; - -public class WorldTests{ - static Tile[][] tiles; - - @BeforeAll - static void launchApplication(){ - ApplicationTests.launchApplication(); - world.createTiles(10, 10); - tiles = world.getTiles(); - } - - @BeforeEach - void resetWorld(){ - Time.setDeltaProvider(() -> 1f); - logic.reset(); - state.set(State.menu); - } - - @Test - void addDarknessAllSolidMaxDarkness(){ - fillWith(Blocks.rocks.id); - world.addDarkness(tiles); - - for(int x = 0; x < tiles.length; x++){ - for(int y = 0; y < tiles[0].length; y++){ - assertEquals(4, tiles[x][y].rotation()); - } - } - } - - @Test - void addDarknessAllSyntethicNoDarkness(){ - fillWith(Blocks.copperWall.id); - world.addDarkness(tiles); - - for(int x = 0; x < tiles.length; x++){ - for(int y = 0; y < tiles[0].length; y++){ - assertEquals(0, tiles[x][y].rotation()); - } - } - } - - @Test - void addDarknessAllNotSolidNoDarkness(){ - fillWith(Blocks.air.id); - world.addDarkness(tiles); - - for(int x = 0; x < tiles.length; x++){ - for(int y = 0; y < tiles[0].length; y++){ - assertEquals(0, tiles[x][y].rotation()); - } - } - } - - @Test - void addDarknessAllNotFilledNoDarkness(){ - fillWith(Blocks.cliffs.id); - world.addDarkness(tiles); - - for(int x = 0; x < tiles.length; x++){ - for(int y = 0; y < tiles[0].length; y++){ - assertEquals(0, tiles[x][y].rotation()); - } - } - } - - private static void fillWith(short tileID){ - for(int x = 0; x < tiles.length; x++){ - for(int y = 0; y < tiles[0].length; y++){ - tiles[x][y] = new Tile(x, y, (short)0, (short)0, tileID); - } - } - } - - @Test - void addDarknessOneNotSolidMiddleNoDarkness(){ - fillWith(Blocks.rocks.id); - tiles[5][5] = new Tile(5, 5, (byte)0, (byte)0, Blocks.copperWall.id); - world.addDarkness(tiles); - - for(int x = 0; x < tiles.length; x++){ - for(int y = 0; y < tiles[0].length; y++){ - byte darkness = tiles[x][y].rotation(); - int distance = Math.abs(x - 5) + Math.abs(y - 5); - assertEquals(Math.min(Math.max(distance - 1, 0), 4), darkness); - } - } - } - - @Test - void addDarknessOneNotSolidCornerNoDarkness(){ - fillWith(Blocks.rocks.id); - tiles[7][7] = new Tile(5, 5, (byte)0, (byte)0, Blocks.copperWall.id); - world.addDarkness(tiles); - - for(int x = 0; x < tiles.length; x++){ - for(int y = 0; y < tiles[0].length; y++){ - byte darkness = tiles[x][y].rotation(); - int distance = Math.abs(x - 7) + Math.abs(y - 7); - assertEquals(Math.min(Math.max(distance - 1, 0), 4), darkness); - } - } - } -} diff --git a/tests/src/test/java/ZoneTests.java b/tests/src/test/java/ZoneTests.java index 8ad2a2f6fe..f86cf714a2 100644 --- a/tests/src/test/java/ZoneTests.java +++ b/tests/src/test/java/ZoneTests.java @@ -65,7 +65,7 @@ public class ZoneTests{ } assertTrue(hasSpawnPoint, "Zone \"" + zone.name + "\" has no spawn points."); - assertTrue(world.spawner.countSpawns() > 0 || (state.rules.attackMode && !state.teams.get(waveTeam).cores.isEmpty()), "Zone \"" + zone.name + "\" has no enemy spawn points: " + world.spawner.countSpawns()); + assertTrue(spawner.countSpawns() > 0 || (state.rules.attackMode && !state.teams.get(waveTeam).cores.isEmpty()), "Zone \"" + zone.name + "\" has no enemy spawn points: " + spawner.countSpawns()); for(Item item : resources){ assertTrue(Structs.contains(zone.resources, item), "Zone \"" + zone.name + "\" is missing item in resource list: \"" + item.name + "\""); diff --git a/tests/src/test/java/power/PowerTestFixture.java b/tests/src/test/java/power/PowerTestFixture.java index c7f8f0f355..8afe8115e2 100644 --- a/tests/src/test/java/power/PowerTestFixture.java +++ b/tests/src/test/java/power/PowerTestFixture.java @@ -1,21 +1,19 @@ package power; -import io.anuke.arc.Core; -import io.anuke.arc.math.Mathf; -import io.anuke.arc.util.Log; -import io.anuke.arc.util.Time; -import io.anuke.mindustry.Vars; -import io.anuke.mindustry.content.Blocks; -import io.anuke.mindustry.core.ContentLoader; -import io.anuke.mindustry.world.Block; -import io.anuke.mindustry.world.Tile; -import io.anuke.mindustry.world.blocks.PowerBlock; -import io.anuke.mindustry.world.blocks.power.Battery; -import io.anuke.mindustry.world.blocks.power.PowerGenerator; +import io.anuke.arc.*; +import io.anuke.arc.util.*; +import io.anuke.mindustry.*; +import io.anuke.mindustry.content.*; +import io.anuke.mindustry.core.*; +import io.anuke.mindustry.world.*; +import io.anuke.mindustry.world.blocks.*; +import io.anuke.mindustry.world.blocks.power.*; import io.anuke.mindustry.world.modules.*; -import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.*; -import java.lang.reflect.Field; +import java.lang.reflect.*; + +import static io.anuke.mindustry.Vars.content; /** * This class provides objects commonly used by power related unit tests. @@ -24,15 +22,12 @@ import java.lang.reflect.Field; * Note: All tests which subclass this will run with a fixed delta of 0.5! */ public class PowerTestFixture{ - public static final float smallRoundingTolerance = Mathf.FLOAT_ROUNDING_ERROR; - public static final float mediumRoundingTolerance = Mathf.FLOAT_ROUNDING_ERROR * 10; - public static final float highRoundingTolerance = Mathf.FLOAT_ROUNDING_ERROR * 100; @BeforeAll static void initializeDependencies(){ Core.graphics = new FakeGraphics(); Vars.content = new ContentLoader(); - Vars.content.load(); + content.createContent(); Log.setUseColors(false); Time.setDeltaProvider(() -> 0.5f); } diff --git a/tests/src/test/java/power/PowerTests.java b/tests/src/test/java/power/PowerTests.java index 0b9ea6cb23..e9da0784ba 100644 --- a/tests/src/test/java/power/PowerTests.java +++ b/tests/src/test/java/power/PowerTests.java @@ -2,7 +2,7 @@ package power; import io.anuke.arc.Core; import io.anuke.arc.math.Mathf; -import io.anuke.arc.util.Time; +import io.anuke.arc.util.*; import io.anuke.mindustry.world.Tile; import io.anuke.mindustry.world.blocks.power.PowerGenerator; import io.anuke.mindustry.world.blocks.power.PowerGraph; @@ -84,7 +84,7 @@ public class PowerTests extends PowerTestFixture{ dynamicTest("06", () -> simulateDirectConsumptionWithBattery(0.0f, 10.0f, 0.0f, 0.0f, 0.0f, "No producer, empty battery")), dynamicTest("07", () -> simulateDirectConsumptionWithBattery(0.0f, 10.0f, 100.0f, 95.0f, 1.0f, "No producer, full battery")), dynamicTest("08", () -> simulateDirectConsumptionWithBattery(0.0f, 10.0f, 2.5f, 0.0f, 0.5f, "No producer, low battery")), - dynamicTest("09", () -> simulateDirectConsumptionWithBattery(5.0f, 10.0f, 5.0f, 0.0f, 1.0f, "Producer + Battery = Consumed")), + dynamicTest("09", () -> simulateDirectConsumptionWithBattery(5.0f, 10.0f, 5.0f, 2.5f, 1.0f, "Producer + Battery = Consumed")), }; } diff --git a/tools/build.gradle b/tools/build.gradle index f1c6ccbb9e..c1ab47a151 100644 --- a/tools/build.gradle +++ b/tools/build.gradle @@ -320,7 +320,7 @@ task pack(dependsOn: classes){ //antialias everything except UI elements fileTree(dir: '../core/assets-raw/sprites_out/', include: "**/*.png").visit{ file -> - if(file.isDirectory() || (file.toString().replace("\\", "/").contains("/ui/") && !file.toString().contains("icon-small") && !file.toString().contains("icon-medium") && !file.toString().contains("icon-large"))) return + if(file.isDirectory() || file.toString().replace("\\", "/").contains("zones/") || (file.toString().replace("\\", "/").contains("/ui/") && !file.toString().contains("icon-small") && !file.toString().contains("icon-medium") && !file.toString().contains("icon-large"))) return antialias(file.file) } diff --git a/tools/src/io/anuke/mindustry/ImagePacker.java b/tools/src/io/anuke/mindustry/ImagePacker.java index 119e4d217e..200da5c602 100644 --- a/tools/src/io/anuke/mindustry/ImagePacker.java +++ b/tools/src/io/anuke/mindustry/ImagePacker.java @@ -23,7 +23,7 @@ public class ImagePacker{ Log.setLogger(new NoopLogHandler()); Vars.content = new ContentLoader(); - Vars.content.load(); + Vars.content.createContent(); Log.setLogger(new LogHandler()); Files.walk(Paths.get("../../../assets-raw/sprites_out")).forEach(path -> {